From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id D030EA0613 for ; Tue, 27 Aug 2019 11:31:36 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id C41241BFE1; Tue, 27 Aug 2019 11:31:36 +0200 (CEST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by dpdk.org (Postfix) with ESMTP id CADBC1C0B2 for ; Tue, 27 Aug 2019 11:31:34 +0200 (CEST) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 44CEE3082E25; Tue, 27 Aug 2019 09:31:34 +0000 (UTC) Received: from rh.redhat.com (ovpn-117-48.ams2.redhat.com [10.36.117.48]) by smtp.corp.redhat.com (Postfix) with ESMTP id C52BF5C1D6; Tue, 27 Aug 2019 09:31:32 +0000 (UTC) From: Kevin Traynor To: Honnappa Nagarahalli Cc: Gavin Hu , Ruifeng Wang , Yipeng Wang , dpdk stable Date: Tue, 27 Aug 2019 10:30:12 +0100 Message-Id: <20190827093032.20423-35-ktraynor@redhat.com> In-Reply-To: <20190827093032.20423-1-ktraynor@redhat.com> References: <20190827093032.20423-1-ktraynor@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.46]); Tue, 27 Aug 2019 09:31:34 +0000 (UTC) Subject: [dpdk-stable] patch 'hash: use ordered loads only if signature matches' has been queued to LTS release 18.11.3 X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: stable-bounces@dpdk.org Sender: "stable" Hi, FYI, your patch has been queued to LTS release 18.11.3 Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet. It will be pushed if I get no objections before 09/03/19. So please shout if anyone has objections. Also note that after the patch there's a diff of the upstream commit vs the patch applied to the branch. This will indicate if there was any rebasing needed to apply to the stable branch. If there were code changes for rebasing (ie: not only metadata diffs), please double check that the rebase was correctly done. Queued patches are on a temporary branch at: https://github.com/kevintraynor/dpdk-stable-queue This queued commit can be viewed at: https://github.com/kevintraynor/dpdk-stable-queue/commit/2f0d98c0a96c87467ffc5b1be76ff45688eb039c Thanks. Kevin Traynor --- >From 2f0d98c0a96c87467ffc5b1be76ff45688eb039c Mon Sep 17 00:00:00 2001 From: Honnappa Nagarahalli Date: Tue, 2 Jul 2019 16:16:33 -0500 Subject: [PATCH] hash: use ordered loads only if signature matches [ upstream commit 4d9ca3ed213320eaef0d8a7e95b3b00c2d70800b ] Relaxed signature comparison is done first. Further ordered loads are done only if the signature matches. Any false positives are caught by the full key comparison. This provides performance benefits as load-acquire is executed only when required. Fixes: e605a1d36 ("hash: add lock-free r/w concurrency") Signed-off-by: Honnappa Nagarahalli Reviewed-by: Gavin Hu Tested-by: Ruifeng Wang Acked-by: Yipeng Wang --- lib/librte_hash/rte_cuckoo_hash.c | 37 +++++++++++++++++++------------ 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/lib/librte_hash/rte_cuckoo_hash.c b/lib/librte_hash/rte_cuckoo_hash.c index d7a5f4c21..e76277167 100644 --- a/lib/librte_hash/rte_cuckoo_hash.c +++ b/lib/librte_hash/rte_cuckoo_hash.c @@ -1169,20 +1169,29 @@ search_one_bucket_lf(const struct rte_hash *h, const void *key, uint16_t sig, for (i = 0; i < RTE_HASH_BUCKET_ENTRIES; i++) { - key_idx = __atomic_load_n(&bkt->key_idx[i], + /* Signature comparison is done before the acquire-load + * of the key index to achieve better performance. + * This can result in the reader loading old signature + * (which matches), while the key_idx is updated to a + * value that belongs to a new key. However, the full + * key comparison will ensure that the lookup fails. + */ + if (bkt->sig_current[i] == sig) { + key_idx = __atomic_load_n(&bkt->key_idx[i], __ATOMIC_ACQUIRE); - if (bkt->sig_current[i] == sig && key_idx != EMPTY_SLOT) { - k = (struct rte_hash_key *) ((char *)keys + - key_idx * h->key_entry_size); - pdata = __atomic_load_n(&k->pdata, - __ATOMIC_ACQUIRE); + if (key_idx != EMPTY_SLOT) { + k = (struct rte_hash_key *) ((char *)keys + + key_idx * h->key_entry_size); + pdata = __atomic_load_n(&k->pdata, + __ATOMIC_ACQUIRE); - if (rte_hash_cmp_eq(key, k->key, h) == 0) { - if (data != NULL) - *data = pdata; - /* - * Return index where key is stored, - * subtracting the first dummy index - */ - return key_idx - 1; + if (rte_hash_cmp_eq(key, k->key, h) == 0) { + if (data != NULL) + *data = pdata; + /* + * Return index where key is stored, + * subtracting the first dummy index + */ + return key_idx - 1; + } } } -- 2.20.1 --- Diff of the applied patch vs upstream commit (please double-check if non-empty: --- --- - 2019-08-27 09:40:12.828307491 +0100 +++ 0035-hash-use-ordered-loads-only-if-signature-matches.patch 2019-08-27 09:40:10.925144267 +0100 @@ -1 +1 @@ -From 4d9ca3ed213320eaef0d8a7e95b3b00c2d70800b Mon Sep 17 00:00:00 2001 +From 2f0d98c0a96c87467ffc5b1be76ff45688eb039c Mon Sep 17 00:00:00 2001 @@ -5,0 +6,2 @@ +[ upstream commit 4d9ca3ed213320eaef0d8a7e95b3b00c2d70800b ] + @@ -12 +13,0 @@ -Cc: stable@dpdk.org @@ -23 +24 @@ -index 74d5bbd99..a3ac2fead 100644 +index d7a5f4c21..e76277167 100644 @@ -26 +27 @@ -@@ -1190,20 +1190,29 @@ search_one_bucket_lf(const struct rte_hash *h, const void *key, uint16_t sig, +@@ -1169,20 +1169,29 @@ search_one_bucket_lf(const struct rte_hash *h, const void *key, uint16_t sig,