RE: [PATCH V6 13/17] perf, x86: enable LBR callstack when recording callchain

Liang, Kan
2014-10-24T14:50:27Z

>
> On Sun, Oct 19, 2014 at 05:55:08PM -0400, Kan Liang wrote:
> > Only enable LBR callstack when user requires fp callgraph. The feature
> > is not available when PERF_SAMPLE_BRANCH_STACK or
> > PERF_SAMPLE_STACK_USER is required.
> > Also, this feature only affects how to get user callchain. The kernel
> > callchain is always got by frame pointers.
> >
> > Signed-off-by: Yan, Zheng <zheng.z.yan@intel.com>
> > Signed-off-by: Kan Liang <kan.liang@intel.com>
> > ---
> > arch/x86/kernel/cpu/perf_event.c | 18 ++++++++++++++++--
> > 1 file changed, 16 insertions(+), 2 deletions(-)
> >
> > diff --git a/arch/x86/kernel/cpu/perf_event.c
> > b/arch/x86/kernel/cpu/perf_event.c
> > index 9656b9e..b3256a3 100644
> > --- a/arch/x86/kernel/cpu/perf_event.c
> > +++ b/arch/x86/kernel/cpu/perf_event.c
> > @@ -424,10 +424,24 @@ int x86_pmu_hw_config(struct perf_event
> *event)
> > if (!event->attr.exclude_kernel)
> > *br_type |=
> PERF_SAMPLE_BRANCH_KERNEL;
> > }
> > - }
> > + } else if (x86_pmu_has_lbr_callstack() &&
> > + (event->attr.sample_type & PERF_SAMPLE_CALLCHAIN)
> &&
> > + !(event->attr.sample_type & PERF_SAMPLE_STACK_USER)
> &&
> > + !has_branch_stack(event) &&
> > + !event->attr.exclude_user &&
> > + (event->attach_state & PERF_ATTACH_TASK)) {
> > + /*
> > + * user did not specify branch_sample_type,
> > + * try using the LBR call stack facility to
> > + * record call chains of user program.
> > + */
> > + event->attr.branch_sample_type =
> > + PERF_SAMPLE_BRANCH_USER |
> > + PERF_SAMPLE_BRANCH_CALL_STACK;
> >
>
> I dont see PERF_SAMPLE_BRANCH_CALL_STACK being defind in uapi.. any
> reason why I cant enable this feature explicitly?

The LBR call stack has some limitations. E.g. the feature is only for HSW+.
It is only available for user callchain. We cannot collect branch information
and call chain by LBR at the same time.. So the feature is designed as
an alternative way to get callgraph, and it isn't exposed to enable.
Otherwise, it may confuse the user. He enables the BRANCH_CALL_STACK,
but the data is only partly or even not at all from hardware.

We have an option for perf report, the user can choose the preferred data
source. User can set it to LBR. So it tries LBR data first. If not available, it
tries FP then. The user cannot lose any callchain data.

Thanks,
Kan

>
> thanks,
> jirka