#ifndef RTE_PMD_MLX5_COMMON_UTILS_H_
#define RTE_PMD_MLX5_COMMON_UTILS_H_
+#include <rte_rwlock.h>
+
#include "mlx5_common.h"
/************************ mlx5 list *****************************/
/** Maximum size of string for naming. */
#define MLX5_NAME_SIZE 32
+/** Maximum size of list. */
+#define MLX5_LIST_MAX (RTE_MAX_LCORE + 2)
+/** Global list index. */
+#define MLX5_LIST_GLOBAL ((MLX5_LIST_MAX) - 1)
+/** None rte core list index. */
+#define MLX5_LIST_NLCORE ((MLX5_LIST_MAX) - 2)
struct mlx5_list;
typedef struct mlx5_list_entry *(*mlx5_list_create_cb)(void *tool_ctx,
void *ctx);
+/**
+ * Linked mlx5 list constant object.
+ */
+struct mlx5_list_const {
+ char name[MLX5_NAME_SIZE]; /**< Name of the mlx5 list. */
+ void *ctx; /* user objects target to callback. */
+ bool lcores_share; /* Whether to share objects between the lcores. */
+ rte_spinlock_t lcore_lock; /* Lock for non-lcore list. */
+ mlx5_list_create_cb cb_create; /**< entry create callback. */
+ mlx5_list_match_cb cb_match; /**< entry match callback. */
+ mlx5_list_remove_cb cb_remove; /**< entry remove callback. */
+ mlx5_list_clone_cb cb_clone; /**< entry clone callback. */
+ mlx5_list_clone_free_cb cb_clone_free;
+ /**< entry clone free callback. */
+};
+
+/**
+ * Linked mlx5 list inconstant data.
+ */
+struct mlx5_list_inconst {
+ rte_rwlock_t lock; /* read/write lock. */
+ volatile uint32_t gen_cnt; /* List modification may update it. */
+ volatile uint32_t count; /* number of entries in list. */
+ struct mlx5_list_cache *cache[MLX5_LIST_MAX];
+ /* Lcore cache, last index is the global cache. */
+};
+
/**
* Linked mlx5 list structure.
*
*
*/
struct mlx5_list {
- char name[MLX5_NAME_SIZE]; /**< Name of the mlx5 list. */
- void *ctx; /* user objects target to callback. */
- bool lcores_share; /* Whether to share objects between the lcores. */
- mlx5_list_create_cb cb_create; /**< entry create callback. */
- mlx5_list_match_cb cb_match; /**< entry match callback. */
- mlx5_list_remove_cb cb_remove; /**< entry remove callback. */
- mlx5_list_clone_cb cb_clone; /**< entry clone callback. */
- mlx5_list_clone_free_cb cb_clone_free;
- struct mlx5_list_cache cache[RTE_MAX_LCORE + 1];
- /* Lcore cache, last index is the global cache. */
- volatile uint32_t gen_cnt; /* List modification may update it. */
- volatile uint32_t count; /* number of entries in list. */
- rte_rwlock_t lock; /* read/write lock. */
+ struct mlx5_list_const l_const;
+ struct mlx5_list_inconst l_inconst;
};
/**
/* Hash list bucket. */
struct mlx5_hlist_bucket {
- struct mlx5_list l;
+ struct mlx5_list_inconst l;
} __rte_cache_aligned;
/**
uint32_t mask; /* A mask for the bucket index range. */
uint8_t flags;
bool direct_key; /* Whether to use the key directly as hash index. */
- bool lcores_share; /* Whether to share objects between the lcores. */
+ struct mlx5_list_const l_const; /* List constant data. */
struct mlx5_hlist_bucket buckets[] __rte_cache_aligned;
};