From: Mathieu Desnoyers Date: Fri, 31 May 2013 16:00:43 +0000 (-0400) Subject: rcuja: move debugging info into judy array structure X-Git-Url: https://git.lttng.org./?a=commitdiff_plain;h=354981c2381634c1e79872a98d979f2faebeee0e;p=userspace-rcu.git rcuja: move debugging info into judy array structure Signed-off-by: Mathieu Desnoyers --- diff --git a/rcuja/rcuja-internal.h b/rcuja/rcuja-internal.h index 73ac41b..cf4ef96 100644 --- a/rcuja/rcuja-internal.h +++ b/rcuja/rcuja-internal.h @@ -94,6 +94,10 @@ struct cds_ja { */ struct cds_lfht *ht; unsigned long nr_fallback; /* Number of fallback nodes used */ + + /* For debugging */ + unsigned long node_fallback_count_distribution[JA_ENTRY_PER_NODE]; + unsigned long nr_nodes_allocated, nr_nodes_freed; }; static inline @@ -184,7 +188,7 @@ __attribute__((visibility("protected"))) int rcuja_delete_ht(struct cds_lfht *ht); __attribute__((visibility("protected"))) -void free_cds_ja_node(struct cds_ja_inode *node); +void free_cds_ja_node(struct cds_ja *ja, struct cds_ja_inode *node); //#define DEBUG diff --git a/rcuja/rcuja-shadow-nodes.c b/rcuja/rcuja-shadow-nodes.c index 093135f..63497c2 100644 --- a/rcuja/rcuja-shadow-nodes.c +++ b/rcuja/rcuja-shadow-nodes.c @@ -280,7 +280,7 @@ void free_shadow_node_and_node(struct rcu_head *head) { struct cds_ja_shadow_node *shadow_node = caa_container_of(head, struct cds_ja_shadow_node, head); - free_cds_ja_node(ja_node_ptr(shadow_node->node_flag)); + free_cds_ja_node(shadow_node->ja, ja_node_ptr(shadow_node->node_flag)); free(shadow_node); } @@ -299,7 +299,7 @@ void free_shadow_node_and_node_and_lock(struct rcu_head *head) struct cds_ja_shadow_node *shadow_node = caa_container_of(head, struct cds_ja_shadow_node, head); assert(shadow_node->level); - free_cds_ja_node(ja_node_ptr(shadow_node->node_flag)); + free_cds_ja_node(shadow_node->ja, ja_node_ptr(shadow_node->node_flag)); free(shadow_node->lock); free(shadow_node); } diff --git a/rcuja/rcuja.c b/rcuja/rcuja.c index 0f07b15..6c7c1e8 100644 --- a/rcuja/rcuja.c +++ b/rcuja/rcuja.c @@ -244,11 +244,6 @@ enum ja_recompact { JA_RECOMPACT_DEL, }; -static -unsigned long node_fallback_count_distribution[JA_ENTRY_PER_NODE]; -static -unsigned long nr_nodes_allocated, nr_nodes_freed; - static struct cds_ja_inode *_ja_node_mask_ptr(struct cds_ja_inode_flag *node) { @@ -291,7 +286,9 @@ struct cds_ja_inode *ja_node_ptr(struct cds_ja_inode_flag *node) } } -struct cds_ja_inode *alloc_cds_ja_node(const struct cds_ja_type *ja_type) +static +struct cds_ja_inode *alloc_cds_ja_node(struct cds_ja *ja, + const struct cds_ja_type *ja_type) { size_t len = 1U << ja_type->order; void *p; @@ -302,15 +299,15 @@ struct cds_ja_inode *alloc_cds_ja_node(const struct cds_ja_type *ja_type) return NULL; } memset(p, 0, len); - uatomic_inc(&nr_nodes_allocated); + uatomic_inc(&ja->nr_nodes_allocated); return p; } -void free_cds_ja_node(struct cds_ja_inode *node) +void free_cds_ja_node(struct cds_ja *ja, struct cds_ja_inode *node) { free(node); if (node) - uatomic_inc(&nr_nodes_freed); + uatomic_inc(&ja->nr_nodes_freed); } #define __JA_ALIGN_MASK(v, mask) (((v) + (mask)) & ~(mask)) @@ -1238,7 +1235,7 @@ retry: /* for fallback */ old_type_index, new_type_index); new_type = &ja_types[new_type_index]; if (new_type_index != NODE_INDEX_NULL) { - new_node = alloc_cds_ja_node(new_type); + new_node = alloc_cds_ja_node(ja, new_type); if (!new_node) return -ENOMEM; @@ -1285,7 +1282,7 @@ retry: /* for fallback */ dbg_printf("Recompact inherit lock from %p\n", shadow_node); new_shadow_node = rcuja_shadow_set(ja->ht, new_node_flag, shadow_node, ja, level); if (!new_shadow_node) { - free_cds_ja_node(new_node); + free_cds_ja_node(ja, new_node); return -ENOMEM; } if (fallback) @@ -1409,7 +1406,7 @@ skip_copy: dbg_printf("Using fallback for %u children, node type index: %u, mode %s\n", new_shadow_node->nr_child, old_type_index, mode == JA_RECOMPACT_ADD_NEXT ? "add_next" : (mode == JA_RECOMPACT_DEL ? "del" : "add_same")); - uatomic_inc(&node_fallback_count_distribution[new_shadow_node->nr_child]); + uatomic_inc(&ja->node_fallback_count_distribution[new_shadow_node->nr_child]); } /* Return pointer to new recompacted node through old_node_flag_ptr */ @@ -2404,16 +2401,16 @@ void rcuja_free_all_children(struct cds_ja_shadow_node *shadow_node, } static -void print_debug_fallback_distribution(void) +void print_debug_fallback_distribution(struct cds_ja *ja) { int i; fprintf(stderr, "Fallback node distribution:\n"); for (i = 0; i < JA_ENTRY_PER_NODE; i++) { - if (!node_fallback_count_distribution[i]) + if (!ja->node_fallback_count_distribution[i]) continue; fprintf(stderr, " %3u: %4lu\n", - i, node_fallback_count_distribution[i]); + i, ja->node_fallback_count_distribution[i]); } } @@ -2445,10 +2442,10 @@ int cds_ja_destroy(struct cds_ja *ja, "[warning] RCU Judy Array used %lu fallback node(s)\n", uatomic_read(&ja->nr_fallback)); fprintf(stderr, "Nodes allocated: %lu, Nodes freed: %lu. Fallback ratio: %g\n", - uatomic_read(&nr_nodes_allocated), - uatomic_read(&nr_nodes_freed), - (double) uatomic_read(&ja->nr_fallback) / (double) uatomic_read(&nr_nodes_allocated)); - print_debug_fallback_distribution(); + uatomic_read(&ja->nr_nodes_allocated), + uatomic_read(&ja->nr_nodes_freed), + (double) uatomic_read(&ja->nr_fallback) / (double) uatomic_read(&ja->nr_nodes_allocated)); + print_debug_fallback_distribution(ja); free(ja); return 0; }