new->children_hit = 0;
        new->hit = period;
+       new->children_count = 0;
+       new->count = 1;
        return new;
 }
 
        parent->children_hit = callchain_cumul_hits(new);
        new->val_nr = parent->val_nr - idx_local;
        parent->val_nr = idx_local;
+       new->count = parent->count;
+       new->children_count = parent->children_count;
+       parent->children_count = callchain_cumul_counts(new);
 
        /* create a new child for the new branch if any */
        if (idx_total < cursor->nr) {
 
                parent->hit = 0;
                parent->children_hit += period;
+               parent->count = 0;
+               parent->children_count += 1;
 
                node = callchain_cursor_current(cursor);
                new = add_child(parent, cursor, period);
                rb_insert_color(&new->rb_node_in, &parent->rb_root_in);
        } else {
                parent->hit = period;
+               parent->count = 1;
        }
 }
 
 
 inc_children_hit:
        root->children_hit += period;
+       root->children_count++;
 }
 
 static int
        /* we match 100% of the path, increment the hit */
        if (matches == root->val_nr && cursor->pos == cursor->nr) {
                root->hit += period;
+               root->count++;
                return 0;
        }
 
 
        struct rb_root          rb_root_in; /* input tree of children */
        struct rb_root          rb_root;    /* sorted output tree of children */
        unsigned int            val_nr;
+       unsigned int            count;
+       unsigned int            children_count;
        u64                     hit;
        u64                     children_hit;
 };
        return node->hit + node->children_hit;
 }
 
+static inline unsigned callchain_cumul_counts(struct callchain_node *node)
+{
+       return node->count + node->children_count;
+}
+
 int callchain_register_param(struct callchain_param *param);
 int callchain_append(struct callchain_root *root,
                     struct callchain_cursor *cursor,