rcu: fix spurious thread unregister
authorRuifeng Wang <ruifeng.wang@arm.com>
Mon, 9 Sep 2019 13:51:42 +0000 (21:51 +0800)
committerDavid Marchand <david.marchand@redhat.com>
Fri, 18 Oct 2019 04:13:36 +0000 (06:13 +0200)
Thread unregister returns success while unregister not been performed.
This is due to incorrect thread registration status check.
Fix this issue by correcting bitmap check.

Fixes: 64994b56cfd7 ("rcu: add RCU library supporting QSBR mechanism")
Cc: stable@dpdk.org
Signed-off-by: Ruifeng Wang <ruifeng.wang@arm.com>
Reviewed-by: Gavin Hu <gavin.hu@arm.com>
Reviewed-by: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>
Reviewed-by: David Marchand <david.marchand@redhat.com>
lib/librte_rcu/rte_rcu_qsbr.c

index a6b66ac..474675d 100644 (file)
@@ -157,7 +157,7 @@ rte_rcu_qsbr_thread_unregister(struct rte_rcu_qsbr *v, unsigned int thread_id)
        /* Check if the thread is already unregistered */
        old_bmap = __atomic_load_n(__RTE_QSBR_THRID_ARRAY_ELM(v, i),
                                        __ATOMIC_RELAXED);
-       if (old_bmap & ~(1UL << id))
+       if (!(old_bmap & (1UL << id)))
                return 0;
 
        do {
@@ -174,7 +174,7 @@ rte_rcu_qsbr_thread_unregister(struct rte_rcu_qsbr *v, unsigned int thread_id)
                if (success)
                        __atomic_fetch_sub(&v->num_threads,
                                                1, __ATOMIC_RELAXED);
-               else if (old_bmap & ~(1UL << id))
+               else if (!(old_bmap & (1UL << id)))
                        /* Someone else unregistered this thread.
                         * Counter should not be incremented.
                         */