* [PATCH] lib/hash: new feature adding existing key
@ 2023-03-13 7:26 Abdullah Ömer Yamaç
2023-03-13 7:35 ` Abdullah Ömer Yamaç
0 siblings, 1 reply; 8+ messages in thread
From: Abdullah Ömer Yamaç @ 2023-03-13 7:26 UTC (permalink / raw)
To: yipeng1.wang; +Cc: dev, Abdullah Ömer Yamaç
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.yamac@ceng.metu.edu.tr>
---
Cc: Yipeng Wang <yipeng1.wang@intel.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 829b79c89a..cd87d6e4cd 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)
@@ -699,6 +705,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 -EALRDY;
/* 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 a399346d02..f8afb4e06d 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
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH] lib/hash: new feature adding existing key
2023-03-13 7:26 [PATCH] lib/hash: new feature adding existing key Abdullah Ömer Yamaç
@ 2023-03-13 7:35 ` Abdullah Ömer Yamaç
2023-03-13 15:48 ` Stephen Hemminger
2023-09-29 15:42 ` David Marchand
0 siblings, 2 replies; 8+ messages in thread
From: Abdullah Ömer Yamaç @ 2023-03-13 7:35 UTC (permalink / raw)
To: dev; +Cc: Abdullah Ömer Yamaç, Yipeng Wang
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.yamac@ceng.metu.edu.tr>
---
Cc: Yipeng Wang <yipeng1.wang@intel.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 829b79c89a..cd87d6e4cd 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)
@@ -699,6 +705,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 a399346d02..f8afb4e06d 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
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] lib/hash: new feature adding existing key
2023-03-13 7:35 ` Abdullah Ömer Yamaç
@ 2023-03-13 15:48 ` Stephen Hemminger
2023-09-29 15:42 ` David Marchand
1 sibling, 0 replies; 8+ messages in thread
From: Stephen Hemminger @ 2023-03-13 15:48 UTC (permalink / raw)
To: Abdullah Ömer Yamaç; +Cc: dev, Yipeng Wang
On Mon, 13 Mar 2023 07:35:48 +0000
Abdullah Ömer Yamaç <omer.yamac@ceng.metu.edu.tr> wrote:
> 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
This ends up being an ABI change. So needs to wait for 23.11 release
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] lib/hash: new feature adding existing key
2023-03-13 7:35 ` Abdullah Ömer Yamaç
2023-03-13 15:48 ` Stephen Hemminger
@ 2023-09-29 15:42 ` David Marchand
2023-10-23 8:11 ` [PATCH v2] " Abdullah Ömer Yamaç
2023-10-23 8:29 ` Abdullah Ömer Yamaç
1 sibling, 2 replies; 8+ messages in thread
From: David Marchand @ 2023-09-29 15:42 UTC (permalink / raw)
To: Abdullah Ömer Yamaç
Cc: dev, Yipeng Wang, Gobriel, Sameh, Bruce Richardson, Vladimir Medvedkin
On Mon, Mar 13, 2023 at 8:36 AM Abdullah Ömer Yamaç
<omer.yamac@ceng.metu.edu.tr> wrote:
>
> 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.yamac@ceng.metu.edu.tr>
If this patch is still relevant, please rebase it and send a new revision.
Don't forget to copy the library maintainers.
--
David Marchand
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v2] lib/hash: new feature adding existing key
2023-09-29 15:42 ` David Marchand
@ 2023-10-23 8:11 ` Abdullah Ömer Yamaç
2023-10-23 8:29 ` Abdullah Ömer Yamaç
1 sibling, 0 replies; 8+ messages in thread
From: Abdullah Ömer Yamaç @ 2023-10-23 8:11 UTC (permalink / raw)
To: dev
Cc: Abdullah Ömer Yamaç,
Yipeng Wang, Sameh Gobriel, Bruce Richardson, Vladimir Medvedkin,
David Marchand
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.yamac@ceng.metu.edu.tr>
---
Cc: Yipeng Wang <yipeng1.wang@intel.com>
Cc: Sameh Gobriel <sameh.gobriel@intel.com>
Cc: Bruce Richardson <bruce.richardson@intel.com>
Cc: Vladimir Medvedkin <vladimir.medvedkin@intel.com>
Cc: David Marchand <david.marchand@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
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v2] lib/hash: new feature adding existing key
2023-09-29 15:42 ` David Marchand
2023-10-23 8:11 ` [PATCH v2] " Abdullah Ömer Yamaç
@ 2023-10-23 8:29 ` Abdullah Ömer Yamaç
2024-02-16 12:43 ` Thomas Monjalon
1 sibling, 1 reply; 8+ messages in thread
From: Abdullah Ömer Yamaç @ 2023-10-23 8:29 UTC (permalink / raw)
To: dev
Cc: Abdullah Ömer Yamaç,
Yipeng Wang, Sameh Gobriel, Bruce Richardson, Vladimir Medvedkin,
David Marchand
From: Abdullah Ömer Yamaç <omer.yamac@ceng.metu.edu.tr>
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.yamac@ceng.metu.edu.tr>
---
Cc: Yipeng Wang <yipeng1.wang@intel.com>
Cc: Sameh Gobriel <sameh.gobriel@intel.com>
Cc: Bruce Richardson <bruce.richardson@intel.com>
Cc: Vladimir Medvedkin <vladimir.medvedkin@intel.com>
Cc: David Marchand <david.marchand@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
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2] lib/hash: new feature adding existing key
2023-10-23 8:29 ` Abdullah Ömer Yamaç
@ 2024-02-16 12:43 ` Thomas Monjalon
2024-10-03 22:37 ` Stephen Hemminger
0 siblings, 1 reply; 8+ messages in thread
From: Thomas Monjalon @ 2024-02-16 12:43 UTC (permalink / raw)
To: dev
Cc: Abdullah Ömer Yamaç,
Yipeng Wang, Sameh Gobriel, Bruce Richardson, Vladimir Medvedkin,
David Marchand, Abdullah Ömer Yamaç
Any review please?
If maintainers agree with the idea, we should announce the ABI change.
23/10/2023 10:29, Abdullah Ömer Yamaç:
> From: Abdullah Ömer Yamaç <omer.yamac@ceng.metu.edu.tr>
>
> 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.yamac@ceng.metu.edu.tr>
>
> ---
> Cc: Yipeng Wang <yipeng1.wang@intel.com>
> Cc: Sameh Gobriel <sameh.gobriel@intel.com>
> Cc: Bruce Richardson <bruce.richardson@intel.com>
> Cc: Vladimir Medvedkin <vladimir.medvedkin@intel.com>
> Cc: David Marchand <david.marchand@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.
>
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2] lib/hash: new feature adding existing key
2024-02-16 12:43 ` Thomas Monjalon
@ 2024-10-03 22:37 ` Stephen Hemminger
0 siblings, 0 replies; 8+ messages in thread
From: Stephen Hemminger @ 2024-10-03 22:37 UTC (permalink / raw)
To: Thomas Monjalon
Cc: dev, Abdullah Ömer Yamaç,
Yipeng Wang, Sameh Gobriel, Bruce Richardson, Vladimir Medvedkin,
David Marchand, Abdullah Ömer Yamaç
On Fri, 16 Feb 2024 13:43:52 +0100
Thomas Monjalon <thomas@monjalon.net> wrote:
> Any review please?
> If maintainers agree with the idea, we should announce the ABI change.
>
>
> 23/10/2023 10:29, Abdullah Ömer Yamaç:
> > From: Abdullah Ömer Yamaç <omer.yamac@ceng.metu.edu.tr>
> >
> > 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.yamac@ceng.metu.edu.tr>
> >
> > ---
> > Cc: Yipeng Wang <yipeng1.wang@intel.com>
> > Cc: Sameh Gobriel <sameh.gobriel@intel.com>
> > Cc: Bruce Richardson <bruce.richardson@intel.com>
> > Cc: Vladimir Medvedkin <vladimir.medvedkin@intel.com>
> > Cc: David Marchand <david.marchand@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;
This is buggy, the caller assumes -1 on error in several places.
See:
ret = search_and_update(h, data, key, prim_bkt, sig);
if (ret != -1) {
__hash_rw_writer_unlock(h);
*ret_val = ret;
return 1;
}
These paths would exercised when table had to expand.
Also any new functionality like this would need tests in functional test.
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2024-10-03 22:37 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-03-13 7:26 [PATCH] lib/hash: new feature adding existing key Abdullah Ömer Yamaç
2023-03-13 7:35 ` Abdullah Ömer Yamaç
2023-03-13 15:48 ` Stephen Hemminger
2023-09-29 15:42 ` David Marchand
2023-10-23 8:11 ` [PATCH v2] " Abdullah Ömer Yamaç
2023-10-23 8:29 ` Abdullah Ömer Yamaç
2024-02-16 12:43 ` Thomas Monjalon
2024-10-03 22:37 ` Stephen Hemminger
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).