rte_hash.h(3)
πΈ NAME πΈ
rte_hash.h(3) β bestie, this is the page from the Library Functions Manual, and it's literally the header for the RTE Hash Table. The name is rte_hash.h, and it's giving main-character header-file energy. π
β¨ SYNOPSIS β¨
Include these, no cap:
#include <stdint.h>
#include <stddef.h>
#include <rte_common.h>
#include <rte_rcu_qsbr.h>
π¦ Data Structures
struct rte_hash_parametersstruct 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_ttypedef 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 β yup, that's the whole vibe.
Definition in file rte_hash.h.
π Macro Definition Documentation π
π #define RTE_HASH_ENTRIES_MAX (1 << 30) π
This is the absolute maximum size of a hash table that can be created, bestie. Big-table ceiling energy.
Definition at line 25 of file rte_hash.h.
π #define RTE_HASH_NAMESIZE 32 π
Maximum number of characters in a hash name. Keep it cute and within 32, okay? π
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. Bulk lookup, but make it capped at 64.
Definition at line 31 of file rte_hash.h.
π #define RTE_HASH_EXTRA_FLAGS_TRANS_MEM_SUPPORT 0x01 π
Enable Hardware transactional memory support. Fancy hardware moment.
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. Pick your insertion era.
Definition at line 38 of file rte_hash.h.
π #define RTE_HASH_EXTRA_FLAGS_RW_CONCURRENCY 0x04 π
Flag to support reader writer concurrency. Readers and writers can share the spotlight.
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. Extendable bucket table, slay.
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. Delete-time memory lore, iykyk.
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 and multi-writer inclusive.
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. Randomized 32bit-ish hash tea.
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. Custom hash calculator vibes.
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. Comparison function, but make it yours.
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. RCU cleanup duties, bestie.
Definition at line 77 of file rte_hash.h.
π Enumeration Type Documentation π
π enum rte_hash_qsbr_mode π
RCU reclamation modes. Choose your reclaim era.
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. Cleanup queen behavior.
Parameters
hβ Hash table to free, ifNULL, the function does nothing.
π«Ά struct rte_hash * rte_hash_create (const struct rte_hash_parameters *params) π«Ά
Create a new hash table. New table, new me.
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 torte_configstructureE_RTE_SECONDARYβ function was called from a secondary process instanceENOENTβ missing entryEINVALβ invalid parameter passed to functionENOSPCβ the maximum number of memzones has already been allocatedEEXISTβ a memzone with the same name already existsENOMEMβ 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. Custom compare function glow-up.
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 changedfuncβ 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. Where did that table go? Found it.
Parameters
nameβ Name of the hash table as passed torte_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. Reset responsibly, bestie.
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. Count check, periodt.
Parameters
hβ Hash table to query from
Returns
-EINVALif 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. Max key ID lore.
Parameters
hβ Hash table to query from
Returns
-EINVALif 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. Data swap drama, but make it documented.
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
0if added successfully-EINVALif the parameters are invalid.-ENOSPCif there is no space in the hash for this key.
π rte_hash_add_key_with_hash_data
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 into a hash table you already have, and you hand it a hash you already computed (sig) so it doesn't have to redo that work. Efficiency slay. β¨
β οΈ Real talk: this operation is not multi-thread safe and by default you should only call it from one thread. If you want thread safety you gotta enable it by setting a flag during table creation. No flag, no party.
And here's the juicy bit: if the key already exists in the table, this API updates its value with the data you passed in. Neat, but β if RCU is configured with a free_key_data_func callback, the old data gets automatically deferred-freed via RCU. If it isn't? The memory associated with the old value is your problem, bestie, application's responsibility, manage it yourself. π And heads up: readers might still be using the old value even after this API has returned. So don't get too comfy.
Parameters
hβ hash table to add the key to.keyβ the key to add to the hash table.sigβ precomputed hash value forkey.dataβ the data to add to the hash table.
Returns
0if it added successfully π-EINVALif the parameters are invalid.-ENOSPCif there's no space in the hash for this key. (Table full. It happens.) π
πΈ rte_hash_add_key
int32_t rte_hash_add_key (const struct rte_hash * h, const void * key)
Add a key to an existing hash table. That's it, that's the vibe. π¦
β οΈ Again for the people in the back: not multi-thread safe, call it from one thread by default. Thread safety can be enabled by setting a flag during table creation.
Parameters
hβ hash table to add the key to.keyβ the key to add to the hash table.
Returns
-EINVALif the parameters are invalid.-ENOSPCif there's no space in the hash for this key.- A non-negative value that you (the caller) can use as an offset into an array of user data. This value is unique for this key π. One tiny detail: this unique key id may be larger than the user-specified entry count when the
RTE_HASH_EXTRA_FLAGS_MULTI_WRITER_ADDflag is set. Not a bug, just how it is.
π rte_hash_add_key_with_hash
int32_t rte_hash_add_key_with_hash (const struct rte_hash * h,
const void * key, hash_sig_t sig)
Same energy as rte_hash_add_key but you already did the hashing homework and you're passing in sig so it doesn't redo it. Iconic time-saver. π
β οΈ Not multi-thread safe β one thread by default, unless you set the flag at table creation to turn thread safety on.
Parameters
hβ hash table to add the key to.keyβ the key to add to the hash table.sigβ precomputed hash value forkey.
Returns
-EINVALif the parameters are invalid.-ENOSPCif there's no space in the hash for this key.- A non-negative value usable 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_ADDis set.
π¦ rte_hash_del_key
int32_t rte_hash_del_key (const struct rte_hash * h, const void * key)
Remove a key from an existing hash table. Breaking up with the key, respectfully. π
β οΈ Not multi-thread safe β one thread by default, thread safety enabled via a flag at table creation.
Now the β¨fine printβ¨ that lowkey matters a lot: 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. You gotta call rte_hash_free_key_with_position additionally to free the index associated with the key. And you should call rte_hash_free_key_with_position after all the readers have stopped referencing the entry corresponding to this key β RCU mechanisms could be used to determine such a state. Don't rush it, bestie.
Parameters
hβ hash table to remove the key from.keyβ the key to remove from the hash table.
Returns
-EINVALif the parameters are invalid.-ENOENTif the key is not found. (It's not there. It's giving nothing.) π- 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. Consistency queen. π
π rte_hash_del_key_with_hash
int32_t rte_hash_del_key_with_hash (const struct rte_hash * h,
const void * key, hash_sig_t sig)
Remove a key from an existing hash table, but with a precomputed sig so it doesn't re-hash. Same whole vibe as rte_hash_del_key, just faster because you came prepared. β
β οΈ Not multi-thread safe β one thread by default, flag at table creation enables thread safety.
And the same caveat, word for word important: 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. You must call rte_hash_free_key_with_position additionally to free the index associated with the key β and 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β the key to remove from the hash table.sigβ precomputed hash value forkey.
Returns
-EINVALif the parameters are invalid.-ENOENTif 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 that was returned when the key was added.
π§ rte_hash_get_key_with_position
int rte_hash_get_key_with_position (const struct rte_hash * h,
const int32_t position, void ** key)
Give it a position and it finds the key sitting there. Reverse lookup energy. π
Good news for once: this operation 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β the position returned when the key was inserted.keyβ output containing a pointer to the key.
Returns
0if retrieved successfully β¨-EINVALif the parameters are invalid.-ENOENTif no valid key is found in the given position.
π rte_hash_free_key_with_position
int rte_hash_free_key_with_position (const struct rte_hash * h,
const int32_t position)
Free a hash key in the hash table given the position of the key. This is the cleanup bestie you call after a delete in certain configs. π§Ή
β οΈ Not multi-thread safe β one thread by default, thread safety via the table-creation flag.
When does this matter? 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_del_key_xxx APIs must be freed using this API. And you call it after all the readers have stopped referencing the entry corresponding to this key β RCU mechanisms could be used to determine such a state. β
π And a warning-warning: this API does not validate if the key is already freed. Double-free? Not its problem. That's on you, friend.
Parameters
hβ hash table to free the key from.positionβ the position returned when the key was deleted.
Returns
0if freed successfully π-EINVALif the parameters are invalid.
π rte_hash_lookup_data
int rte_hash_lookup_data (const struct rte_hash * h, const void * key,
void ** data)
Find a key-value pair in the hash table β and it hands you the data pointer through data. Two for one, we love to see it. π«Ά
This one is 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.keyβ the key to find.dataβ output with a 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 that was returned when the key was added.
-EINVALif the parameters are invalid.-ENOENTif the key is not found. π
π
rte_hash_lookup_with_hash_data
int rte_hash_lookup_with_hash_data (const struct rte_hash * h,
const void * key, hash_sig_t sig, void ** data)
Find a key-value pair using a pre-computed hash value in an existing hash table β so again, you bring the sig, it brings the results. β¨
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.keyβ the key to find.sigβ precomputed hash value forkey.dataβ output with a 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 that was returned when the key was added.
-EINVALif the parameters are invalid.-ENOENTif the key is not found.
π rte_hash_lookup
int32_t rte_hash_lookup (const struct rte_hash * h, const void * key)
Find a key in the hash table. Simple, clean, does exactly what it says on the label. π
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β the key to find.
Returns
-EINVALif the parameters are invalid.-ENOENTif 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 that was returned when the key was added.
β rte_hash_lookup_with_hash
int32_t rte_hash_lookup_with_hash (const struct rte_hash * h,
const void * key, hash_sig_t sig)
Find a key in the hash table, but skip the hashing step because you already got sig. Efficiency is a love language. π
Multi-thread safe with regard to other lookup threads, and read-write concurrency can be enabled via a flag at table creation.
Parameters
hβ hash table to look in.keyβ the key to find.sigβ precomputed hash value forkey.
Returns
-EINVALif the parameters are invalid.-ENOENTif 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 that was returned when the key was added.
π₯ rte_hash_hash
hash_sig_t rte_hash_hash (const struct rte_hash * h, const void * key)
Calc a hash value by key. This is where sig values come from, so if you're doing the with-hash APIs, this is your girl. πΈ
β οΈ Heads up: this operation is not multi-process safe. Multi-thread? Fine. Multi-process? Nope.
Parameters
hβ hash table to look in.keyβ the key to find.
Returns
- hash value β¨
π¦ rte_hash_lookup_bulk_data
int rte_hash_lookup_bulk_data (const struct rte_hash * h,
const void ** keys, uint32_t num_keys, uint64_t * hit_mask, void * data[])
Find multiple keys in the hash table in one go. Batch lookup, main character energy. π
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 thanRTE_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
-EINVALif there's an error, otherwise the number of successful lookups. π
π
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 so bestie, this one is the bulk lookup, but make it efficient β you're finding multiple keys in the hash table and you already have the precomputed hash value array ready to go. Iconic behavior, no notes. β¨
This operation is multi-thread safe with regarding to other lookup threads. And listen β read-write concurrency can be enabled by setting flag during table creation. iykyk π«Ά
Parameters
hβ the 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 thanRTE_HASH_LOOKUP_BULK_MAX, okurr).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-ENOENTwill be the value. π
Returns
-EINVAL if there's an error, otherwise 0. periodt.
πΈ 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[])
Bestie this one's the same vibe as the last one β find multiple keys in the hash table with the precomputed hash value array β except it hands you back the data too. Main character energy fr 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.sigβ a pointer to a list of precomputed hash values for keys.num_keysβ how many keys are in the keys list (less thanRTE_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. Slay.
β int rte_hash_lookup_bulk (const struct rte_hash * h, const void ** keys, uint32_t num_keys, int32_t * positions)
Find multiple keys in the hash table β the classic, no precomputed hashes required. 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 thanRTE_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-ENOENTwill be the value. π
Returns
-EINVAL if there's an error, otherwise 0.
π¦ int32_t rte_hash_iterate (const struct rte_hash * h, const void ** key, void ** data, uint32_t * next)
Iterate through the hash table, returning key-value pairs. It's giving loop era, honestly. π
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. ReturnsNULLif data was not stored.nextβ pointer to iterator. Should be0to start iterating the hash table. Iterator is incremented after each call of this function.
Returns
Position where key was stored, if successful.
-EINVALif the parameters are invalid. π-ENOENTif end of the hash table. π
π§ 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. Like, don't wait around, bestie β timing matters here. β°β¨
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 pointerEEXIST- already added QSBRENOMEM- memory allocation failure
π __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. Cleaning up is self-care, periodt. π§Ήπ
Heads up bestie β this one's marked __rte_experimental, so treat it accordingly. β οΈ
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. (Yeah, both of those caveats are real β don't come for me.) π
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. Not me writing my own hype bio, but honestly? Respect the bot. π«Ά
And that's a wrap on rte_hash.h(3), bestie! π You just read it from DPDK Version 26.03.0 β go forth and hash responsibly. Mwah πβ¨
π¦ where this page comes from
- nixos 26.05: dpdk 26.03
- nixpkgs unstable: dpdk 26.03
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms