From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 6744A431E0; Mon, 23 Oct 2023 10:55:36 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id E078940EDC; Mon, 23 Oct 2023 10:55:09 +0200 (CEST) Received: from guvercin.ceng.metu.edu.tr (guvercin.ceng.metu.edu.tr [144.122.171.43]) by mails.dpdk.org (Postfix) with ESMTP id 1E6A140262 for ; Mon, 23 Oct 2023 10:12:07 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by guvercin.ceng.metu.edu.tr (Postfix) with ESMTP id 5E2F12C35A; Mon, 23 Oct 2023 11:12:02 +0300 (+03) X-Virus-Scanned: Debian amavisd-new at ceng.metu.edu.tr Received: from guvercin.ceng.metu.edu.tr ([127.0.0.1]) by localhost (guvercin.ceng.metu.edu.tr [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id HcvTCUKOHuNV; Mon, 23 Oct 2023 11:11:58 +0300 (+03) Received: from dcu.otaknetworks.com (unknown [212.156.37.190]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: e1885458) by guvercin.ceng.metu.edu.tr (Postfix) with ESMTPSA id D10B72C1DD; Mon, 23 Oct 2023 11:11:57 +0300 (+03) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ceng.metu.edu.tr; s=mail; t=1698048718; bh=VgyYzKzGZ4PXPsJHP/rVzNII0meYE87XzrFplaBYzNM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=FdGGSA8WFWsPqXf9r+tEqpjYpKThLiQOzs19buW98Wx/ylWXa3IOMGaU65ZWB93Ag ld4iT6f4LDHFqiIYrYiG/sFoo/D7IbZL7evItPMsCGmQdvPfxCfwDR7+Zd9rRrvLjP Lr2CwyCwMKNLzCnCuKF4gXDCZK0DktEgMYnjvXzA= From: =?UTF-8?q?Abdullah=20=C3=96mer=20Yama=C3=A7?= To: dev@dpdk.org Cc: =?UTF-8?q?Abdullah=20=C3=96mer=20Yama=C3=A7?= , Yipeng Wang , Sameh Gobriel , Bruce Richardson , Vladimir Medvedkin , David Marchand Subject: [PATCH v2] lib/hash: new feature adding existing key Date: Mon, 23 Oct 2023 08:11:55 +0000 Message-Id: <20231023081155.255711-1-omer.yamac@ceng.metu.edu.tr> X-Mailer: git-send-email 2.34.1 In-Reply-To: References: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Mailman-Approved-At: Mon, 23 Oct 2023 10:55:02 +0200 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org 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ç --- Cc: Yipeng Wang Cc: Sameh Gobriel Cc: Bruce Richardson Cc: Vladimir Medvedkin Cc: David Marchand --- 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