From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from foss.arm.com (usa-sjc-mx-foss1.foss.arm.com [217.140.101.70]) by dpdk.org (Postfix) with ESMTP id 04418493D; Thu, 9 May 2019 15:39:34 +0200 (CEST) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 6797415AD; Thu, 9 May 2019 06:39:33 -0700 (PDT) Received: from dp6132.austin.arm.com (dp6132.austin.arm.com [10.118.12.38]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id ECBDD3F738; Thu, 9 May 2019 06:39:32 -0700 (PDT) From: Dharmik Thakkar To: Yipeng Wang , Sameh Gobriel , Bruce Richardson , Pablo de Lara Cc: dev@dpdk.org, honnappa.nagarahalli@arm.com, zhongdahulinfan@163.com, Dharmik Thakkar , stable@dpdk.org Date: Thu, 9 May 2019 13:39:22 +0000 Message-Id: <20190509133924.7153-2-dharmik.thakkar@arm.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190509133924.7153-1-dharmik.thakkar@arm.com> References: <20190508225924.21200-1-dharmik.thakkar@arm.com> <20190509133924.7153-1-dharmik.thakkar@arm.com> Subject: [dpdk-dev] [PATCH v3 1/3] hash: fix position bug in 'free key with position' X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 09 May 2019 13:39:34 -0000 Currently, in rte_hash_free_key_with_position(), the position returned to the ring of free_slots leads to an unexpected conflict with a key already in use. This patch fixes incorrect position returned to the ring of free_slots. Bugzilla ID: 261 Fixes: 9d033dac7d7c ("hash: support no free on delete") Cc: honnappa.nagarahalli@arm.com Cc: stable@dpdk.org Reported-by: Linfan Suggested-by: Linfan Signed-off-by: Dharmik Thakkar --- lib/librte_hash/rte_cuckoo_hash.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/lib/librte_hash/rte_cuckoo_hash.c b/lib/librte_hash/rte_cuckoo_hash.c index 261267b7fd3d..8646ca52e60b 100644 --- a/lib/librte_hash/rte_cuckoo_hash.c +++ b/lib/librte_hash/rte_cuckoo_hash.c @@ -1587,14 +1587,17 @@ int __rte_experimental rte_hash_free_key_with_position(const struct rte_hash *h, const int32_t position) { - RETURN_IF_TRUE(((h == NULL) || (position == EMPTY_SLOT)), -EINVAL); + /* Key index where key is stored, adding the first dummy index*/ + uint32_t key_idx = position + 1; + + RETURN_IF_TRUE(((h == NULL) || (key_idx == EMPTY_SLOT)), -EINVAL); unsigned int lcore_id, n_slots; struct lcore_cache *cached_free_slots; const int32_t total_entries = h->num_buckets * RTE_HASH_BUCKET_ENTRIES; /* Out of bounds */ - if (position >= total_entries) + if (key_idx >= total_entries) return -EINVAL; if (h->ext_table_support && h->readwrite_concur_lf_support) { uint32_t index = h->ext_bkt_to_free[position]; @@ -1619,11 +1622,11 @@ rte_hash_free_key_with_position(const struct rte_hash *h, } /* Put index of new free slot in cache. */ cached_free_slots->objs[cached_free_slots->len] = - (void *)((uintptr_t)position); + (void *)((uintptr_t)key_idx); cached_free_slots->len++; } else { rte_ring_sp_enqueue(h->free_slots, - (void *)((uintptr_t)position)); + (void *)((uintptr_t)key_idx)); } return 0; -- 2.17.1 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by dpdk.space (Postfix) with ESMTP id 40AC2A0096 for ; Thu, 9 May 2019 15:39:45 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id D3C2B4CA0; Thu, 9 May 2019 15:39:38 +0200 (CEST) Received: from foss.arm.com (usa-sjc-mx-foss1.foss.arm.com [217.140.101.70]) by dpdk.org (Postfix) with ESMTP id 04418493D; Thu, 9 May 2019 15:39:34 +0200 (CEST) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 6797415AD; Thu, 9 May 2019 06:39:33 -0700 (PDT) Received: from dp6132.austin.arm.com (dp6132.austin.arm.com [10.118.12.38]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id ECBDD3F738; Thu, 9 May 2019 06:39:32 -0700 (PDT) From: Dharmik Thakkar To: Yipeng Wang , Sameh Gobriel , Bruce Richardson , Pablo de Lara Cc: dev@dpdk.org, honnappa.nagarahalli@arm.com, zhongdahulinfan@163.com, Dharmik Thakkar , stable@dpdk.org Date: Thu, 9 May 2019 13:39:22 +0000 Message-Id: <20190509133924.7153-2-dharmik.thakkar@arm.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190509133924.7153-1-dharmik.thakkar@arm.com> References: <20190508225924.21200-1-dharmik.thakkar@arm.com> <20190509133924.7153-1-dharmik.thakkar@arm.com> Subject: [dpdk-dev] [PATCH v3 1/3] hash: fix position bug in 'free key with position' X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Content-Type: text/plain; charset="UTF-8" Message-ID: <20190509133922.1UsfZaMcIOfw1kfv3wPKYGfuMbrSIOTSu70Af1vdDWQ@z> Currently, in rte_hash_free_key_with_position(), the position returned to the ring of free_slots leads to an unexpected conflict with a key already in use. This patch fixes incorrect position returned to the ring of free_slots. Bugzilla ID: 261 Fixes: 9d033dac7d7c ("hash: support no free on delete") Cc: honnappa.nagarahalli@arm.com Cc: stable@dpdk.org Reported-by: Linfan Suggested-by: Linfan Signed-off-by: Dharmik Thakkar --- lib/librte_hash/rte_cuckoo_hash.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/lib/librte_hash/rte_cuckoo_hash.c b/lib/librte_hash/rte_cuckoo_hash.c index 261267b7fd3d..8646ca52e60b 100644 --- a/lib/librte_hash/rte_cuckoo_hash.c +++ b/lib/librte_hash/rte_cuckoo_hash.c @@ -1587,14 +1587,17 @@ int __rte_experimental rte_hash_free_key_with_position(const struct rte_hash *h, const int32_t position) { - RETURN_IF_TRUE(((h == NULL) || (position == EMPTY_SLOT)), -EINVAL); + /* Key index where key is stored, adding the first dummy index*/ + uint32_t key_idx = position + 1; + + RETURN_IF_TRUE(((h == NULL) || (key_idx == EMPTY_SLOT)), -EINVAL); unsigned int lcore_id, n_slots; struct lcore_cache *cached_free_slots; const int32_t total_entries = h->num_buckets * RTE_HASH_BUCKET_ENTRIES; /* Out of bounds */ - if (position >= total_entries) + if (key_idx >= total_entries) return -EINVAL; if (h->ext_table_support && h->readwrite_concur_lf_support) { uint32_t index = h->ext_bkt_to_free[position]; @@ -1619,11 +1622,11 @@ rte_hash_free_key_with_position(const struct rte_hash *h, } /* Put index of new free slot in cache. */ cached_free_slots->objs[cached_free_slots->len] = - (void *)((uintptr_t)position); + (void *)((uintptr_t)key_idx); cached_free_slots->len++; } else { rte_ring_sp_enqueue(h->free_slots, - (void *)((uintptr_t)position)); + (void *)((uintptr_t)key_idx)); } return 0; -- 2.17.1