|
@@ -766,6 +766,7 @@ static enum match_result match_chain(struct callchain_cursor_node *node,
|
|
|
cnode->cycles_count += node->branch_flags.cycles;
|
|
cnode->cycles_count += node->branch_flags.cycles;
|
|
|
cnode->iter_count += node->nr_loop_iter;
|
|
cnode->iter_count += node->nr_loop_iter;
|
|
|
cnode->iter_cycles += node->iter_cycles;
|
|
cnode->iter_cycles += node->iter_cycles;
|
|
|
|
|
+ cnode->from_count++;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -1345,10 +1346,10 @@ static int branch_to_str(char *bf, int bfsize,
|
|
|
static int branch_from_str(char *bf, int bfsize,
|
|
static int branch_from_str(char *bf, int bfsize,
|
|
|
u64 branch_count,
|
|
u64 branch_count,
|
|
|
u64 cycles_count, u64 iter_count,
|
|
u64 cycles_count, u64 iter_count,
|
|
|
- u64 iter_cycles)
|
|
|
|
|
|
|
+ u64 iter_cycles, u64 from_count)
|
|
|
{
|
|
{
|
|
|
int printed = 0, i = 0;
|
|
int printed = 0, i = 0;
|
|
|
- u64 cycles;
|
|
|
|
|
|
|
+ u64 cycles, v = 0;
|
|
|
|
|
|
|
|
cycles = cycles_count / branch_count;
|
|
cycles = cycles_count / branch_count;
|
|
|
if (cycles) {
|
|
if (cycles) {
|
|
@@ -1357,14 +1358,16 @@ static int branch_from_str(char *bf, int bfsize,
|
|
|
bf + printed, bfsize - printed);
|
|
bf + printed, bfsize - printed);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- if (iter_count) {
|
|
|
|
|
- printed += count_pri64_printf(i++, "iter",
|
|
|
|
|
- iter_count,
|
|
|
|
|
- bf + printed, bfsize - printed);
|
|
|
|
|
|
|
+ if (iter_count && from_count) {
|
|
|
|
|
+ v = iter_count / from_count;
|
|
|
|
|
+ if (v) {
|
|
|
|
|
+ printed += count_pri64_printf(i++, "iter",
|
|
|
|
|
+ v, bf + printed, bfsize - printed);
|
|
|
|
|
|
|
|
- printed += count_pri64_printf(i++, "avg_cycles",
|
|
|
|
|
- iter_cycles / iter_count,
|
|
|
|
|
- bf + printed, bfsize - printed);
|
|
|
|
|
|
|
+ printed += count_pri64_printf(i++, "avg_cycles",
|
|
|
|
|
+ iter_cycles / iter_count,
|
|
|
|
|
+ bf + printed, bfsize - printed);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (i)
|
|
if (i)
|
|
@@ -1377,6 +1380,7 @@ static int counts_str_build(char *bf, int bfsize,
|
|
|
u64 branch_count, u64 predicted_count,
|
|
u64 branch_count, u64 predicted_count,
|
|
|
u64 abort_count, u64 cycles_count,
|
|
u64 abort_count, u64 cycles_count,
|
|
|
u64 iter_count, u64 iter_cycles,
|
|
u64 iter_count, u64 iter_cycles,
|
|
|
|
|
+ u64 from_count,
|
|
|
struct branch_type_stat *brtype_stat)
|
|
struct branch_type_stat *brtype_stat)
|
|
|
{
|
|
{
|
|
|
int printed;
|
|
int printed;
|
|
@@ -1389,7 +1393,8 @@ static int counts_str_build(char *bf, int bfsize,
|
|
|
predicted_count, abort_count, brtype_stat);
|
|
predicted_count, abort_count, brtype_stat);
|
|
|
} else {
|
|
} else {
|
|
|
printed = branch_from_str(bf, bfsize, branch_count,
|
|
printed = branch_from_str(bf, bfsize, branch_count,
|
|
|
- cycles_count, iter_count, iter_cycles);
|
|
|
|
|
|
|
+ cycles_count, iter_count, iter_cycles,
|
|
|
|
|
+ from_count);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (!printed)
|
|
if (!printed)
|
|
@@ -1402,13 +1407,14 @@ static int callchain_counts_printf(FILE *fp, char *bf, int bfsize,
|
|
|
u64 branch_count, u64 predicted_count,
|
|
u64 branch_count, u64 predicted_count,
|
|
|
u64 abort_count, u64 cycles_count,
|
|
u64 abort_count, u64 cycles_count,
|
|
|
u64 iter_count, u64 iter_cycles,
|
|
u64 iter_count, u64 iter_cycles,
|
|
|
|
|
+ u64 from_count,
|
|
|
struct branch_type_stat *brtype_stat)
|
|
struct branch_type_stat *brtype_stat)
|
|
|
{
|
|
{
|
|
|
char str[256];
|
|
char str[256];
|
|
|
|
|
|
|
|
counts_str_build(str, sizeof(str), branch_count,
|
|
counts_str_build(str, sizeof(str), branch_count,
|
|
|
predicted_count, abort_count, cycles_count,
|
|
predicted_count, abort_count, cycles_count,
|
|
|
- iter_count, iter_cycles, brtype_stat);
|
|
|
|
|
|
|
+ iter_count, iter_cycles, from_count, brtype_stat);
|
|
|
|
|
|
|
|
if (fp)
|
|
if (fp)
|
|
|
return fprintf(fp, "%s", str);
|
|
return fprintf(fp, "%s", str);
|
|
@@ -1422,6 +1428,7 @@ int callchain_list_counts__printf_value(struct callchain_list *clist,
|
|
|
u64 branch_count, predicted_count;
|
|
u64 branch_count, predicted_count;
|
|
|
u64 abort_count, cycles_count;
|
|
u64 abort_count, cycles_count;
|
|
|
u64 iter_count, iter_cycles;
|
|
u64 iter_count, iter_cycles;
|
|
|
|
|
+ u64 from_count;
|
|
|
|
|
|
|
|
branch_count = clist->branch_count;
|
|
branch_count = clist->branch_count;
|
|
|
predicted_count = clist->predicted_count;
|
|
predicted_count = clist->predicted_count;
|
|
@@ -1429,11 +1436,12 @@ int callchain_list_counts__printf_value(struct callchain_list *clist,
|
|
|
cycles_count = clist->cycles_count;
|
|
cycles_count = clist->cycles_count;
|
|
|
iter_count = clist->iter_count;
|
|
iter_count = clist->iter_count;
|
|
|
iter_cycles = clist->iter_cycles;
|
|
iter_cycles = clist->iter_cycles;
|
|
|
|
|
+ from_count = clist->from_count;
|
|
|
|
|
|
|
|
return callchain_counts_printf(fp, bf, bfsize, branch_count,
|
|
return callchain_counts_printf(fp, bf, bfsize, branch_count,
|
|
|
predicted_count, abort_count,
|
|
predicted_count, abort_count,
|
|
|
cycles_count, iter_count, iter_cycles,
|
|
cycles_count, iter_count, iter_cycles,
|
|
|
- &clist->brtype_stat);
|
|
|
|
|
|
|
+ from_count, &clist->brtype_stat);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static void free_callchain_node(struct callchain_node *node)
|
|
static void free_callchain_node(struct callchain_node *node)
|