From 9dba85be054385dbb40d02631baffdcb735114a4 Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Thu, 7 Jul 2011 09:48:44 -0400 Subject: [PATCH] rculfhash: merge node gc into add loop Signed-off-by: Mathieu Desnoyers --- rculfhash.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/rculfhash.c b/rculfhash.c index 5baa2d4..0d8c5d6 100644 --- a/rculfhash.c +++ b/rculfhash.c @@ -259,7 +259,7 @@ int _ht_add(struct rcu_ht *ht, struct rcu_table *t, struct rcu_ht_node *node, goto insert; next = rcu_dereference(clear_flag(iter)->next); if (is_removed(next)) - goto gc; + goto gc_node; /* Only account for identical reverse hash once */ if (iter_prev->reverse_hash != clear_flag(iter)->reverse_hash) check_resize(ht, t, ++chain_len); @@ -276,10 +276,9 @@ int _ht_add(struct rcu_ht *ht, struct rcu_table *t, struct rcu_ht_node *node, continue; /* retry */ else goto gc_end; - gc: - /* Garbage collect logically removed nodes in the bucket */ - dummy = rcu_dereference(t->tbl[node->hash & (t->size - 1)]); - _ht_gc_bucket(dummy, node); + gc_node: + assert(!is_removed(iter)); + (void) uatomic_cmpxchg(&iter_prev->next, iter, clear_flag(next)); /* retry */ } gc_end: -- 2.34.1