]> git.droids-corp.org - dpdk.git/commitdiff
hash: fix a multi-writer race condition
authorYipeng Wang <yipeng1.wang@intel.com>
Tue, 10 Jul 2018 16:59:55 +0000 (09:59 -0700)
committerThomas Monjalon <thomas@monjalon.net>
Thu, 12 Jul 2018 21:03:20 +0000 (23:03 +0200)
Current multi-writer implementation uses Intel TSX to
protect the cuckoo path moving but not the cuckoo
path searching. After searching, we need to verify again if
the same empty slot still exists at the beginning of the TSX
region. Otherwise another writer could occupy the empty slot
before the TSX region. Current code does not verify.

Fixes: be856325cba3 ("hash: add scalable multi-writer insertion with Intel TSX")
Cc: stable@dpdk.org
Signed-off-by: Yipeng Wang <yipeng1.wang@intel.com>
Acked-by: Pablo de Lara <pablo.de.lara.guarch@intel.com>
lib/librte_hash/rte_cuckoo_hash_x86.h

index 2c5b017e366570dea3e526ab6eb4aa58774c18e5..981d7bdd60f1797f3b8a859aa6ac587451858ef3 100644 (file)
@@ -66,6 +66,9 @@ rte_hash_cuckoo_move_insert_mw_tm(const struct rte_hash *h,
        while (try < RTE_HASH_TSX_MAX_RETRY) {
                status = rte_xbegin();
                if (likely(status == RTE_XBEGIN_STARTED)) {
+                       /* In case empty slot was gone before entering TSX */
+                       if (curr_bkt->key_idx[curr_slot] != EMPTY_SLOT)
+                               rte_xabort(RTE_XABORT_CUCKOO_PATH_INVALIDED);
                        while (likely(curr_node->prev != NULL)) {
                                prev_node = curr_node->prev;
                                prev_bkt = prev_node->bkt;