rte_hash.h(3)

πŸ’– rte_hash.h(3) β€” Library Functions Manual πŸ’–

✨ NAME ✨

rte_hash.h β€” that's the name, bestie. It's the RTE Hash Table header, and it's giving main character energy. πŸ’…

🌈 SYNOPSIS 🌈

okay so first you gotta include these, no cap:

#include <stdint.h>
#include <stddef.h>
#include <rte_common.h>
#include <rte_rcu_qsbr.h>

   Data Structures
       struct rte_hash_parameters
       struct rte_hash_rcu_config

   Macros
       #define RTE_HASH_ENTRIES_MAX   (1 << 30)
       #define RTE_HASH_NAMESIZE   32
       #define RTE_HASH_LOOKUP_BULK_MAX   64
       #define RTE_HASH_EXTRA_FLAGS_TRANS_MEM_SUPPORT   0x01
       #define RTE_HASH_EXTRA_FLAGS_MULTI_WRITER_ADD   0x02
       #define RTE_HASH_EXTRA_FLAGS_RW_CONCURRENCY   0x04
       #define RTE_HASH_EXTRA_FLAGS_EXT_TABLE   0x08
       #define RTE_HASH_EXTRA_FLAGS_NO_FREE_ON_DEL   0x10
       #define RTE_HASH_EXTRA_FLAGS_RW_CONCURRENCY_LF   0x20

   Typedefs
       typedef uint32_t hash_sig_t
       typedef uint32_t(* rte_hash_function) (const void *key, uint32_t
           key_len, uint32_t init_val)
       typedef int(* rte_hash_cmp_eq_t) (const void *key1, const void *key2,
           size_t key_len)
       typedef void(* rte_hash_free_key_data) (void *p, void *key_data)

   Enumerations
       enum rte_hash_qsbr_mode { RTE_HASH_QSBR_MODE_DQ = 0,
           RTE_HASH_QSBR_MODE_SYNC }

   Functions
       void rte_hash_free (struct rte_hash *h)
       struct rte_hash * rte_hash_create (const struct rte_hash_parameters
           *params) __rte_malloc __rte_dealloc(rte_hash_free
       struct rte_hash void rte_hash_set_cmp_func (struct rte_hash *h,
           rte_hash_cmp_eq_t func)
       struct rte_hash * rte_hash_find_existing (const char *name)
       void rte_hash_reset (struct rte_hash *h)
       int32_t rte_hash_count (const struct rte_hash *h)
       int32_t rte_hash_max_key_id (const struct rte_hash *h)
       int rte_hash_add_key_data (const struct rte_hash *h, const void *key,
           void *data)
       int32_t rte_hash_add_key_with_hash_data (const struct rte_hash *h, const
           void *key, hash_sig_t sig, void *data)
       int32_t rte_hash_add_key (const struct rte_hash *h, const void *key)
       int32_t rte_hash_add_key_with_hash (const struct rte_hash *h, const void
           *key, hash_sig_t sig)
       int32_t rte_hash_del_key (const struct rte_hash *h, const void *key)
       int32_t rte_hash_del_key_with_hash (const struct rte_hash *h, const void
           *key, hash_sig_t sig)
       int rte_hash_get_key_with_position (const struct rte_hash *h, const
           int32_t position, void **key)
       int rte_hash_free_key_with_position (const struct rte_hash *h, const
           int32_t position)
       int rte_hash_lookup_data (const struct rte_hash *h, const void *key,
           void **data)
       int rte_hash_lookup_with_hash_data (const struct rte_hash *h, const void
           *key, hash_sig_t sig, void **data)
       int32_t rte_hash_lookup (const struct rte_hash *h, const void *key)
       int32_t rte_hash_lookup_with_hash (const struct rte_hash *h, const void
           *key, hash_sig_t sig)
       hash_sig_t rte_hash_hash (const struct rte_hash *h, const void *key)
       int rte_hash_lookup_bulk_data (const struct rte_hash *h, const void
           **keys, uint32_t num_keys, uint64_t *hit_mask, void *data[])
       int rte_hash_lookup_with_hash_bulk (const struct rte_hash *h, const void
           **keys, hash_sig_t *sig, uint32_t num_keys, int32_t *positions)
       int rte_hash_lookup_with_hash_bulk_data (const struct rte_hash *h, const
           void **keys, hash_sig_t *sig, uint32_t num_keys, uint64_t *hit_mask,
           void *data[])
       int rte_hash_lookup_bulk (const struct rte_hash *h, const void **keys,
           uint32_t num_keys, int32_t *positions)
       int32_t rte_hash_iterate (const struct rte_hash *h, const void **key,
           void **data, uint32_t *next)
       int rte_hash_rcu_qsbr_add (struct rte_hash *h, struct
           rte_hash_rcu_config *cfg)
       __rte_experimental int rte_hash_rcu_qsbr_dq_reclaim (struct rte_hash *h,
           unsigned int *freed, unsigned int *pending, unsigned int *available)

πŸ¦‹ Detailed Description πŸ¦‹

RTE Hash Table

Definition in file rte_hash.h.

πŸ‘‘ Macro Definition Documentation πŸ‘‘

#define RTE_HASH_ENTRIES_MAX (1 << 30)

bestie, this is the absolute biggest hash table you can create. no cap. Definition at line 25 of file rte_hash.h.

#define RTE_HASH_NAMESIZE 32

Maximum number of characters in hash name. like, 32 characters, that's the limit. Definition at line 28 of file rte_hash.h.

#define RTE_HASH_LOOKUP_BULK_MAX 64

Maximum number of keys that can be searched for using rte_hash_lookup_bulk. so you can bulk lookup up to 64 keys. Definition at line 31 of file rte_hash.h.

#define RTE_HASH_EXTRA_FLAGS_TRANS_MEM_SUPPORT 0x01

Enable Hardware transactional memory support. it's giving hardware magic. Definition at line 35 of file rte_hash.h.

#define RTE_HASH_EXTRA_FLAGS_MULTI_WRITER_ADD 0x02

Default behavior of insertion, single writer/multi writer. so you can choose. Definition at line 38 of file rte_hash.h.

#define RTE_HASH_EXTRA_FLAGS_RW_CONCURRENCY 0x04

Flag to support reader writer concurrency. yes bestie, concurrent reads and writes. Definition at line 41 of file rte_hash.h.

#define RTE_HASH_EXTRA_FLAGS_EXT_TABLE 0x08

Flag to indicate the extendable bucket table feature should be used. so the table can grow. Definition at line 44 of file rte_hash.h.

#define RTE_HASH_EXTRA_FLAGS_NO_FREE_ON_DEL 0x10

Flag to disable freeing of key index on hash delete. Refer to rte_hash_del_xxx APIs for more details. This is enabled by default when RTE_HASH_EXTRA_FLAGS_RW_CONCURRENCY_LF is enabled. However, if internal RCU is enabled, freeing of internal memory/index is done on delete. Definition at line 52 of file rte_hash.h.

#define RTE_HASH_EXTRA_FLAGS_RW_CONCURRENCY_LF 0x20

Flag to support lock free reader writer concurrency. Both single writer and multi writer use cases are supported. lock free, no cap. Definition at line 57 of file rte_hash.h.

🧚 Typedef Documentation 🧚

typedef uint32_t hash_sig_t

The type of hash value of a key. It should be a value of at least 32bit with fully random pattern. Definition at line 63 of file rte_hash.h.

typedef uint32_t(* rte_hash_function) (const void *key, uint32_t key_len, uint32_t init_val)

Type of function that can be used for calculating the hash value. Definition at line 66 of file rte_hash.h.

typedef int(* rte_hash_cmp_eq_t) (const void *key1, const void *key2, size_t key_len)

Type of function used to compare the hash key. Definition at line 70 of file rte_hash.h.

typedef void(* rte_hash_free_key_data) (void *p, void *key_data)

Type of function used to free data stored in the key. Required when using internal RCU to allow application to free key-data once the key is returned to the ring of free key-slots. Definition at line 77 of file rte_hash.h.

πŸ’… Enumeration Type Documentation πŸ’…

enum rte_hash_qsbr_mode

RCU reclamation modes

Enumerator:

  • RTE_HASH_QSBR_MODE_DQ β€” Create defer queue for reclaim.
  • RTE_HASH_QSBR_MODE_SYNC β€” Use blocking mode reclaim. No defer queue created.

Definition at line 94 of file rte_hash.h.

πŸ”₯ Function Documentation πŸ”₯

void rte_hash_free (struct rte_hash * h)

De-allocate all memory used by hash table. like, bye bye memory, bestie.

Parameters

  • h β€” Hash table to free, if NULL, the function does nothing.

struct rte_hash * rte_hash_create (const struct rte_hash_parameters * params)

Create a new hash table.

Parameters

  • params β€” Parameters used to create and initialise the hash table.

Returns

Pointer to hash table structure that is used in future hash table operations, or NULL on error, with error code set in rte_errno. Possible rte_errno errors include:

  • E_RTE_NO_CONFIG - function could not get pointer to rte_config structure
  • E_RTE_SECONDARY - function was called from a secondary process instance
  • ENOENT - missing entry
  • EINVAL - invalid parameter passed to function
  • ENOSPC - the maximum number of memzones has already been allocated
  • EEXIST - a memzone with the same name already exists
  • ENOMEM - no appropriate memory area found in which to create memzone

struct rte_hash void rte_hash_set_cmp_func (struct rte_hash * h, rte_hash_cmp_eq_t func)

Set a new hash compare function other than the default one.

Note: Function pointer does not work with multi-process, so do not use it in multi-process mode. πŸ’€

Parameters

  • h β€” Hash table for which the function is to be changed
  • func β€” New compare function

struct rte_hash * rte_hash_find_existing (const char * name)

Find an existing hash table object and return a pointer to it.

Parameters

  • name β€” Name of the hash table as passed to rte_hash_create()

Returns

Pointer to hash table or NULL if object not found with rte_errno set appropriately. Possible rte_errno values include:

  • ENOENT - value not available for return

void rte_hash_reset (struct rte_hash * h)

Reset all hash structure, by zeroing all entries. When RTE_HASH_EXTRA_FLAGS_RW_CONCURRENCY_LF is enabled, it is application's responsibility to make sure that none of the readers are referencing the hash table while calling this API. so like, make sure nobody's reading, okay?

Parameters

  • h β€” Hash table to reset

int32_t rte_hash_count (const struct rte_hash * h)

Return the number of keys in the hash table

Parameters

  • h β€” Hash table to query from

Returns

  • -EINVAL if parameters are invalid
  • A value indicating how many keys were inserted in the table.

int32_t rte_hash_max_key_id (const struct rte_hash * h)

Return the maximum key value ID that could possibly be returned by rte_hash_add_key function.

Parameters

  • h β€” Hash table to query from

Returns

  • -EINVAL if parameters are invalid
  • A value indicating the max key ID of key slots present in the table.

int rte_hash_add_key_data (const struct rte_hash * h, const void * key, void * data)

Add a key-value pair to an existing hash table. This operation is not multi-thread safe and should only be called from one thread by default. Thread safety can be enabled by setting flag during table creation. If the key exists already in the table, this API updates its value with 'data' passed in this API. If RCU is configured with a free_key_data_func callback, the old data is automatically deferred-freed via RCU. Otherwise, it is the responsibility of the application to manage any memory associated with the old value. The readers might still be using the old value even after this API has returned.

Parameters

  • h β€” Hash table to add the key to.
  • key β€” Key to add to the hash table.
  • data β€” Data to add to the hash table.

Returns

  • 0 if added successfully
  • -EINVAL if the parameters are invalid.
  • -ENOSPC if there is no space in the hash for this key.

πŸ’– int32_t rte_hash_add_key_with_hash_data (const struct rte_hash * h, const void * key, hash_sig_t sig, void * data)

okay so this one adds a key-value pair to an existing hash table, except you already did the homework and pass in a pre-computed hash value. no cap, it saves you a hash computation.

⚠️ this operation is not multi-thread safe and by default you should only call it from one single thread. you can turn on thread safety by setting a flag during table creation tho πŸ’…

and here's the tea: if the key already exists in the table, this API updates its value with the data you passed in. if RCU is configured with a free_key_data_func callback, the old data gets auto deferred-freed via RCU πŸŽ€ otherwise it's your problem to manage any memory associated with the old value. also the readers might still be using the old value even after this API has returned, so be careful bestie 😭

Parameters β€” the receipts:

  • h β€” hash table to add the key to.
  • key β€” key to add to the hash table.
  • sig β€” precomputed hash value for key
  • data β€” data to add to the hash table.

Returns β€” what you get back:

  • 0 if added successfully ✨
  • -EINVAL if the parameters are invalid.
  • -ENOSPC if there is no space in the hash for this key. πŸ’€

🌸 int32_t rte_hash_add_key (const struct rte_hash * h, const void * key)

adds a key to an existing hash table, plain and simple. not multi-thread safe, so by default it's one thread only. thread safety can be enabled by setting a flag during table creation. iykyk πŸ¦‹

Parameters:

  • h β€” hash table to add the key to.
  • key β€” key to add to the hash table.

Returns:

  • -EINVAL if the parameters are invalid.
  • -ENOSPC if there is no space in the hash for this key.
  • A non-negative value the caller can use as an offset into an array of user data πŸ‘‘ this value is unique for this key. and heads up β€” this unique key id may be larger than the user specified entry count when the RTE_HASH_EXTRA_FLAGS_MULTI_WRITER_ADD flag is set.

✨ int32_t rte_hash_add_key_with_hash (const struct rte_hash * h, const void * key, hash_sig_t sig)

adds a key to an existing hash table, but with your precomputed hash value so you skip the hashing step. still not multi-thread safe by default β€” one thread only. thread safety = flag at table creation time πŸŽ€

Parameters:

  • h β€” hash table to add the key to.
  • key β€” key to add to the hash table.
  • sig β€” precomputed hash value for key.

Returns:

  • -EINVAL if the parameters are invalid.
  • -ENOSPC if there is no space in the hash for this key.
  • A non-negative value usable by the caller as an offset into an array of user data. unique for this key. this unique key ID may be larger than the user specified entry count when RTE_HASH_EXTRA_FLAGS_MULTI_WRITER_ADD is set. ⭐

πŸ¦‹ int32_t rte_hash_del_key (const struct rte_hash * h, const void * key)

removes a key from an existing hash table. not multi-thread safe, one thread by default, thread safety = the flag during table creation πŸ’œ

okay now the important bit, listen up bestie: if RTE_HASH_EXTRA_FLAGS_NO_FREE_ON_DEL or RTE_HASH_EXTRA_FLAGS_RW_CONCURRENCY_LF is enabled and internal RCU is NOT enabled, then the key index returned by the rte_hash_add_key_xxx APIs will not be freed by this API. you gotta call rte_hash_free_key_with_position too, to actually free the index associated with the key. and you call that one after all the readers have stopped referencing the entry for this key. RCU mechanisms can be used to determine such a state πŸ™ˆ

Parameters:

  • h β€” hash table to remove the key from.
  • key β€” key to remove from the hash table.

Returns:

  • -EINVAL if the parameters are invalid.
  • -ENOENT if the key is not found.
  • A non-negative value usable as an offset into an array of user data β€” unique for this key, and it's the same value that was returned when the key was added πŸ’–

🌈 int32_t rte_hash_del_key_with_hash (const struct rte_hash * h, const void * key, hash_sig_t sig)

removes a key from an existing hash table, and you're passing in the precomputed hash value. not multi-thread safe by default, one thread only, thread safety enableable via flag during table creation.

and again, the caveat that matters: if RTE_HASH_EXTRA_FLAGS_NO_FREE_ON_DEL or RTE_HASH_EXTRA_FLAGS_RW_CONCURRENCY_LF is enabled and internal RCU is NOT enabled, the key index returned by the rte_hash_add_key_xxx APIs will not be freed by this API. rte_hash_free_key_with_position must be called additionally to free the index associated with the key. that call should happen after all readers have stopped referencing the entry for this key. RCU mechanisms could be used to determine such a state πŸ’…

Parameters:

  • h β€” hash table to remove the key from.
  • key β€” key to remove from the hash table.
  • sig β€” precomputed hash value for key.

Returns:

  • -EINVAL if the parameters are invalid.
  • -ENOENT if the key is not found.
  • A non-negative value usable as an offset into an array of user data, unique for this key, and the same value returned when the key was added. πŸ“

🧚 int rte_hash_get_key_with_position (const struct rte_hash * h, const int32_t position, void ** key)

finds a key in the hash table given the position. this one is multi-thread safe with regard to other lookup threads 🫢 read-write concurrency can be enabled by setting a flag during table creation.

Parameters:

  • h β€” hash table to get the key from.
  • position β€” position returned when the key was inserted.
  • key β€” output containing a pointer to the key

Returns:

  • 0 if retrieved successfully ✨
  • -EINVAL if the parameters are invalid.
  • -ENOENT if no valid key is found in the given position. πŸ’€

πŸ‘‘ int rte_hash_free_key_with_position (const struct rte_hash * h, const int32_t position)

frees a hash key in the hash table given the position of the key. not multi-thread safe, single thread by default, thread safety via the creation flag. πŸ’œ

so: if RTE_HASH_EXTRA_FLAGS_NO_FREE_ON_DEL or RTE_HASH_EXTRA_FLAGS_RW_CONCURRENCY_LF is enabled and internal RCU is NOT enabled, then the key index returned by the rte_hash_del_key_xxx APIs must be freed using this API. call it after all readers have stopped referencing the entry for this key β€” RCU mechanisms can be used to determine such a state.

🚨 and like, this API does NOT validate if the key is already freed. so don't be double-freeing, bestie, that's not the vibe.

Parameters:

  • h β€” hash table to free the key from.
  • position β€” position returned when the key was deleted.

Returns:

  • 0 if freed successfully 🌸
  • -EINVAL if the parameters are invalid.

πŸ’œ int rte_hash_lookup_data (const struct rte_hash * h, const void * key, void ** data)

finds a key-value pair in the hash table. this one is multi-thread safe with regard to other lookup threads ✨ read-write concurrency can be enabled by setting a flag during table creation.

Parameters:

  • h β€” hash table to look in.
  • key β€” key to find.
  • data β€” output with pointer to data returned from the hash table.

Returns:

  • A non-negative value usable as an offset into an array of user data β€” unique for this key, and the same value returned when the key was added. πŸŽ€
  • -EINVAL if the parameters are invalid.
  • -ENOENT if the key is not found.

πŸ¦‹ int rte_hash_lookup_with_hash_data (const struct rte_hash * h, const void * key, hash_sig_t sig, void ** data)

finds a key-value pair with a precomputed hash value in an existing hash table. multi-thread safe with regard to other lookup threads, and read-write concurrency can be enabled via the flag during table creation πŸ’–

Parameters:

  • h β€” hash table to look in.
  • key β€” key to find.
  • sig β€” precomputed hash value for key
  • data β€” output with pointer to data returned from the hash table.

Returns:

  • A non-negative value usable by the caller as an offset into an array of user data β€” unique for this key, and the same value returned when the key was added. ⭐
  • -EINVAL if the parameters are invalid.
  • -ENOENT if the key is not found.

🌸 int32_t rte_hash_lookup (const struct rte_hash * h, const void * key)

finds a key in the hash table. multi-thread safe with regard to other lookup threads. read-write concurrency can be enabled by setting a flag during table creation. πŸ’…

Parameters:

  • h β€” hash table to look in.
  • key β€” key to find.

Returns:

  • -EINVAL if the parameters are invalid.
  • -ENOENT if the key is not found.
  • A non-negative value usable as an offset into an array of user data β€” unique for this key, same value returned when the key was added. 🫢

✨ int32_t rte_hash_lookup_with_hash (const struct rte_hash * h, const void * key, hash_sig_t sig)

finds a key in the hash table, with the precomputed hash value handed to you. multi-thread safe re: other lookup threads, and read-write concurrency can be turned on with a flag during table creation.

Parameters:

  • h β€” hash table to look in.
  • key β€” key to find.
  • sig β€” precomputed hash value for key.

Returns:

  • -EINVAL if the parameters are invalid.
  • -ENOENT if the key is not found.
  • A non-negative value usable as an offset into an array of user data β€” unique for this key, and the same value returned when the key was added. πŸ‘‘

🌈 hash_sig_t rte_hash_hash (const struct rte_hash * h, const void * key)

calculates a hash value by key.

⚠️ heads up: this operation is not multi-process safe. 🚨

Parameters:

  • h β€” hash table to look in.
  • key β€” key to find.

Returns:

  • hash value πŸŽ€

πŸ’€ int rte_hash_lookup_bulk_data (const struct rte_hash * h, const void ** keys, uint32_t num_keys, uint64_t * hit_mask, void * data[])

the group-chat of lookups β€” finds multiple keys in the hash table at once πŸ”₯ multi-thread safe with regard to other lookup threads, and read-write concurrency can be enabled by setting a flag during table creation.

Parameters:

  • h β€” hash table to look in.
  • keys β€” a pointer to a list of keys to look for.
  • num_keys β€” how many keys are in the keys list (less than RTE_HASH_LOOKUP_BULK_MAX).
  • hit_mask β€” output containing a bitmask with all successful lookups.
  • data β€” output containing array of data returned from all the successful lookups.

Returns:

  • -EINVAL if there's an error, otherwise number of successful lookups. ✨

🌸 rte_hash_lookup_with_hash_bulk πŸ’…

int rte_hash_lookup_with_hash_bulk (const struct rte_hash * h, const void ** keys, hash_sig_t * sig, uint32_t num_keys, int32_t * positions)

okay bestie, this one is giving look up a whole lil squad of keys at once, except you already did the hashing homework yourself and you're passing the precomputed hash values in. Efficiency queen behavior πŸ‘‘

This operation is multi-thread safe with regarding to other lookup threads. Read-write concurrency can be enabled by setting flag during table creation. πŸ”₯

Parameters 🫢

  • h β€” Hash table to look in.
  • keys β€” A pointer to a list of keys to look for.
  • sig β€” A pointer to a list of precomputed hash values for keys.
  • num_keys β€” How many keys are in the keys list (less than RTE_HASH_LOOKUP_BULK_MAX).
  • positions β€” Output containing a list of values, corresponding to the list of keys that can be used by the caller as an offset into an array of user data. These values are unique for each key, and are the same values that were returned when each key was added. If a key in the list was not found, then -ENOENT will be the value.

Returns ✨

  • -EINVAL if there's an error, otherwise 0.

πŸ¦‹ rte_hash_lookup_with_hash_bulk_data πŸ’–

int rte_hash_lookup_with_hash_bulk_data (const struct rte_hash * h, const void ** keys, hash_sig_t * sig, uint32_t num_keys, uint64_t * hit_mask, void * data[])

same energy as the one above β€” you're looking up a batch of keys and you already brought your own precomputed hash value array, no cap. πŸ“š

This operation is multi-thread safe with regarding to other lookup threads. Read-write concurrency can be enabled by setting flag during table creation. πŸ’«

Parameters πŸŽ€

  • h β€” Hash table to look in.
  • keys β€” A pointer to a list of keys to look for.
  • sig β€” A pointer to a list of precomputed hash values for keys.
  • num_keys β€” How many keys are in the keys list (less than RTE_HASH_LOOKUP_BULK_MAX).
  • hit_mask β€” Output containing a bitmask with all successful lookups. 🎯
  • data β€” Output containing array of data returned from all the successful lookups.

Returns 🌈

  • -EINVAL if there's an error, otherwise number of successful lookups.

🌸 rte_hash_lookup_bulk πŸ‘‘

int rte_hash_lookup_bulk (const struct rte_hash * h, const void ** keys, uint32_t num_keys, int32_t * positions)

the classic bulk lookup, but this time you don't hand over any hash values β€” the table does that part itself. Main character energy fr. πŸ’…

This operation is multi-thread safe with regarding to other lookup threads. Read-write concurrency can be enabled by setting flag during table creation. πŸ”₯

Parameters 🫢

  • h β€” Hash table to look in.
  • keys β€” A pointer to a list of keys to look for.
  • num_keys β€” How many keys are in the keys list (less than RTE_HASH_LOOKUP_BULK_MAX).
  • positions β€” Output containing a list of values, corresponding to the list of keys that can be used by the caller as an offset into an array of user data. These values are unique for each key, and are the same values that were returned when each key was added. If a key in the list was not found, then -ENOENT will be the value.

Returns ✨

  • -EINVAL if there's an error, otherwise 0.

🧚 rte_hash_iterate ⭐

int32_t rte_hash_iterate (const struct rte_hash * h, const void ** key, void ** data, uint32_t * next)

bestie this is the "just walk through the whole table" one. Iterate through the hash table, returning key-value pairs. πŸšΆβ€β™€οΈβœ¨

Parameters πŸ’œ

  • h β€” Hash table to iterate
  • key β€” Output containing the key where current iterator was pointing at
  • data β€” Output containing the data associated with key. Returns NULL if data was not stored.
  • next β€” Pointer to iterator. Should be 0 to start iterating the hash table. Iterator is incremented after each call of this function.

Returns 🌟

Position where key was stored, if successful.

  • -EINVAL if the parameters are invalid.
  • -ENOENT if end of the hash table.

πŸŽ€ rte_hash_rcu_qsbr_add 🌈

int rte_hash_rcu_qsbr_add (struct rte_hash * h, struct rte_hash_rcu_config * cfg)

Associate RCU QSBR variable with a Hash object. This API should be called to enable the integrated RCU QSBR support and should be called immediately after creating the Hash object. Don't be late to this party, ok? ⏰

Parameters 🫢

  • h β€” the hash object to add RCU QSBR
  • cfg β€” RCU QSBR configuration

Returns πŸ’«

On success - 0 On error - 1 with error code set in rte_errno. Possible rte_errno codes are:

  • EINVAL - invalid pointer
  • EEXIST - already added QSBR
  • ENOMEM - memory allocation failure

πŸ¦‹ rte_hash_rcu_qsbr_dq_reclaim πŸ’€βœ¨

__rte_experimental int rte_hash_rcu_qsbr_dq_reclaim (struct rte_hash * h, unsigned int * freed, unsigned int * pending, unsigned int * available)

Reclaim resources from the defer queue. This API reclaim the resources from the defer queue if rcu is enabled. Get that memory back, periodt. ♻️

heads up bestie β€” this one is marked __rte_experimental, so it's the "still figuring itself out" era of API. πŸ™ˆ

Parameters πŸ“

  • h β€” The hash object to reclaim resources.
  • freed β€” Number of resources that were freed.
  • pending β€” Number of resources pending on the defer queue. This number might not be accurate if multi-thread safety is configured. 😭
  • available β€” Number of resources that can be added to the defer queue. This number might not be accurate if multi-thread safety is configured. 😭

Returns πŸ’–

On success - 0 On error - 1 with error code set in rte_errno. Possible rte_errno codes are:

  • EINVAL - invalid pointer

✨ Author ✨

Generated automatically by Doxygen for DPDK from the source code.


aaaand that's a wrap on rte_hash.h(3) bestie!! πŸ₯³πŸ’– this gorgeous lil page comes to you from DPDK Version 25.11.3 β€” go forth and hash responsibly, you absolute icon πŸ‘‘πŸ¦‹πŸ’…

πŸ“¦ where this page comes from