hash: new function to retrieve a key given its position
PATCH v2 1/1 hash: new function to retrieve a key given its position
The function rte_hash_get_key_with_position is added in this patch. As the position returned when adding a key is frequently used as an offset into an array of user data, this function performs the operation of retrieving a key given this offset.
A possible use case would be to delete a key from the hash table when its entry in the array of data has certain value. For instance, the key could be a flow 5-tuple, and the value stored in the array a time stamp.
--- app/test/test_hash.c | 42 ++++++++++++++++++++++++++++++++++++ lib/librte_hash/rte_cuckoo_hash.c | 18 ++++++++++++++++ lib/librte_hash/rte_hash.h | 18 ++++++++++++++++ lib/librte_hash/rte_hash_version.map | 7 ++++++ 4 files changed, 85 insertions(+)
app/test/test_hash.c +42 -0
@@ -421,6 +421,46 @@ static int test_add_update_delete(void) }/* +* Sequence of operations for retrieving a key with its position +* +* - create table +* - add key +* - get the key with its position: hit +* - delete key +* - try to get the deleted key: miss +* +*/ +static int test_hash_get_key_with_position (void ) +{ +struct rte_hash *handle =NULL ; +int pos, expectedPos, result; +void *key; + + ut_params.name ="hash_get_key_with_position" ; + handle =rte_hash_create (&ut_params); +RETURN_IF_ERROR (handle ==NULL ,"hash creation failed" ); + + pos =rte_hash_add_key (handle, &keys[0 ]); +print_key_info ("Add" , &keys[0 ], pos); +RETURN_IF_ERROR (pos <0 ,"failed to add key (pos0=%d)" , pos); + expectedPos = pos; + + result =rte_hash_get_key_with_position (handle, pos, &key); +RETURN_IF_ERROR (result !=0 ,"error retrieving a key" ); + + pos =rte_hash_del_key (handle, &keys[0 ]); +print_key_info ("Del" , &keys[0 ], pos); +RETURN_IF_ERROR (pos != expectedPos, +"failed to delete key (pos0=%d)" , pos); + + result =rte_hash_get_key_with_position (handle, pos, &key); +RETURN_IF_ERROR (result != -ENOENT ,"non valid key retrieved" ); + +rte_hash_free (handle); +return 0 ; +} + +/* * Sequence of operations for find existing hash table * * - create table
@@ -1442,6 +1482,8 @@ test_hash(void)return -1 ;if (test_hash_add_delete_jhash_3word () <0 )return -1 ; +if (test_hash_get_key_with_position () <0 ) +return -1 ;if (test_hash_find_existing () <0 )return -1 ;if (test_add_update_delete () <0 )
lib/librte_hash/rte_cuckoo_hash.c +18 -0
@@ -973,6 +973,24 @@ rte_hash_del_key(const struct rte_hash *h, const void *key)return __rte_hash_del_key_with_hash (h, key,rte_hash_hash (h, key)); } +int +rte_hash_get_key_with_position (const struct rte_hash *h,const int32_t position, +void **key) +{ +RETURN_IF_TRUE (((h ==NULL ) || (key ==NULL )), -EINVAL ); + +struct rte_hash_key *k, *keys = h->key_store; + k = (struct rte_hash_key *) ((char *) keys + (position +1 ) * h->key_entry_size); + *key = k->key; + +if (position != +__rte_hash_lookup_with_hash (h, *key,rte_hash_hash (h, *key),NULL )) { +return -ENOENT ; + } + +return 0 ; +} +/* Lookup bulk stage 0: Prefetch input key */ static inline void lookup_stage0(unsigned *idx, uint64_t *lookup_mask,
lib/librte_hash/rte_hash.h +18 -0
@@ -268,6 +268,24 @@ 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); +/** +* Find a key in the hash table given the position. +* This operation is multi-thread safe. +* +* @param h +* Hash table to get the key from. +* @param position +* Position returned when the key was inserted. +* @param key +* Output containing a pointer to the key +* @return +* - 0 if retrieved successfully +* - EINVAL if the parameters are invalid. +* - ENOENT if no valid key is found in the given position. +*/ +int +rte_hash_get_key_with_position (const struct rte_hash *h,const int32_t position, +void **key);/** * Find a key-value pair in the hash table.
lib/librte_hash/rte_hash_version.map +7 -0
@@ -38,3 +38,10 @@ DPDK_2.2 { rte_hash_set_cmp_func; } DPDK_2.1; + +DPDK_16.07 { + global: + + rte_hash_get_key_with_position; + +}; DPDK_2.2
Signature · 1 line
2.1.4
Quoted 45 lines
-----Original Message-----
From: dev [mailto:[email protected]] On Behalf Of Yari Adan Petralanda
Sent: Friday, June 17, 2016 12:00 PM
To: [email protected]
Subject: [dpdk-dev] [PATCH v2] hash: new function to retrieve a key given its positionThe function
rte_hash_get_key_with_positionis added in this patch. As the position returned when adding a key is frequently used as an offset into an array of user data, this function performs the operation of retrieving a key given this offset.A possible use case would be to delete a key from the hash table when its entry in the array of data has certain value. For instance, the key could be a flow 5-tuple, and the value stored in the array a time stamp.
Signed-off-by: Juan Antonio Montesinos
<[email protected]>Signed-off-by Yari Adan Petralanda <[email protected]>--- app/test/test_hash.c | 42 ++++++++++++++++++++++++++++++++++++ lib/librte_hash/rte_cuckoo_hash.c | 18 ++++++++++++++++ lib/librte_hash/rte_hash.h | 18 ++++++++++++++++ lib/librte_hash/rte_hash_version.map | 7 ++++++ 4 files changed, 85 insertions(+)app/test/test_hash.c +6
-0@@ -421,6 +421,46 @@ static int test_add_update_delete(void) }/* +* Sequence of operations for retrieving a key with its position +* +* - create table +* - add key +* - get the key with its position: hit +* - delete key
app/test/test_hash.c static int test_add_update_delete(void) · line 439
Quoted 10 lines
app/test/test_hash.c +10
-0+* - try to get the deleted key: miss +* +*/ +static int test_hash_get_key_with_position (void ) +{ +struct rte_hash *handle =NULL ; +int pos, expectedPos, result; +void *key; + + ut_params.name ="hash_get_key_with_position" ;
The name is too long and causes rte_hash_create() to fail (therefore, test does not work), as internal ring name results in more than 32 characters.
Could you rename it to something shorter? hash_get_key_with_pos?
app/test/test_hash.c static int test_add_update_delete(void) · line 446
Quoted 7 lines
app/test/test_hash.c +7
-0+ handle =rte_hash_create (&ut_params); +RETURN_IF_ERROR (handle ==NULL ,"hash creation failed" ); + + pos =rte_hash_add_key (handle, &keys[0 ]); +print_key_info ("Add" , &keys[0 ], pos); +RETURN_IF_ERROR (pos <0 ,"failed to add key (pos0=%d)" , pos); + expectedPos = pos;
[...]
Rest of the patch looks good to me.