]> Git Repo - J-linux.git/commitdiff
perf/x86/intel: Allow to setup LBR for counting event for BPF
authorKan Liang <[email protected]>
Mon, 9 Sep 2024 15:58:48 +0000 (08:58 -0700)
committerPeter Zijlstra <[email protected]>
Tue, 10 Sep 2024 10:02:23 +0000 (12:02 +0200)
The BPF subsystem may capture LBR data on a counting event. However, the
current implementation assumes that LBR can/should only be used with
sampling events.

For instance, retsnoop tool ([0]) makes an extensive use of this
functionality and sets up perf event as follows:

struct perf_event_attr attr;

memset(&attr, 0, sizeof(attr));
attr.size = sizeof(attr);
attr.type = PERF_TYPE_HARDWARE;
attr.config = PERF_COUNT_HW_CPU_CYCLES;
attr.sample_type = PERF_SAMPLE_BRANCH_STACK;
attr.branch_sample_type = PERF_SAMPLE_BRANCH_KERNEL;

To limit the LBR for a sampling event is to avoid unnecessary branch
stack setup for a counting event in the sample read. Because LBR is only
read in the sampling event's overflow.

Although in most cases LBR is used in sampling, there is no HW limit to
bind LBR to the sampling mode. Allow an LBR setup for a counting event
unless in the sample read mode.

Fixes: 85846b27072d ("perf/x86: Add PERF_X86_EVENT_NEEDS_BRANCH_STACK flag")
Closes: https://lore.kernel.org/lkml/[email protected]/
Reported-by: Andrii Nakryiko <[email protected]>
Signed-off-by: Kan Liang <[email protected]>
Signed-off-by: Peter Zijlstra (Intel) <[email protected]>
Acked-by: Andrii Nakryiko <[email protected]>
Tested-by: Andrii Nakryiko <[email protected]>
Cc: [email protected]
Link: https://lore.kernel.org/r/[email protected]
arch/x86/events/intel/core.c

index 9e519d8a810a682f1decaa0e096fc17d68e737cd..d879478db3f572077d69fe2cc290d3c3f236fe16 100644 (file)
@@ -3972,8 +3972,12 @@ static int intel_pmu_hw_config(struct perf_event *event)
                        x86_pmu.pebs_aliases(event);
        }
 
-       if (needs_branch_stack(event) && is_sampling_event(event))
-               event->hw.flags  |= PERF_X86_EVENT_NEEDS_BRANCH_STACK;
+       if (needs_branch_stack(event)) {
+               /* Avoid branch stack setup for counting events in SAMPLE READ */
+               if (is_sampling_event(event) ||
+                   !(event->attr.sample_type & PERF_SAMPLE_READ))
+                       event->hw.flags |= PERF_X86_EVENT_NEEDS_BRANCH_STACK;
+       }
 
        if (branch_sample_counters(event)) {
                struct perf_event *leader, *sibling;
This page took 0.07969 seconds and 4 git commands to generate.