V7: Rebased on latest main branch
@@ -51,7 +51,7 @@ typedef void (*case_clean_t)(unsigned lcore_id);
#define MEMPOOL_ELT_SIZE (sizeof(uint32_t))
#define MEMPOOL_SIZE (4)
-#define MAX_LCORES (RTE_MAX_MEMZONE / (MAX_ITER_MULTI * 4U))
+#define MAX_LCORES (rte_memzone_max_get() / (MAX_ITER_MULTI * 4U))
static uint32_t obj_count;
static uint32_t synchro;
@@ -165,7 +165,7 @@ test_malloc_perf(void)
return -1;
if (test_alloc_perf("rte_memzone_reserve", memzone_alloc, memzone_free,
- NULL, memset_us_gb, RTE_MAX_MEMZONE - 1) < 0)
+ NULL, memset_us_gb, rte_memzone_max_get() - 1) < 0)
return -1;
return 0;
@@ -871,9 +871,17 @@ test_memzone_bounded(void)
static int
test_memzone_free(void)
{
- const struct rte_memzone *mz[RTE_MAX_MEMZONE + 1];
+ const struct rte_memzone **mz;
int i;
char name[20];
+ int rc = -1;
+
+ mz = rte_calloc("memzone_test", rte_memzone_max_get() + 1,
+ sizeof(struct rte_memzone *), 0);
+ if (!mz) {
+ printf("Fail allocating memzone test array\n");
+ return rc;
+ }
mz[0] = rte_memzone_reserve(TEST_MEMZONE_NAME("tempzone0"), 2000,
SOCKET_ID_ANY, 0);
@@ -881,42 +889,42 @@ test_memzone_free(void)
SOCKET_ID_ANY, 0);
if (mz[0] > mz[1])
- return -1;
+ goto exit_test;
if (!rte_memzone_lookup(TEST_MEMZONE_NAME("tempzone0")))
- return -1;
+ goto exit_test;
if (!rte_memzone_lookup(TEST_MEMZONE_NAME("tempzone1")))
- return -1;
+ goto exit_test;
if (rte_memzone_free(mz[0])) {
printf("Fail memzone free - tempzone0\n");
- return -1;
+ goto exit_test;
}
if (rte_memzone_lookup(TEST_MEMZONE_NAME("tempzone0"))) {
printf("Found previously free memzone - tempzone0\n");
- return -1;
+ goto exit_test;
}
mz[2] = rte_memzone_reserve(TEST_MEMZONE_NAME("tempzone2"), 2000,
SOCKET_ID_ANY, 0);
if (mz[2] > mz[1]) {
printf("tempzone2 should have gotten the free entry from tempzone0\n");
- return -1;
+ goto exit_test;
}
if (rte_memzone_free(mz[2])) {
printf("Fail memzone free - tempzone2\n");
- return -1;
+ goto exit_test;
}
if (rte_memzone_lookup(TEST_MEMZONE_NAME("tempzone2"))) {
printf("Found previously free memzone - tempzone2\n");
- return -1;
+ goto exit_test;
}
if (rte_memzone_free(mz[1])) {
printf("Fail memzone free - tempzone1\n");
- return -1;
+ goto exit_test;
}
if (rte_memzone_lookup(TEST_MEMZONE_NAME("tempzone1"))) {
printf("Found previously free memzone - tempzone1\n");
- return -1;
+ goto exit_test;
}
i = 0;
@@ -928,7 +936,7 @@ test_memzone_free(void)
if (rte_memzone_free(mz[0])) {
printf("Fail memzone free - tempzone0\n");
- return -1;
+ goto exit_test;
}
mz[0] = rte_memzone_reserve(TEST_MEMZONE_NAME("tempzone0new"), 0,
SOCKET_ID_ANY, 0);
@@ -936,17 +944,21 @@ test_memzone_free(void)
if (mz[0] == NULL) {
printf("Fail to create memzone - tempzone0new - when MAX memzones were "
"created and one was free\n");
- return -1;
+ goto exit_test;
}
for (i = i - 2; i >= 0; i--) {
if (rte_memzone_free(mz[i])) {
printf("Fail memzone free - tempzone%d\n", i);
- return -1;
+ goto exit_test;
}
}
- return 0;
+ rc = 0;
+
+exit_test:
+ rte_free(mz);
+ return rc;
}
static int test_memzones_left;
@@ -34,7 +34,6 @@
#define RTE_MAX_MEM_MB_PER_LIST 32768
#define RTE_MAX_MEMSEG_PER_TYPE 32768
#define RTE_MAX_MEM_MB_PER_TYPE 65536
-#define RTE_MAX_MEMZONE 2560
#define RTE_MAX_TAILQ 32
#define RTE_LOG_DP_LEVEL RTE_LOG_INFO
#define RTE_MAX_VFIO_CONTAINERS 64
@@ -47,10 +47,34 @@ void osal_poll_mode_dpc(osal_int_ptr_t hwfn_cookie)
}
/* Array of memzone pointers */
-static const struct rte_memzone *ecore_mz_mapping[RTE_MAX_MEMZONE];
+static const struct rte_memzone **ecore_mz_mapping;
/* Counter to track current memzone allocated */
static uint16_t ecore_mz_count;
+static uint32_t ref_cnt;
+
+int ecore_mz_mapping_alloc(void)
+{
+ if (__atomic_fetch_add(&ref_cnt, 1, __ATOMIC_RELAXED) == 0) {
+ ecore_mz_mapping = rte_calloc("ecore_mz_map",
+ rte_memzone_max_get(), sizeof(struct rte_memzone *), 0);
+ }
+
+ if (!ecore_mz_mapping)
+ return -ENOMEM;
+
+ return 0;
+}
+
+void ecore_mz_mapping_free(void)
+{
+ if (__atomic_fetch_sub(&ref_cnt, 1, __ATOMIC_RELAXED) - 1 == 0) {
+ if (ecore_mz_mapping)
+ rte_free(ecore_mz_mapping);
+ ecore_mz_mapping = NULL;
+ }
+}
+
unsigned long qede_log2_align(unsigned long n)
{
unsigned long ret = n ? 1 : 0;
@@ -132,9 +156,9 @@ void *osal_dma_alloc_coherent(struct ecore_dev *p_dev,
uint32_t core_id = rte_lcore_id();
unsigned int socket_id;
- if (ecore_mz_count >= RTE_MAX_MEMZONE) {
- DP_ERR(p_dev, "Memzone allocation count exceeds %u\n",
- RTE_MAX_MEMZONE);
+ if (ecore_mz_count >= rte_memzone_max_get()) {
+ DP_ERR(p_dev, "Memzone allocation count exceeds %zu\n",
+ rte_memzone_max_get());
*phys = 0;
return OSAL_NULL;
}
@@ -171,9 +195,9 @@ void *osal_dma_alloc_coherent_aligned(struct ecore_dev *p_dev,
uint32_t core_id = rte_lcore_id();
unsigned int socket_id;
- if (ecore_mz_count >= RTE_MAX_MEMZONE) {
- DP_ERR(p_dev, "Memzone allocation count exceeds %u\n",
- RTE_MAX_MEMZONE);
+ if (ecore_mz_count >= rte_memzone_max_get()) {
+ DP_ERR(p_dev, "Memzone allocation count exceeds %zu\n",
+ rte_memzone_max_get());
*phys = 0;
return OSAL_NULL;
}
@@ -477,4 +477,7 @@ enum dbg_status qed_dbg_alloc_user_data(struct ecore_hwfn *p_hwfn,
qed_dbg_alloc_user_data(p_hwfn, user_data_ptr)
#define OSAL_DB_REC_OCCURRED(p_hwfn) nothing
+int ecore_mz_mapping_alloc(void);
+void ecore_mz_mapping_free(void);
+
#endif /* __BCM_OSAL_H */
@@ -72,6 +72,12 @@ qed_probe(struct ecore_dev *edev, struct rte_pci_device *pci_dev,
hw_prepare_params.allow_mdump = false;
hw_prepare_params.b_en_pacing = false;
hw_prepare_params.epoch = OSAL_GET_EPOCH(ECORE_LEADING_HWFN(edev));
+ rc = ecore_mz_mapping_alloc();
+ if (rc) {
+ DP_ERR(edev, "mem zones array allocation failed\n");
+ return rc;
+ }
+
rc = ecore_hw_prepare(edev, &hw_prepare_params);
if (rc) {
DP_ERR(edev, "hw prepare failed\n");
@@ -722,6 +728,7 @@ static void qed_remove(struct ecore_dev *edev)
return;
ecore_hw_remove(edev);
+ ecore_mz_mapping_free();
}
static int qed_send_drv_state(struct ecore_dev *edev, bool active)
@@ -22,6 +22,9 @@
#include "eal_private.h"
#include "eal_memcfg.h"
+/* Default count used until rte_memzone_max_set() is called */
+#define DEFAULT_MAX_MEMZONE_COUNT 2560
+
static inline const struct rte_memzone *
memzone_lookup_thread_unsafe(const char *name)
{
@@ -81,8 +84,9 @@ memzone_reserve_aligned_thread_unsafe(const char *name, size_t len,
/* no more room in config */
if (arr->count >= arr->len) {
RTE_LOG(ERR, EAL,
- "%s(): Number of requested memzone segments exceeds RTE_MAX_MEMZONE\n",
- __func__);
+ "%s(): Number of requested memzone segments exceeds maximum "
+ "%u\n", __func__, arr->len);
+
rte_errno = ENOSPC;
return NULL;
}
@@ -396,7 +400,7 @@ rte_eal_memzone_init(void)
if (rte_eal_process_type() == RTE_PROC_PRIMARY &&
rte_fbarray_init(&mcfg->memzones, "memzone",
- RTE_MAX_MEMZONE, sizeof(struct rte_memzone))) {
+ rte_memzone_max_get(), sizeof(struct rte_memzone))) {
RTE_LOG(ERR, EAL, "Cannot allocate memzone list\n");
ret = -1;
} else if (rte_eal_process_type() == RTE_PROC_SECONDARY &&
@@ -430,3 +434,37 @@ void rte_memzone_walk(void (*func)(const struct rte_memzone *, void *),
}
rte_rwlock_read_unlock(&mcfg->mlock);
}
+
+int
+rte_memzone_max_set(size_t max)
+{
+ struct rte_mem_config *mcfg;
+
+ if (eal_get_internal_configuration()->init_complete > 0) {
+ RTE_LOG(ERR, EAL, "Max memzone cannot be set after calling "
+ "eal init\n");
+ return -1;
+ }
+
+ mcfg = rte_eal_get_configuration()->mem_config;
+ if (mcfg == NULL) {
+ RTE_LOG(ERR, EAL, "Failed to set max memzone\n");
+ return -1;
+ }
+
+ mcfg->max_memzone = max;
+
+ return 0;
+}
+
+size_t
+rte_memzone_max_get(void)
+{
+ struct rte_mem_config *mcfg;
+
+ mcfg = rte_eal_get_configuration()->mem_config;
+ if (mcfg == NULL || mcfg->max_memzone == 0)
+ return DEFAULT_MAX_MEMZONE_COUNT;
+
+ return mcfg->max_memzone;
+}
@@ -75,6 +75,8 @@ struct rte_mem_config {
/**< TSC rate */
uint8_t dma_maskbits; /**< Keeps the more restricted dma mask. */
+
+ size_t max_memzone; /**< Maximum number of allocated memzones. */
};
/* update internal config from shared mem config */
@@ -305,6 +305,36 @@ void rte_memzone_dump(FILE *f);
void rte_memzone_walk(void (*func)(const struct rte_memzone *, void *arg),
void *arg);
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice
+ *
+ * Set max memzone count.
+ *
+ * This function can only be called prior to rte_eal_init().
+ *
+ * @param max
+ * Maximum number of memzones
+ * @return
+ * 0 on success, -1 otherwise
+ */
+__rte_experimental
+int rte_memzone_max_set(size_t max);
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice
+ *
+ * Get the maximum number of memzones.
+ *
+ * @note: The maximum value will not change after calling rte_eal_init().
+ *
+ * @return
+ * Maximum number of memzones
+ */
+__rte_experimental
+size_t rte_memzone_max_get(void);
+
#ifdef __cplusplus
}
#endif
@@ -430,6 +430,10 @@ EXPERIMENTAL {
rte_thread_create_control;
rte_thread_set_name;
__rte_eal_trace_generic_blob;
+
+ # added in 23.07
+ rte_memzone_max_set;
+ rte_memzone_max_get;
};
INTERNAL {