From: Yan, Zheng <zheng.z....@intel.com>

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....@intel.com>
Signed-off-by: Kan Liang <kan.li...@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 2f79b9d..f454620 100644
--- a/arch/x86/kernel/cpu/perf_event.c
+++ b/arch/x86/kernel/cpu/perf_event.c
@@ -425,10 +425,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;
 
-       if (event->attr.branch_sample_type & PERF_SAMPLE_BRANCH_CALL_STACK)
+               /* needs PMU specific data to save LBR stack */
                event->attach_state |= PERF_ATTACH_TASK_DATA;
+       }
 
        /*
         * Generate PMC IRQs:
-- 
1.8.3.2

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to