In some use cases inserting data with the same key shouldn't be overwritten. We use a new flag in this patch to disable overwriting data for the same key.
Signed-off-by: Abdullah Ömer Yamaç <omer.ya...@ceng.metu.edu.tr> --- Cc: Yipeng Wang <yipeng1.w...@intel.com> Cc: Sameh Gobriel <sameh.gobr...@intel.com> Cc: Bruce Richardson <bruce.richard...@intel.com> Cc: Vladimir Medvedkin <vladimir.medved...@intel.com> Cc: David Marchand <david.march...@redhat.com> --- lib/hash/rte_cuckoo_hash.c | 10 +++++++++- lib/hash/rte_cuckoo_hash.h | 2 ++ lib/hash/rte_hash.h | 4 ++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/lib/hash/rte_cuckoo_hash.c b/lib/hash/rte_cuckoo_hash.c index 19b23f2a97..fe8f21bee4 100644 --- a/lib/hash/rte_cuckoo_hash.c +++ b/lib/hash/rte_cuckoo_hash.c @@ -32,7 +32,8 @@ RTE_HASH_EXTRA_FLAGS_RW_CONCURRENCY | \ RTE_HASH_EXTRA_FLAGS_EXT_TABLE | \ RTE_HASH_EXTRA_FLAGS_NO_FREE_ON_DEL | \ - RTE_HASH_EXTRA_FLAGS_RW_CONCURRENCY_LF) + RTE_HASH_EXTRA_FLAGS_RW_CONCURRENCY_LF | \ + RTE_HASH_EXTRA_FLAGS_DISABLE_UPDATE_EXISTING_KEY) #define FOR_EACH_BUCKET(CURRENT_BKT, START_BUCKET) \ for (CURRENT_BKT = START_BUCKET; \ @@ -148,6 +149,7 @@ rte_hash_create(const struct rte_hash_parameters *params) unsigned int readwrite_concur_support = 0; unsigned int writer_takes_lock = 0; unsigned int no_free_on_del = 0; + unsigned int no_update_data = 0; uint32_t *ext_bkt_to_free = NULL; uint32_t *tbl_chng_cnt = NULL; struct lcore_cache *local_free_slots = NULL; @@ -216,6 +218,9 @@ rte_hash_create(const struct rte_hash_parameters *params) no_free_on_del = 1; } + if (params->extra_flag & RTE_HASH_EXTRA_FLAGS_DISABLE_UPDATE_EXISTING_KEY) + no_update_data = 1; + /* Store all keys and leave the first entry as a dummy entry for lookup_bulk */ if (use_local_cache) /* @@ -428,6 +433,7 @@ rte_hash_create(const struct rte_hash_parameters *params) h->ext_table_support = ext_table_support; h->writer_takes_lock = writer_takes_lock; h->no_free_on_del = no_free_on_del; + h->no_update_data = no_update_data; h->readwrite_concur_lf_support = readwrite_concur_lf_support; #if defined(RTE_ARCH_X86) @@ -707,6 +713,8 @@ search_and_update(const struct rte_hash *h, void *data, const void *key, k = (struct rte_hash_key *) ((char *)keys + bkt->key_idx[i] * h->key_entry_size); if (rte_hash_cmp_eq(key, k->key, h) == 0) { + if (h->no_update_data == 1) + return -EINVAL; /* The store to application data at *data * should not leak after the store to pdata * in the key store. i.e. pdata is the guard diff --git a/lib/hash/rte_cuckoo_hash.h b/lib/hash/rte_cuckoo_hash.h index eb2644f74b..e8b7283ec2 100644 --- a/lib/hash/rte_cuckoo_hash.h +++ b/lib/hash/rte_cuckoo_hash.h @@ -193,6 +193,8 @@ struct rte_hash { /**< If read-write concurrency support is enabled */ uint8_t ext_table_support; /**< Enable extendable bucket table */ uint8_t no_free_on_del; + /**< If update is prohibited on adding same key */ + uint8_t no_update_data; /**< If key index should be freed on calling rte_hash_del_xxx APIs. * If this is set, rte_hash_free_key_with_position must be called to * free the key index associated with the deleted entry. diff --git a/lib/hash/rte_hash.h b/lib/hash/rte_hash.h index 7ecc021111..ca5b4841d2 100644 --- a/lib/hash/rte_hash.h +++ b/lib/hash/rte_hash.h @@ -55,6 +55,10 @@ extern "C" { */ #define RTE_HASH_EXTRA_FLAGS_RW_CONCURRENCY_LF 0x20 +/** Flag to disable updating data of existing key + */ +#define RTE_HASH_EXTRA_FLAGS_DISABLE_UPDATE_EXISTING_KEY 0x40 + /** * The type of hash value of a key. * It should be a value of at least 32bit with fully random pattern. -- 2.34.1