From 53960c9f970e231b1ca5f53913b60d298540cf9a Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Sat, 10 Sep 2011 20:53:30 -0700 Subject: [PATCH] rculfhash: add list iteration tracer in gc Signed-off-by: Mathieu Desnoyers --- rculfhash.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/rculfhash.c b/rculfhash.c index ee4bea2..6a80049 100644 --- a/rculfhash.c +++ b/rculfhash.c @@ -675,15 +675,20 @@ static void _cds_lfht_gc_bucket(struct cds_lfht_node *dummy, struct cds_lfht_node *node) { struct cds_lfht_node *iter_prev, *iter, *next, *new_next; + struct cds_lfht_node *iter_trace[64]; + unsigned long trace_idx = 0; + memset(iter_trace, 0, sizeof(iter_trace)); assert(!is_dummy(dummy)); assert(!is_removed(dummy)); assert(!is_dummy(node)); assert(!is_removed(node)); for (;;) { + iter_trace[trace_idx++ & (64 - 1)] = (void *) 0x1; iter_prev = dummy; /* We can always skip the dummy node initially */ iter = rcu_dereference(iter_prev->p.next); + iter_trace[trace_idx++ & (64 - 1)] = iter; assert(iter_prev->p.reverse_hash <= node->p.reverse_hash); /* * We should never be called with dummy (start of chain) @@ -702,6 +707,7 @@ void _cds_lfht_gc_bucket(struct cds_lfht_node *dummy, struct cds_lfht_node *node break; iter_prev = clear_flag(iter); iter = next; + iter_trace[trace_idx++ & (64 - 1)] = iter; } assert(!is_removed(iter)); if (is_dummy(iter)) @@ -709,6 +715,7 @@ void _cds_lfht_gc_bucket(struct cds_lfht_node *dummy, struct cds_lfht_node *node else new_next = clear_flag(next); (void) uatomic_cmpxchg(&iter_prev->p.next, iter, new_next); + iter_trace[trace_idx++ & (64 - 1)] = (void *) 0x2; } } -- 2.34.1