eal: hide shared memory config
authorAnatoly Burakov <anatoly.burakov@intel.com>
Fri, 5 Jul 2019 13:10:30 +0000 (14:10 +0100)
committerThomas Monjalon <thomas@monjalon.net>
Sat, 6 Jul 2019 08:32:34 +0000 (10:32 +0200)
Now that everything that has ever accessed the shared memory
config is doing so through the public API's, we can make it
internal. Since we're removing quite a few headers from
rte_eal_memconfig.h, we need to add them back in places
where this header is used.

This bumps the ABI, so also change all build files and make
update documentation.

Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
Acked-by: David Marchand <david.marchand@redhat.com>
42 files changed:
app/test/test_fbarray.c
app/test/test_memzone.c
app/test/test_tailq.c
doc/guides/rel_notes/deprecation.rst
doc/guides/rel_notes/release_19_08.rst
drivers/bus/pci/linux/pci_vfio.c
drivers/net/mlx4/mlx4.c
drivers/net/mlx4/mlx4_rxtx.c
drivers/net/mlx5/mlx5.h
drivers/net/mlx5/mlx5_ethdev.c
lib/librte_acl/rte_acl.c
lib/librte_distributor/rte_distributor.c
lib/librte_distributor/rte_distributor_v20.c
lib/librte_eal/common/eal_common_mcfg.c
lib/librte_eal/common/eal_common_memory.c
lib/librte_eal/common/eal_common_memzone.c
lib/librte_eal/common/eal_common_tailqs.c
lib/librte_eal/common/eal_memcfg.h [new file with mode: 0644]
lib/librte_eal/common/include/rte_eal_memconfig.h
lib/librte_eal/common/include/rte_fbarray.h
lib/librte_eal/common/include/rte_memory.h
lib/librte_eal/common/malloc_heap.c
lib/librte_eal/common/malloc_mp.c
lib/librte_eal/common/rte_malloc.c
lib/librte_eal/freebsd/eal/Makefile
lib/librte_eal/freebsd/eal/eal_memory.c
lib/librte_eal/linux/eal/Makefile
lib/librte_eal/linux/eal/eal.c
lib/librte_eal/linux/eal/eal_memalloc.c
lib/librte_eal/linux/eal/eal_memory.c
lib/librte_eal/linux/eal/eal_vfio.c
lib/librte_eal/meson.build
lib/librte_efd/rte_efd.c
lib/librte_hash/rte_cuckoo_hash.c
lib/librte_hash/rte_fbk_hash.c
lib/librte_lpm/rte_lpm.c
lib/librte_lpm/rte_lpm6.c
lib/librte_member/rte_member.c
lib/librte_mempool/rte_mempool.c
lib/librte_rcu/rte_rcu_qsbr.h
lib/librte_reorder/rte_reorder.c
lib/librte_ring/rte_ring.c

index d2b0418..a691bf4 100644 (file)
@@ -2,6 +2,7 @@
  * Copyright(c) 2010-2014 Intel Corporation
  */
 
+#include <stdbool.h>
 #include <stdio.h>
 #include <stdint.h>
 #include <limits.h>
index 9fe465e..7501b63 100644 (file)
@@ -19,6 +19,7 @@
 #include <rte_errno.h>
 #include <rte_malloc.h>
 #include "../../lib/librte_eal/common/malloc_elem.h"
+#include "../../lib/librte_eal/common/eal_memcfg.h"
 
 #include "test.h"
 
index a4ecea2..7c9b69f 100644 (file)
@@ -12,6 +12,7 @@
 #include <rte_eal.h>
 #include <rte_eal_memconfig.h>
 #include <rte_string_fns.h>
+#include <rte_tailq.h>
 
 #include "test.h"
 
index e2721fa..583217d 100644 (file)
@@ -23,9 +23,6 @@ Deprecation Notices
 * eal: The function ``rte_eal_remote_launch`` will return new error codes
   after read or write error on the pipe, instead of calling ``rte_panic``.
 
-* eal: the ``rte_mem_config`` struct will be made private to remove it from the
-  externally visible ABI and allow it to be updated in the future.
-
 * eal: both declaring and identifying devices will be streamlined in v18.11.
   New functions will appear to query a specific port from buses, classes of
   device and device drivers. Device declaration will be made coherent with the
index 8cd90e0..0c4c3b3 100644 (file)
@@ -178,6 +178,10 @@ API Changes
    Also, make sure to start the actual text at the margin.
    =========================================================
 
+* The ``rte_mem_config`` structure has been made private. The new accessor
+  ``rte_mcfg_*`` functions were introduced to provide replacement for direct
+  access to the shared mem config.
+
 * The network structures, definitions and functions have
   been prefixed by ``rte_`` to resolve conflicts with libc headers.
 
@@ -252,7 +256,7 @@ The libraries prepended with a plus sign were incremented in this version.
      librte_compressdev.so.1
      librte_cryptodev.so.7
      librte_distributor.so.1
-     librte_eal.so.10
+   + librte_eal.so.11
      librte_efd.so.1
      librte_ethdev.so.12
    + librte_eventdev.so.7
index ebf6ccd..1ceb1c0 100644 (file)
@@ -20,6 +20,7 @@
 #include <rte_eal.h>
 #include <rte_bus.h>
 #include <rte_spinlock.h>
+#include <rte_tailq.h>
 
 #include "eal_filesystem.h"
 
index aa4d43f..2e169b0 100644 (file)
@@ -715,7 +715,7 @@ mlx4_init_once(void)
                ret = mlx4_mp_init_primary();
                if (ret)
                        goto out;
-               sd->init_done = true;
+               sd->init_done = 1;
                break;
        case RTE_PROC_SECONDARY:
                if (ld->init_done)
@@ -724,7 +724,7 @@ mlx4_init_once(void)
                if (ret)
                        goto out;
                ++sd->secondary_cnt;
-               ld->init_done = true;
+               ld->init_done = 1;
                break;
        default:
                break;
index a941a8a..4dc0adb 100644 (file)
@@ -9,6 +9,7 @@
  */
 
 #include <assert.h>
+#include <stdbool.h>
 #include <stdint.h>
 #include <string.h>
 
index a3689c8..aa88464 100644 (file)
@@ -7,6 +7,7 @@
 #define RTE_PMD_MLX5_H_
 
 #include <stddef.h>
+#include <stdbool.h>
 #include <stdint.h>
 #include <limits.h>
 #include <net/if.h>
index 26a1a3a..0c7162d 100644 (file)
@@ -7,6 +7,7 @@
 #include <assert.h>
 #include <inttypes.h>
 #include <unistd.h>
+#include <stdbool.h>
 #include <stdint.h>
 #include <stdio.h>
 #include <string.h>
index 7ff11d2..bd7247c 100644 (file)
@@ -4,6 +4,8 @@
 
 #include <rte_string_fns.h>
 #include <rte_acl.h>
+#include <rte_tailq.h>
+
 #include "acl.h"
 
 TAILQ_HEAD(rte_acl_list, rte_tailq_entry);
index 9eb78b3..0a3213b 100644 (file)
@@ -14,6 +14,7 @@
 #include <rte_string_fns.h>
 #include <rte_eal_memconfig.h>
 #include <rte_pause.h>
+#include <rte_tailq.h>
 
 #include "rte_distributor_private.h"
 #include "rte_distributor.h"
index 1fc03b9..cdc0969 100644 (file)
@@ -13,6 +13,7 @@
 #include <rte_string_fns.h>
 #include <rte_eal_memconfig.h>
 #include <rte_pause.h>
+#include <rte_tailq.h>
 
 #include "rte_distributor_v20.h"
 #include "rte_distributor_private.h"
index ba2bc37..337890a 100644 (file)
@@ -5,6 +5,8 @@
 #include <rte_config.h>
 #include <rte_eal_memconfig.h>
 
+#include "eal_memcfg.h"
+
 void
 rte_mcfg_mem_read_lock(void)
 {
index fe22b13..19ea475 100644 (file)
@@ -24,6 +24,7 @@
 #include "eal_memalloc.h"
 #include "eal_private.h"
 #include "eal_internal_cfg.h"
+#include "eal_memcfg.h"
 #include "malloc_heap.h"
 
 /*
index 521ad7c..ef6c909 100644 (file)
@@ -24,6 +24,7 @@
 #include "malloc_heap.h"
 #include "malloc_elem.h"
 #include "eal_private.h"
+#include "eal_memcfg.h"
 
 static inline const struct rte_memzone *
 memzone_lookup_thread_unsafe(const char *name)
index dc2c13c..ead0689 100644 (file)
@@ -23,6 +23,7 @@
 #include <rte_debug.h>
 
 #include "eal_private.h"
+#include "eal_memcfg.h"
 
 TAILQ_HEAD(rte_tailq_elem_head, rte_tailq_elem);
 /* local tailq list */
diff --git a/lib/librte_eal/common/eal_memcfg.h b/lib/librte_eal/common/eal_memcfg.h
new file mode 100644 (file)
index 0000000..74f6159
--- /dev/null
@@ -0,0 +1,80 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2019 Intel Corporation
+ */
+
+#ifndef EAL_MEMCFG_H
+#define EAL_MEMCFG_H
+
+#include <rte_config.h>
+#include <rte_eal_memconfig.h>
+#include <rte_malloc_heap.h>
+#include <rte_memory.h>
+#include <rte_memzone.h>
+#include <rte_pause.h>
+#include <rte_rwlock.h>
+#include <rte_tailq.h>
+
+/**
+ * Memory configuration shared across multiple processes.
+ */
+struct rte_mem_config {
+       volatile uint32_t magic;   /**< Magic number - sanity check. */
+
+       /* memory topology */
+       uint32_t nchannel;    /**< Number of channels (0 if unknown). */
+       uint32_t nrank;       /**< Number of ranks (0 if unknown). */
+
+       /**
+        * current lock nest order
+        *  - qlock->mlock (ring/hash/lpm)
+        *  - mplock->qlock->mlock (mempool)
+        * Notice:
+        *  *ALWAYS* obtain qlock first if having to obtain both qlock and mlock
+        */
+       rte_rwlock_t mlock;   /**< used by memzones for thread safety. */
+       rte_rwlock_t qlock;   /**< used by tailqs for thread safety. */
+       rte_rwlock_t mplock;  /**< used by mempool library for thread safety. */
+
+       rte_rwlock_t memory_hotplug_lock;
+       /**< Indicates whether memory hotplug request is in progress. */
+
+       /* memory segments and zones */
+       struct rte_fbarray memzones; /**< Memzone descriptors. */
+
+       struct rte_memseg_list memsegs[RTE_MAX_MEMSEG_LISTS];
+       /**< List of dynamic arrays holding memsegs */
+
+       struct rte_tailq_head tailq_head[RTE_MAX_TAILQ];
+       /**< Tailqs for objects */
+
+       struct malloc_heap malloc_heaps[RTE_MAX_HEAPS];
+       /**< DPDK malloc heaps */
+
+       int next_socket_id; /**< Next socket ID for external malloc heap */
+
+       /* rte_mem_config has to be mapped at the exact same address in all
+        * processes, so we need to store it.
+        */
+       uint64_t mem_cfg_addr; /**< Address of this structure in memory. */
+
+       /* Primary and secondary processes cannot run with different legacy or
+        * single file segments options, so to avoid having to specify these
+        * options to all processes, store them in shared config and update the
+        * internal config at init time.
+        */
+       uint32_t legacy_mem; /**< stored legacy mem parameter. */
+       uint32_t single_file_segments;
+       /**< stored single file segments parameter. */
+
+       uint8_t dma_maskbits; /**< Keeps the more restricted dma mask. */
+} __attribute__((packed));
+
+static inline void
+rte_eal_mcfg_wait_complete(struct rte_mem_config *mcfg)
+{
+       /* wait until shared mem_config finish initialising */
+       while (mcfg->magic != RTE_MAGIC)
+               rte_pause();
+}
+
+#endif /* EAL_MEMCFG_H */
index 58dcbb9..dc61a6f 100644 (file)
 #ifndef _RTE_EAL_MEMCONFIG_H_
 #define _RTE_EAL_MEMCONFIG_H_
 
-#include <rte_config.h>
-#include <rte_tailq.h>
-#include <rte_memory.h>
-#include <rte_memzone.h>
-#include <rte_malloc_heap.h>
-#include <rte_rwlock.h>
-#include <rte_pause.h>
-#include <rte_fbarray.h>
+/**
+ * @file
+ *
+ * This API allows access to EAL shared memory configuration through an API.
+ */
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-/**
- * memseg list is a special case as we need to store a bunch of other data
- * together with the array itself.
- */
-struct rte_memseg_list {
-       RTE_STD_C11
-       union {
-               void *base_va;
-               /**< Base virtual address for this memseg list. */
-               uint64_t addr_64;
-               /**< Makes sure addr is always 64-bits */
-       };
-       uint64_t page_sz; /**< Page size for all memsegs in this list. */
-       int socket_id; /**< Socket ID for all memsegs in this list. */
-       volatile uint32_t version; /**< version number for multiprocess sync. */
-       size_t len; /**< Length of memory area covered by this memseg list. */
-       unsigned int external; /**< 1 if this list points to external memory */
-       struct rte_fbarray memseg_arr;
-};
-
-/**
- * the structure for the memory configuration for the RTE.
- * Used by the rte_config structure. It is separated out, as for multi-process
- * support, the memory details should be shared across instances
- */
-struct rte_mem_config {
-       volatile uint32_t magic;   /**< Magic number - Sanity check. */
-
-       /* memory topology */
-       uint32_t nchannel;    /**< Number of channels (0 if unknown). */
-       uint32_t nrank;       /**< Number of ranks (0 if unknown). */
-
-       /**
-        * current lock nest order
-        *  - qlock->mlock (ring/hash/lpm)
-        *  - mplock->qlock->mlock (mempool)
-        * Notice:
-        *  *ALWAYS* obtain qlock first if having to obtain both qlock and mlock
-        */
-       rte_rwlock_t mlock;   /**< only used by memzone LIB for thread-safe. */
-       rte_rwlock_t qlock;   /**< used for tailq operation for thread safe. */
-       rte_rwlock_t mplock;  /**< only used by mempool LIB for thread-safe. */
-
-       rte_rwlock_t memory_hotplug_lock;
-       /**< indicates whether memory hotplug request is in progress. */
-
-       /* memory segments and zones */
-       struct rte_fbarray memzones; /**< Memzone descriptors. */
-
-       struct rte_memseg_list memsegs[RTE_MAX_MEMSEG_LISTS];
-       /**< list of dynamic arrays holding memsegs */
-
-       struct rte_tailq_head tailq_head[RTE_MAX_TAILQ]; /**< Tailqs for objects */
-
-       /* Heaps of Malloc */
-       struct malloc_heap malloc_heaps[RTE_MAX_HEAPS];
-
-       /* next socket ID for external malloc heap */
-       int next_socket_id;
-
-       /* address of mem_config in primary process. used to map shared config into
-        * exact same address the primary process maps it.
-        */
-       uint64_t mem_cfg_addr;
-
-       /* legacy mem and single file segments options are shared */
-       uint32_t legacy_mem;
-       uint32_t single_file_segments;
-
-       /* keeps the more restricted dma mask */
-       uint8_t dma_maskbits;
-} __attribute__((__packed__));
-
-
-inline static void
-rte_eal_mcfg_wait_complete(struct rte_mem_config* mcfg)
-{
-       /* wait until shared mem_config finish initialising */
-       while(mcfg->magic != RTE_MAGIC)
-               rte_pause();
-}
-
 /**
  * Lock the internal EAL shared memory configuration for shared access.
  */
index d0af2d8..6dccdbe 100644 (file)
@@ -34,7 +34,6 @@
 extern "C" {
 #endif
 
-#include <stdbool.h>
 #include <stdio.h>
 
 #include <rte_compat.h>
index 870288a..4717dcb 100644 (file)
@@ -22,9 +22,7 @@ extern "C" {
 #include <rte_common.h>
 #include <rte_compat.h>
 #include <rte_config.h>
-
-/* forward declaration for pointers */
-struct rte_memseg_list;
+#include <rte_fbarray.h>
 
 __extension__
 enum rte_page_sizes {
@@ -104,6 +102,26 @@ struct rte_memseg {
        uint32_t flags;             /**< Memseg-specific flags */
 } __rte_packed;
 
+/**
+ * memseg list is a special case as we need to store a bunch of other data
+ * together with the array itself.
+ */
+struct rte_memseg_list {
+       RTE_STD_C11
+       union {
+               void *base_va;
+               /**< Base virtual address for this memseg list. */
+               uint64_t addr_64;
+               /**< Makes sure addr is always 64-bits */
+       };
+       uint64_t page_sz; /**< Page size for all memsegs in this list. */
+       int socket_id; /**< Socket ID for all memsegs in this list. */
+       volatile uint32_t version; /**< version number for multiprocess sync. */
+       size_t len; /**< Length of memory area covered by this memseg list. */
+       unsigned int external; /**< 1 if this list points to external memory */
+       struct rte_fbarray memseg_arr;
+};
+
 /**
  * Lock page in physical memory and prevent from swapping.
  *
index f1d31de..634ca21 100644 (file)
 #include <rte_string_fns.h>
 #include <rte_spinlock.h>
 #include <rte_memcpy.h>
+#include <rte_memzone.h>
 #include <rte_atomic.h>
 #include <rte_fbarray.h>
 
 #include "eal_internal_cfg.h"
 #include "eal_memalloc.h"
+#include "eal_memcfg.h"
 #include "malloc_elem.h"
 #include "malloc_heap.h"
 #include "malloc_mp.h"
index 7c6112c..1f212f8 100644 (file)
@@ -10,6 +10,7 @@
 #include <rte_string_fns.h>
 
 #include "eal_memalloc.h"
+#include "eal_memcfg.h"
 
 #include "malloc_elem.h"
 #include "malloc_mp.h"
index 2cad7be..fecd9a9 100644 (file)
@@ -25,6 +25,7 @@
 #include "malloc_elem.h"
 #include "malloc_heap.h"
 #include "eal_memalloc.h"
+#include "eal_memcfg.h"
 
 
 /* Free the memory space back to heap */
index eb92127..89131ea 100644 (file)
@@ -22,7 +22,7 @@ LDLIBS += -lrte_kvargs
 
 EXPORT_MAP := ../../rte_eal_version.map
 
-LIBABIVER := 10
+LIBABIVER := 11
 
 # specific to freebsd exec-env
 SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) := eal.c
index 4b092e1..9b9a057 100644 (file)
@@ -18,6 +18,7 @@
 #include "eal_private.h"
 #include "eal_internal_cfg.h"
 #include "eal_filesystem.h"
+#include "eal_memcfg.h"
 
 #define EAL_PAGE_SIZE (sysconf(_SC_PAGESIZE))
 
index dfe8e9a..0f5725e 100644 (file)
@@ -10,7 +10,7 @@ ARCH_DIR ?= $(RTE_ARCH)
 EXPORT_MAP := ../../rte_eal_version.map
 VPATH += $(RTE_SDK)/lib/librte_eal/common/arch/$(ARCH_DIR)
 
-LIBABIVER := 10
+LIBABIVER := 11
 
 VPATH += $(RTE_SDK)/lib/librte_eal/common
 
index 9b6926b..228d6b3 100644 (file)
@@ -57,6 +57,7 @@
 #include "eal_internal_cfg.h"
 #include "eal_filesystem.h"
 #include "eal_hugepages.h"
+#include "eal_memcfg.h"
 #include "eal_options.h"
 #include "eal_vfio.h"
 #include "hotplug_mp.h"
index 2019636..1f6a7c1 100644 (file)
@@ -44,6 +44,7 @@
 #include "eal_filesystem.h"
 #include "eal_internal_cfg.h"
 #include "eal_memalloc.h"
+#include "eal_memcfg.h"
 #include "eal_private.h"
 
 const int anonymous_hugepages_supported =
index 25c4145..1c089a1 100644 (file)
@@ -46,6 +46,7 @@
 
 #include "eal_private.h"
 #include "eal_memalloc.h"
+#include "eal_memcfg.h"
 #include "eal_internal_cfg.h"
 #include "eal_filesystem.h"
 #include "eal_hugepages.h"
index 96a03a6..fdc884f 100644 (file)
@@ -15,6 +15,7 @@
 #include <rte_vfio.h>
 
 #include "eal_filesystem.h"
+#include "eal_memcfg.h"
 #include "eal_vfio.h"
 #include "eal_private.h"
 
index ccd5b85..2751023 100644 (file)
@@ -12,7 +12,7 @@ subdir('common') # defines common_sources, common_objs, etc.
 dpdk_conf.set('RTE_EXEC_ENV_' + exec_env.to_upper(), 1)
 subdir(exec_env + '/eal')
 
-version = 10  # the version of the EAL API
+version = 11  # the version of the EAL API
 allow_experimental_apis = true
 deps += 'kvargs'
 if dpdk_conf.has('RTE_USE_LIBBSD')
index b808ce9..d3d0195 100644 (file)
@@ -20,6 +20,7 @@
 #include <rte_ring.h>
 #include <rte_jhash.h>
 #include <rte_hash_crc.h>
+#include <rte_tailq.h>
 
 #include "rte_efd.h"
 #if defined(RTE_ARCH_X86)
index 47cd0da..74d5bbd 100644 (file)
@@ -27,6 +27,7 @@
 #include <rte_ring.h>
 #include <rte_compat.h>
 #include <rte_vect.h>
+#include <rte_tailq.h>
 
 #include "rte_hash.h"
 #include "rte_cuckoo_hash.h"
index db118c9..576e8e6 100644 (file)
@@ -20,6 +20,7 @@
 #include <rte_cpuflags.h>
 #include <rte_log.h>
 #include <rte_spinlock.h>
+#include <rte_tailq.h>
 
 #include "rte_fbk_hash.h"
 
index b91f742..70c24ac 100644 (file)
@@ -21,6 +21,7 @@
 #include <rte_errno.h>
 #include <rte_rwlock.h>
 #include <rte_spinlock.h>
+#include <rte_tailq.h>
 
 #include "rte_lpm.h"
 
index 5af74a5..9b8aeb9 100644 (file)
@@ -24,6 +24,7 @@
 #include <rte_hash.h>
 #include <assert.h>
 #include <rte_jhash.h>
+#include <rte_tailq.h>
 
 #include "rte_lpm6.h"
 
index efed28d..e0e7f12 100644 (file)
@@ -10,6 +10,7 @@
 #include <rte_memory.h>
 #include <rte_malloc.h>
 #include <rte_errno.h>
+#include <rte_tailq.h>
 
 #include "rte_member.h"
 #include "rte_member_ht.h"
index 5c688d4..7260ce0 100644 (file)
@@ -30,6 +30,7 @@
 #include <rte_errno.h>
 #include <rte_string_fns.h>
 #include <rte_spinlock.h>
+#include <rte_tailq.h>
 
 #include "rte_mempool.h"
 
index 53a5a71..c80f15c 100644 (file)
@@ -24,6 +24,7 @@
 extern "C" {
 #endif
 
+#include <stdbool.h>
 #include <stdio.h>
 #include <stdint.h>
 #include <inttypes.h>
index ae6e3f5..3c9f0e2 100644 (file)
@@ -11,6 +11,7 @@
 #include <rte_eal_memconfig.h>
 #include <rte_errno.h>
 #include <rte_malloc.h>
+#include <rte_tailq.h>
 
 #include "rte_reorder.h"
 
index 9ea26a6..b30b2aa 100644 (file)
@@ -30,6 +30,7 @@
 #include <rte_errno.h>
 #include <rte_string_fns.h>
 #include <rte_spinlock.h>
+#include <rte_tailq.h>
 
 #include "rte_ring.h"