[dpdk-dev] [PATCH 1/2] net/mlx5: add hash list extended lookup and insert
Raslan Darawsheh
rasland at nvidia.com
Sun Aug 23 09:14:56 CEST 2020
Hi,
> -----Original Message-----
> From: Suanming Mou <suanmingm at mellanox.com>
> Sent: Friday, July 31, 2020 6:34 AM
> To: Slava Ovsiienko <viacheslavo at mellanox.com>; Matan Azrad
> <matan at mellanox.com>
> Cc: Raslan Darawsheh <rasland at mellanox.com>; dev at dpdk.org
> Subject: [PATCH 1/2] net/mlx5: add hash list extended lookup and insert
>
> The mlx5 PMD hashed list was designed in approach to contain the items
> with unique keys only. Now there is the need to store the objects with
> possible key collisions. It is not expected to have many collisions
> (very likely to have a few ones), but keys become not unique.
>
> This commit adds the hash list extended functions in order to support
> insertion and lookup for the lists with non-unique keys.
>
> Signed-off-by: Suanming Mou <suanmingm at mellanox.com>
> Acked-by: Viacheslav Ovsiienko <viacheslavo at mellanox.com>
> ---
> drivers/net/mlx5/mlx5_utils.c | 38 +++++++++++++++++++++++++++++
> drivers/net/mlx5/mlx5_utils.h | 57
> +++++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 95 insertions(+)
>
> diff --git a/drivers/net/mlx5/mlx5_utils.c b/drivers/net/mlx5/mlx5_utils.c
> index 25e8b27..fefe833 100644
> --- a/drivers/net/mlx5/mlx5_utils.c
> +++ b/drivers/net/mlx5/mlx5_utils.c
> @@ -81,6 +81,44 @@ struct mlx5_hlist_entry *
> return 0;
> }
>
> +struct mlx5_hlist_entry *
> +mlx5_hlist_lookup_ex(struct mlx5_hlist *h, uint64_t key,
> + mlx5_hlist_match_callback_fn cb, void *ctx)
> +{
> + uint32_t idx;
> + struct mlx5_hlist_head *first;
> + struct mlx5_hlist_entry *node;
> +
> + MLX5_ASSERT(h && cb && ctx);
> + idx = rte_hash_crc_8byte(key, 0) & h->mask;
> + first = &h->heads[idx];
> + LIST_FOREACH(node, first, next) {
> + if (!cb(node, ctx))
> + return node;
> + }
> + return NULL;
> +}
> +
> +int
> +mlx5_hlist_insert_ex(struct mlx5_hlist *h, struct mlx5_hlist_entry *entry,
> + mlx5_hlist_match_callback_fn cb, void *ctx)
> +{
> + uint32_t idx;
> + struct mlx5_hlist_head *first;
> + struct mlx5_hlist_entry *node;
> +
> + MLX5_ASSERT(h && entry && cb && ctx);
> + idx = rte_hash_crc_8byte(entry->key, 0) & h->mask;
> + first = &h->heads[idx];
> + /* No need to reuse the lookup function. */
> + LIST_FOREACH(node, first, next) {
> + if (!cb(node, ctx))
> + return -EEXIST;
> + }
> + LIST_INSERT_HEAD(first, entry, next);
> + return 0;
> +}
> +
> void
> mlx5_hlist_remove(struct mlx5_hlist *h __rte_unused,
> struct mlx5_hlist_entry *entry)
> diff --git a/drivers/net/mlx5/mlx5_utils.h b/drivers/net/mlx5/mlx5_utils.h
> index 562b9b1..97d931f 100644
> --- a/drivers/net/mlx5/mlx5_utils.h
> +++ b/drivers/net/mlx5/mlx5_utils.h
> @@ -265,6 +265,20 @@ struct mlx5_hlist_entry {
> /** Type of function that is used to handle the data before freeing. */
> typedef void (*mlx5_hlist_destroy_callback_fn)(void *p, void *ctx);
>
> +/**
> + * Type of function for user defined matching.
> + *
> + * @param entry
> + * The entry in the list.
> + * @param ctx
> + * The pointer to new entry context.
> + *
> + * @return
> + * 0 if matching, -1 otherwise.
> + */
> +typedef int (*mlx5_hlist_match_callback_fn)(struct mlx5_hlist_entry
> *entry,
> + void *ctx);
> +
> /** hash list table structure */
> struct mlx5_hlist {
> char name[MLX5_HLIST_NAMESIZE]; /**< Name of the hash list. */
> @@ -323,6 +337,49 @@ struct mlx5_hlist {
> int mlx5_hlist_insert(struct mlx5_hlist *h, struct mlx5_hlist_entry *entry);
>
> /**
> + * Extended routine to search an entry matching the context with
> + * user defined match function.
> + *
> + * @param h
> + * Pointer to the hast list table.
> + * @param key
> + * Key for the searching entry.
> + * @param cb
> + * Callback function to match the node with context.
> + * @param ctx
> + * Common context parameter used by callback function.
> + *
> + * @return
> + * Pointer of the hlist entry if found, NULL otherwise.
> + */
> +struct mlx5_hlist_entry *mlx5_hlist_lookup_ex(struct mlx5_hlist *h,
> + uint64_t key,
> + mlx5_hlist_match_callback_fn cb,
> + void *ctx);
> +
> +/**
> + * Extended routine to insert an entry to the list with key collisions.
> + *
> + * For the list have key collision, the extra user defined match function
> + * allows node with same key will be inserted.
> + *
> + * @param h
> + * Pointer to the hast list table.
> + * @param entry
> + * Entry to be inserted into the hash list table.
> + * @param cb
> + * Callback function to match the node with context.
> + * @param ctx
> + * Common context parameter used by callback function.
> + *
> + * @return
> + * - zero for success.
> + * - -EEXIST if the entry is already inserted.
> + */
> +int mlx5_hlist_insert_ex(struct mlx5_hlist *h, struct mlx5_hlist_entry
> *entry,
> + mlx5_hlist_match_callback_fn cb, void *ctx);
> +
> +/**
> * Remove an entry from the hash list table. User should guarantee the
> validity
> * of the entry.
> *
> --
> 1.8.3.1
Series applied to next-net-mlx,
Kindest regards
Raslan Darawsheh
More information about the dev
mailing list