From patchwork Mon Mar 13 07:26:07 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?b?QWJkdWxsYWggw5ZtZXIgWWFtYcOn?= X-Patchwork-Id: 125060 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id CD66841E83; Mon, 13 Mar 2023 08:26:24 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 636D7406BC; Mon, 13 Mar 2023 08:26:24 +0100 (CET) Received: from guvercin.ceng.metu.edu.tr (guvercin.ceng.metu.edu.tr [144.122.171.43]) by mails.dpdk.org (Postfix) with ESMTP id 4163A40151 for ; Mon, 13 Mar 2023 08:26:23 +0100 (CET) Received: from localhost (localhost [127.0.0.1]) by guvercin.ceng.metu.edu.tr (Postfix) with ESMTP id CE3822C628; Mon, 13 Mar 2023 10:26:19 +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 fQvRheljp7L2; Mon, 13 Mar 2023 10:26:09 +0300 (+03) Received: from 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 CB38B2C513; Mon, 13 Mar 2023 10:26:08 +0300 (+03) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ceng.metu.edu.tr; s=mail; t=1678692369; bh=nbSocrXIgZBndCaTMBrd+iDiHZzNljULbkzVfR3NzmU=; h=From:To:Cc:Subject:Date:From; b=Os3GvMDmQph0+HS2vEDzQ84rKNLD+hy989ffHS+P9UrYmXLXX66khlnx+iTZr1LnS olDxiMqvWCoiWfJQH3CYyjnZeeaiXh9eBLSh8424Bv/zgQF6cjQcfIenmECLoNNRZF OzcUXRxQp/w+LIskrTWxLyhsOQhARXe4zIpkHbIE= From: =?utf-8?b?QWJkdWxsYWggw5ZtZXIgWWFtYcOn?= To: yipeng1.wang@intel.com Cc: dev@dpdk.org, =?utf-8?b?QWJkdWxsYWggw5ZtZXIgWWFtYcOn?= Subject: [PATCH] lib/hash: new feature adding existing key Date: Mon, 13 Mar 2023 07:26:07 +0000 Message-Id: <20230313072607.3483-1-omer.yamac@ceng.metu.edu.tr> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 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 --- 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.