+/*
+ * Remove all logically deleted nodes from a bucket up to a certain node key.
+ */
+static
+void _ht_gc_bucket(struct rcu_ht_node *dummy, struct rcu_ht_node *node)
+{
+ struct rcu_ht_node *iter_prev, *iter, *next;
+
+ for (;;) {
+ iter_prev = dummy;
+ /* We can always skip the dummy node initially */
+ iter = rcu_dereference(iter_prev->next);
+ assert(iter_prev->reverse_hash <= node->reverse_hash);
+ if (unlikely(!iter))
+ return;
+ for (;;) {
+ if (clear_flag(iter)->reverse_hash > node->reverse_hash)
+ return;
+ next = rcu_dereference(clear_flag(iter)->next);
+ if (is_removed(next))
+ break;
+ if (unlikely(!next))
+ return;
+ iter_prev = iter;
+ iter = next;
+ }
+ assert(!is_removed(iter));
+ (void) uatomic_cmpxchg(&iter_prev->next, iter, clear_flag(next));
+ }
+}
+