From b36f587f010bba421a8fd0b4c383276ecb796ae3 Mon Sep 17 00:00:00 2001 From: Ruifeng Wang Date: Mon, 9 Sep 2019 21:51:42 +0800 Subject: [PATCH] rcu: fix spurious thread unregister 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 Reviewed-by: Gavin Hu Reviewed-by: Honnappa Nagarahalli Reviewed-by: David Marchand --- lib/librte_rcu/rte_rcu_qsbr.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/librte_rcu/rte_rcu_qsbr.c b/lib/librte_rcu/rte_rcu_qsbr.c index a6b66ac09b..474675d510 100644 --- a/lib/librte_rcu/rte_rcu_qsbr.c +++ b/lib/librte_rcu/rte_rcu_qsbr.c @@ -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. */ -- 2.20.1