Skip to content

Commit 75aea4b

Browse files
Kan LiangPeter Zijlstra
authored andcommitted
perf/x86/intel: Only check the group flag for X86 leader
A warning in intel_pmu_lbr_counters_reorder() may be triggered by below perf command. perf record -e "{cpu-clock,cycles/call-graph="lbr"/}" -- sleep 1 It's because the group is mistakenly treated as a branch counter group. The hw.flags of the leader are used to determine whether a group is a branch counters group. However, the hw.flags is only available for a hardware event. The field to store the flags is a union type. For a software event, it's a hrtimer. The corresponding bit may be set if the leader is a software event. For a branch counter group and other groups that have a group flag (e.g., topdown, PEBS counters snapshotting, and ACR), the leader must be a X86 event. Check the X86 event before checking the flag. The patch only fixes the issue for the branch counter group. The following patch will fix the other groups. There may be an alternative way to fix the issue by moving the hw.flags out of the union type. It should work for now. But it's still possible that the flags will be used by other types of events later. As long as that type of event is used as a leader, a similar issue will be triggered. So the alternative way is dropped. Fixes: 3374491 ("perf/x86/intel: Support branch counters logging") Closes: https://lore.kernel.org/lkml/20250412091423.1839809-1-luogengkun@huaweicloud.com/ Reported-by: Luo Gengkun <luogengkun@huaweicloud.com> Signed-off-by: Kan Liang <kan.liang@linux.intel.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Cc: stable@vger.kernel.org Link: https://lkml.kernel.org/r/20250424134718.311934-2-kan.liang@linux.intel.com
1 parent 1a97fea commit 75aea4b

File tree

2 files changed

+9
-2
lines changed

2 files changed

+9
-2
lines changed

arch/x86/events/core.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -754,7 +754,7 @@ void x86_pmu_enable_all(int added)
754754
}
755755
}
756756

757-
static inline int is_x86_event(struct perf_event *event)
757+
int is_x86_event(struct perf_event *event)
758758
{
759759
int i;
760760

arch/x86/events/perf_event.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,9 +110,16 @@ static inline bool is_topdown_event(struct perf_event *event)
110110
return is_metric_event(event) || is_slots_event(event);
111111
}
112112

113+
int is_x86_event(struct perf_event *event);
114+
115+
static inline bool check_leader_group(struct perf_event *leader, int flags)
116+
{
117+
return is_x86_event(leader) ? !!(leader->hw.flags & flags) : false;
118+
}
119+
113120
static inline bool is_branch_counters_group(struct perf_event *event)
114121
{
115-
return event->group_leader->hw.flags & PERF_X86_EVENT_BRANCH_COUNTERS;
122+
return check_leader_group(event->group_leader, PERF_X86_EVENT_BRANCH_COUNTERS);
116123
}
117124

118125
static inline bool is_pebs_counter_event_group(struct perf_event *event)

0 commit comments

Comments
 (0)