Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
*/
struct cds_lfht *ht;
unsigned long nr_fallback; /* Number of fallback nodes used */
*/
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;
int rcuja_delete_ht(struct cds_lfht *ht);
__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);
{
struct cds_ja_shadow_node *shadow_node =
caa_container_of(head, struct cds_ja_shadow_node, 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));
struct cds_ja_shadow_node *shadow_node =
caa_container_of(head, struct cds_ja_shadow_node, head);
assert(shadow_node->level);
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);
}
free(shadow_node->lock);
free(shadow_node);
}
-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)
{
static
struct cds_ja_inode *_ja_node_mask_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;
{
size_t len = 1U << ja_type->order;
void *p;
return NULL;
}
memset(p, 0, len);
return NULL;
}
memset(p, 0, len);
- uatomic_inc(&nr_nodes_allocated);
+ uatomic_inc(&ja->nr_nodes_allocated);
-void free_cds_ja_node(struct cds_ja_inode *node)
+void free_cds_ja_node(struct cds_ja *ja, struct cds_ja_inode *node)
- uatomic_inc(&nr_nodes_freed);
+ uatomic_inc(&ja->nr_nodes_freed);
}
#define __JA_ALIGN_MASK(v, mask) (((v) + (mask)) & ~(mask))
}
#define __JA_ALIGN_MASK(v, mask) (((v) + (mask)) & ~(mask))
old_type_index, new_type_index);
new_type = &ja_types[new_type_index];
if (new_type_index != NODE_INDEX_NULL) {
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;
if (!new_node)
return -ENOMEM;
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) {
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)
return -ENOMEM;
}
if (fallback)
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"));
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 */
}
/* Return pointer to new recompacted node through old_node_flag_ptr */
-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++) {
{
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",
continue;
fprintf(stderr, " %3u: %4lu\n",
- i, node_fallback_count_distribution[i]);
+ i, ja->node_fallback_count_distribution[i]);
"[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",
"[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);