]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
perf/amd/ibs: Avoid calling perf_allow_kernel() from the IBS NMI handler
authorRavi Bangoria <ravi.bangoria@amd.com>
Mon, 16 Feb 2026 04:22:15 +0000 (04:22 +0000)
committerPeter Zijlstra <peterz@infradead.org>
Fri, 27 Feb 2026 15:40:23 +0000 (16:40 +0100)
Calling perf_allow_kernel() from the NMI context is unsafe and could be
fatal. Capture the permission at event-initialization time by storing it
in event->hw.flags, and have the NMI handler rely on that cached flag
instead of making the call directly.

Fixes: 50a53b60e141d ("perf/amd/ibs: Prevent leaking sensitive data to userspace")
Reported-by: Sadasivan Shaiju <sadasivan.shaiju2@amd.com>
Signed-off-by: Ravi Bangoria <ravi.bangoria@amd.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Acked-by: Namhyung Kim <namhyung@kernel.org>
Link: https://patch.msgid.link/20260216042216.1440-5-ravi.bangoria@amd.com
arch/x86/events/amd/ibs.c
arch/x86/events/perf_event_flags.h

index 05b7c9f2ec338bb9e76eedb07c8e44e657d05532..004226b52ac7986e8fade13bdc4f020305b144ac 100644 (file)
@@ -313,6 +313,9 @@ static int perf_ibs_init(struct perf_event *event)
        if (ret)
                return ret;
 
+       if (perf_allow_kernel())
+               hwc->flags |= PERF_X86_EVENT_UNPRIVILEGED;
+
        if (hwc->sample_period) {
                if (config & perf_ibs->cnt_mask)
                        /* raw max_cnt may not be set */
@@ -1349,7 +1352,7 @@ fail:
         * unprivileged users.
         */
        if ((event->attr.sample_type & PERF_SAMPLE_RAW) &&
-           perf_allow_kernel()) {
+           (hwc->flags & PERF_X86_EVENT_UNPRIVILEGED)) {
                perf_ibs_phyaddr_clear(perf_ibs, &ibs_data);
        }
 
index 70078334e4a33820a0b57c58c8cdd1d62c4fe0ad..47f84ee8f5409cc1d148cddbcd0a3391442d75db 100644 (file)
@@ -23,3 +23,4 @@ PERF_ARCH(PEBS_LAT_HYBRID,    0x0020000) /* ld and st lat for hybrid */
 PERF_ARCH(NEEDS_BRANCH_STACK,  0x0040000) /* require branch stack setup */
 PERF_ARCH(BRANCH_COUNTERS,     0x0080000) /* logs the counters in the extra space of each branch */
 PERF_ARCH(ACR,                 0x0100000) /* Auto counter reload */
+PERF_ARCH(UNPRIVILEGED,                0x0200000) /* Unprivileged event (wrt perf_allow_kernel()) */