From: Lai Jiangshan Date: Mon, 17 Oct 2011 14:10:27 +0000 (-0400) Subject: rculfhash: avoid unneed garbage collect X-Git-Tag: v0.7.0~43^2~91 X-Git-Url: https://git.lttng.org/?p=urcu.git;a=commitdiff_plain;h=960c9e4ff8e6028f5a0d4b1c1d747b20f08c5177 rculfhash: avoid unneed garbage collect [ Edit by Mathieu Desnoyers: If we have a concurrent removal executing while the add is performed, I just want to ensure we agree that this scenario will be correct: 1) removal succeeds. We have flagged a node as "logically removed", but it is still in the linked list. 2) garbage collection is initiated. 3) add succeeds. We insert a node with reverse hash value higher than the logically removed node. This means the add takes care of garbage collecting the logically removed node prior to adding the new node. 4) garbage collection of logically removed node fails (we ignore the return value of (void) uatomic_cmpxchg(&iter_prev->p.next, iter, new_next);) retry and iterate until we find the reverse hash value higher than the logically remove node. So I think this is OK: given that the add path takes care of garbage collecting any logically removed node located prior to the insert position, we don't need to perform gargage collection after the insertion. ] Signed-off-by: Lai Jiangshan Signed-off-by: Mathieu Desnoyers --- diff --git a/rculfhash.c b/rculfhash.c index c7b9ea8..d733d6b 100644 --- a/rculfhash.c +++ b/rculfhash.c @@ -855,7 +855,7 @@ struct cds_lfht_node *_cds_lfht_add(struct cds_lfht *ht, enum add_mode mode, int dummy) { struct cds_lfht_node *iter_prev, *iter, *next, *new_node, *new_next, - *dummy_node, *return_node; + *return_node; struct _cds_lfht_node *lookup; assert(!is_dummy(node)); @@ -924,7 +924,7 @@ struct cds_lfht_node *_cds_lfht_add(struct cds_lfht *ht, return_node = NULL; else /* ADD_DEFAULT and ADD_UNIQUE */ return_node = node; - goto gc_end; + goto end; } replace: @@ -946,10 +946,6 @@ struct cds_lfht_node *_cds_lfht_add(struct cds_lfht *ht, (void) uatomic_cmpxchg(&iter_prev->p.next, iter, new_next); /* retry */ } -gc_end: - /* Garbage collect logically removed nodes in the bucket */ - dummy_node = (struct cds_lfht_node *) lookup; - _cds_lfht_gc_bucket(dummy_node, node); end: return return_node; }