public inbox for linux-perf-users@vger.kernel.org
 help / color / mirror / Atom feed
From: "Mi, Dapeng" <dapeng1.mi@linux.intel.com>
To: Ian Rogers <irogers@google.com>
Cc: Peter Zijlstra <peterz@infradead.org>,
	Ingo Molnar <mingo@redhat.com>,
	Arnaldo Carvalho de Melo <acme@kernel.org>,
	Namhyung Kim <namhyung@kernel.org>,
	Adrian Hunter <adrian.hunter@intel.com>,
	Alexander Shishkin <alexander.shishkin@linux.intel.com>,
	Andi Kleen <ak@linux.intel.com>,
	Eranian Stephane <eranian@google.com>,
	linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org,
	Dapeng Mi <dapeng1.mi@intel.com>, Zide Chen <zide.chen@intel.com>,
	Falcon Thomas <thomas.falcon@intel.com>,
	Xudong Hao <xudong.hao@intel.com>
Subject: Re: [PATCH 2/2] perf/x86: Update cap_user_rdpmc base on rdpmc user disable state
Date: Thu, 12 Mar 2026 14:23:57 +0800	[thread overview]
Message-ID: <0ecc2007-95dd-490f-b1ca-89a2d52cfabf@linux.intel.com> (raw)
In-Reply-To: <CAP-5=fUBy-vzdSB3xsuyU+AKd8o99R7DLgoyyJHxb6Shkfb-8w@mail.gmail.com>


On 3/12/2026 1:04 PM, Ian Rogers wrote:
> On Wed, Mar 11, 2026 at 9:44 PM Ian Rogers <irogers@google.com> wrote:
>> On Wed, Mar 11, 2026 at 12:56 AM Dapeng Mi <dapeng1.mi@linux.intel.com> wrote:
>>> After introducing the RDPMC user disable feature, user-space RDPMC may
>>> return 0 instead of the actual event count. This creates an inconsistency
>>> with cap_user_rdpmc, where cap_user_rdpmc is set, but user-space RDPMC
>>> only returns 0.
>>>
>>> To accurately represent the user-space RDPMC capability, update
>>> cap_user_rdpmc based on the RDPMC user disable state. If RDPMC user
>>> disable is enabled, cap_user_rdpmc is set to false, allowing user-space
>>> programs to fall back to the read() syscall to obtain the real event
>>> count.
>>>
>>> Fixes: 59af95e028d4 ("perf/x86/intel: Add support for rdpmc user disable feature")
>>> Signed-off-by: Dapeng Mi <dapeng1.mi@linux.intel.com>
>>> ---
>>>  arch/x86/events/core.c | 3 +++
>>>  1 file changed, 3 insertions(+)
>>>
>>> diff --git a/arch/x86/events/core.c b/arch/x86/events/core.c
>>> index 03ce1bc7ef2e..0266a11d7ec9 100644
>>> --- a/arch/x86/events/core.c
>>> +++ b/arch/x86/events/core.c
>>> @@ -2807,6 +2807,9 @@ void arch_perf_update_userpage(struct perf_event *event,
>>>         userpg->cap_user_time_zero = 0;
>>>         userpg->cap_user_rdpmc =
>>>                 !!(event->hw.flags & PERF_EVENT_FLAG_USER_READ_CNT);
>>> +       if (x86_pmu_has_rdpmc_user_disable(event->pmu) &&
>> With the AI's help the following bug was spotted:
>>
>> Places like cpu_clock_event_add call perf_event_update_userpage with a
>> software event:
>> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/kernel/events/core.c#n12314
>> This then calls arch_perf_update_userpage:
>> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/kernel/events/core.c#n6870
>> In x86_pmu_has_rdpmc_user_disable:
>> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/x86/events/perf_event.h#n1336
>> ```
>> static inline bool x86_pmu_has_rdpmc_user_disable(struct pmu *pmu)
>> {
>> return !!(hybrid(pmu, config_mask) &
>> ARCH_PERFMON_EVENTSEL_RDPMC_USER_DISABLE);
>> }
>> ```
>> The hybrid call does a call to hybrid_pmu:
>> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/x86/events/perf_event.h#n793
>> and that does a container_of:
>> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/x86/events/perf_event.h#n782
>> ```
>> static __always_inline struct x86_hybrid_pmu *hybrid_pmu(struct pmu *pmu)
>> {
>> return container_of(pmu, struct x86_hybrid_pmu, pmu);
>> }
>> ```
>> In the case that the event's pmu is a software PMU the container_of
>> should be invalid and this will lead to an out-of-bounds read of the
>> config_mask on hybrid systems.
>>
>> Unfortunately checking the event is x86 doesn't cover the hybrid case:
>> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/x86/events/core.c#n780
>> and it seems this bug may exist elsewhere. It'd be nice if in the
>> hybrid_pmu function there were a `BUG_ON(!is_x86_pmu(pmu))`, but
>> unfortunately that'd only get exposed on hybrid systems.
> Actually  is_x86_event does work for hybrid, so making this:
> ```
> if (is_x86_event(event) && x86_pmu_has_rdpmc_user_disable(event->pmu) && ...
> ```
> Should fix the issue.

Yes, I'd like move the check is_x86_event(event) into
x86_pmu_has_rdpmc_user_disable(), then the check "is_x86_event(event)"
won't be missed in next call for x86_pmu_has_rdpmc_user_disable(). Thanks.


>
> Thanks,
> Ian
>
>> Thanks,
>> Ian
>>
>>> +           event->hw.config & ARCH_PERFMON_EVENTSEL_RDPMC_USER_DISABLE)
>>> +               userpg->cap_user_rdpmc = 0;
>>>         userpg->pmc_width = x86_pmu.cntval_bits;
>>>
>>>         if (!using_native_sched_clock() || !sched_clock_stable())
>>> --
>>> 2.34.1
>>>

  parent reply	other threads:[~2026-03-12  6:24 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-03-11  7:52 [PATCH 1/2] perf/x86/intel: Fix OMR snoop information parsing issues Dapeng Mi
2026-03-11  7:52 ` [PATCH 2/2] perf/x86: Update cap_user_rdpmc base on rdpmc user disable state Dapeng Mi
2026-03-12  4:44   ` Ian Rogers
2026-03-12  5:04     ` Ian Rogers
2026-03-12  5:48       ` [PATCH v1 1/2] perf/x86: Avoid inadvertent casts to x86_hybrid_pmu Ian Rogers
2026-03-12  5:48         ` [PATCH v1 2/2] perf/x86: Reduce is_hybrid calls and aid ellision of BUG_ON in hybrid_pmu Ian Rogers
2026-03-12  6:44           ` Mi, Dapeng
2026-03-12  8:40           ` Peter Zijlstra
2026-03-12 15:06             ` Ian Rogers
2026-03-12  6:43         ` [PATCH v1 1/2] perf/x86: Avoid inadvertent casts to x86_hybrid_pmu Mi, Dapeng
2026-03-12  8:25         ` Mi, Dapeng
2026-03-12  8:31         ` Peter Zijlstra
2026-03-12  9:44           ` Mi, Dapeng
2026-03-12 15:16             ` Ian Rogers
2026-03-13  0:48               ` Mi, Dapeng
2026-03-12  6:23       ` Mi, Dapeng [this message]
2026-03-12  6:17     ` [PATCH 2/2] perf/x86: Update cap_user_rdpmc base on rdpmc user disable state Mi, Dapeng
2026-03-12  4:07 ` [PATCH 1/2] perf/x86/intel: Fix OMR snoop information parsing issues Ian Rogers

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=0ecc2007-95dd-490f-b1ca-89a2d52cfabf@linux.intel.com \
    --to=dapeng1.mi@linux.intel.com \
    --cc=acme@kernel.org \
    --cc=adrian.hunter@intel.com \
    --cc=ak@linux.intel.com \
    --cc=alexander.shishkin@linux.intel.com \
    --cc=dapeng1.mi@intel.com \
    --cc=eranian@google.com \
    --cc=irogers@google.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-perf-users@vger.kernel.org \
    --cc=mingo@redhat.com \
    --cc=namhyung@kernel.org \
    --cc=peterz@infradead.org \
    --cc=thomas.falcon@intel.com \
    --cc=xudong.hao@intel.com \
    --cc=zide.chen@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox