[ltt-dev] [PATCH 5/9] rculfhash: avoid unneed garbage collect
Mathieu Desnoyers
mathieu.desnoyers at efficios.com
Mon Oct 17 10:07:51 EDT 2011
* Lai Jiangshan (laijs at cn.fujitsu.com) wrote:
> Signed-off-by: Lai Jiangshan <laijs at cn.fujitsu.com>
> ---
> rculfhash.c | 8 ++------
> 1 files changed, 2 insertions(+), 6 deletions(-)
>
> diff --git a/rculfhash.c b/rculfhash.c
> index 1c859ed..f901ded 100644
> --- a/rculfhash.c
> +++ b/rculfhash.c
> @@ -850,7 +850,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));
> @@ -919,7 +919,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:
> @@ -941,10 +941,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);
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 insertion.
Merged as:
commit 960c9e4ff8e6028f5a0d4b1c1d747b20f08c5177
Author: Lai Jiangshan <laijs at cn.fujitsu.com>
Date: Mon Oct 17 10:10:27 2011 -0400
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 <laijs at cn.fujitsu.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
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;
}
--
Mathieu Desnoyers
Operating System Efficiency R&D Consultant
EfficiOS Inc.
http://www.efficios.com
More information about the lttng-dev
mailing list