From: Atish Patra <atish.patra@linux.dev>
To: Yicong Yang <yang.yicong@picoheart.com>
Cc: Jiri Olsa <jolsa@kernel.org>, Paul Walmsley <pjw@kernel.org>,
Mark Rutland <mark.rutland@arm.com>,
Rob Herring <robh@kernel.org>, Anup Patel <anup@brainfault.org>,
Namhyung Kim <namhyung@kernel.org>,
Arnaldo Carvalho de Melo <acme@kernel.org>,
Krzysztof Kozlowski <krzk+dt@kernel.org>,
Ian Rogers <irogers@google.com>, Will Deacon <will@kernel.org>,
James Clark <james.clark@linaro.org>,
linux-arm-kernel@lists.infradead.org,
linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org,
devicetree@vger.kernel.org, linux-perf-users@vger.kernel.org,
Conor Dooley <conor@kernel.org>
Subject: Re: [PATCH v8 14/22] RISC-V: perf: Implement supervisor counter delegation support
Date: Thu, 6 Aug 2026 14:45:03 -0700 [thread overview]
Message-ID: <a8749023-d598-43d9-8a64-569b2d057438@linux.dev> (raw)
In-Reply-To: <15b63bb1-ea29-42cd-905c-fbecc8423118@picoheart.com>
On 8/6/26 5:16 AM, Yicong Yang wrote:
> On 8/6/26 10:00 AM, Atish Patra wrote:
>> On 7/7/26 1:24 AM, Yicong Yang wrote:
>>> On 7/1/26 4:47 PM, Atish Patra wrote:
>>>> From: Atish Patra <atishp@rivosinc.com>
>>>>
>>>> There are few new RISC-V ISA exensions (ssccfg, sscsrind, smcntrpmf) which
>>>> allows the hpmcounter/hpmevents to be programmed directly from S-mode. The
>>>> implementation detects the ISA extension at runtime and uses them if
>>>> available instead of SBI PMU extension. SBI PMU extension will still be
>>>> used for firmware counters if the user requests it.
>>>>
>>>> The current linux driver relies on event encoding defined by SBI PMU
>>>> specification for standard perf events. However, there are no standard
>>>> event encoding available in the ISA. In the future, we may want to
>>>> decouple the counter delegation and SBI PMU completely. In that case,
>>>> counter delegation supported platforms must rely on the event encoding
>>>> defined in the perf json file or in the pmu driver.
>>>>
>>>> For firmware events, it will continue to use the SBI PMU encoding as
>>>> one can not support firmware event without SBI PMU.
>>>>
>>>> Signed-off-by: Atish Patra <atishp@rivosinc.com>
>>>> ---
>>>> arch/riscv/include/asm/csr.h | 1 +
>>>> drivers/perf/riscv_pmu_sbi.c | 578 +++++++++++++++++++++++++++++++++--------
>>>> include/linux/perf/riscv_pmu.h | 3 +
>>>> 3 files changed, 478 insertions(+), 104 deletions(-)
>>>>
>>>> diff --git a/arch/riscv/include/asm/csr.h b/arch/riscv/include/asm/csr.h
>>>> index a3b24b88e401..cd22b5168689 100644
>>>> --- a/arch/riscv/include/asm/csr.h
>>>> +++ b/arch/riscv/include/asm/csr.h
>>>> @@ -258,6 +258,7 @@
>>>> #endif
>>>> #define SISELECT_SSCCFG_BASE 0x40
>>>> +#define HPMEVENT_MASK GENMASK_ULL(63, 56)
>>>> /* mseccfg bits */
>>>> #define MSECCFG_PMM ENVCFG_PMM
>>>> diff --git a/drivers/perf/riscv_pmu_sbi.c b/drivers/perf/riscv_pmu_sbi.c
>>>> index 2568c6808f5d..7995da4a98a1 100644
>>>> --- a/drivers/perf/riscv_pmu_sbi.c
>>>> +++ b/drivers/perf/riscv_pmu_sbi.c
>>>> @@ -28,6 +28,8 @@
>>>> #include <asm/cpufeature.h>
>>>> #include <asm/vendor_extensions.h>
>>>> #include <asm/vendor_extensions/andes.h>
>>>> +#include <asm/hwcap.h>
>>>> +#include <asm/csr_ind.h>
>>>> #define ALT_SBI_PMU_OVERFLOW(__ovl) \
>>>> asm volatile(ALTERNATIVE_2( \
>>>> @@ -60,7 +62,20 @@ asm volatile(ALTERNATIVE( \
>>>> #define PERF_EVENT_FLAG_USER_ACCESS BIT(SYSCTL_USER_ACCESS)
>>>> #define PERF_EVENT_FLAG_LEGACY BIT(SYSCTL_LEGACY)
>>>> -PMU_FORMAT_ATTR(event, "config:0-55");
>>>> +#define RVPMU_SBI_PMU_FORMAT_ATTR "config:0-47"
>>>> +#define RVPMU_CDELEG_PMU_FORMAT_ATTR "config:0-55"
>>>> +
>>>> +static ssize_t __maybe_unused rvpmu_format_show(struct device *dev, struct device_attribute *attr,
>>>> + char *buf);
>>>> +
>>>> +#define RVPMU_ATTR_ENTRY(_name, _func, _config) ( \
>>>> + &((struct dev_ext_attribute[]) { \
>>>> + { __ATTR(_name, 0444, _func, NULL), (void *)_config } \
>>>> + })[0].attr.attr)
>>>> +
>>>> +#define RVPMU_FORMAT_ATTR_ENTRY(_name, _config) \
>>>> + RVPMU_ATTR_ENTRY(_name, rvpmu_format_show, (char *)_config)
>>>> +
>>>> PMU_FORMAT_ATTR(firmware, "config:62-63");
>>>> static bool sbi_v2_available;
>>>> @@ -68,7 +83,11 @@ static bool sbi_v3_available;
>>>> static DEFINE_STATIC_KEY_FALSE(sbi_pmu_snapshot_available);
>>>> #define sbi_pmu_snapshot_available() \
>>>> static_branch_unlikely(&sbi_pmu_snapshot_available)
>>>> +
>>>> static DEFINE_STATIC_KEY_FALSE(riscv_pmu_sbi_available);
>>>> +#define riscv_pmu_sbi_available() \
>>>> + static_branch_likely(&riscv_pmu_sbi_available)
>>>> +
>>>> static DEFINE_STATIC_KEY_FALSE(riscv_pmu_cdeleg_available);
>>>> /* Avoid unnecessary code patching in the one time booting path*/
>>>> @@ -83,19 +102,35 @@ static DEFINE_STATIC_KEY_FALSE(riscv_pmu_cdeleg_available);
>>>> #define riscv_pmu_sbi_available() \
>>>> static_branch_likely(&riscv_pmu_sbi_available)
>>>> -static struct attribute *riscv_arch_formats_attr[] = {
>>>> - &format_attr_event.attr,
>>>> +static struct attribute *riscv_sbi_pmu_formats_attr[] = {
>>>> + RVPMU_FORMAT_ATTR_ENTRY(event, RVPMU_SBI_PMU_FORMAT_ATTR),
>>>> &format_attr_firmware.attr,
>>>> NULL,
>>>> };
>>>> -static struct attribute_group riscv_pmu_format_group = {
>>>> +static struct attribute_group riscv_sbi_pmu_format_group = {
>>>> .name = "format",
>>>> - .attrs = riscv_arch_formats_attr,
>>>> + .attrs = riscv_sbi_pmu_formats_attr,
>>>> };
>>>> -static const struct attribute_group *riscv_pmu_attr_groups[] = {
>>>> - &riscv_pmu_format_group,
>>>> +static const struct attribute_group *riscv_sbi_pmu_attr_groups[] = {
>>>> + &riscv_sbi_pmu_format_group,
>>>> + NULL,
>>>> +};
>>>> +
>>>> +static struct attribute *riscv_cdeleg_pmu_formats_attr[] = {
>>>> + RVPMU_FORMAT_ATTR_ENTRY(event, RVPMU_CDELEG_PMU_FORMAT_ATTR),
>>>> + &format_attr_firmware.attr,
>>>> + NULL,
>>>> +};
>>>> +
>>>> +static struct attribute_group riscv_cdeleg_pmu_format_group = {
>>>> + .name = "format",
>>>> + .attrs = riscv_cdeleg_pmu_formats_attr,
>>>> +};
>>>> +
>>>> +static const struct attribute_group *riscv_cdeleg_pmu_attr_groups[] = {
>>>> + &riscv_cdeleg_pmu_format_group,
>>>> NULL,
>>>> };
>>>> @@ -482,6 +517,14 @@ static void rvpmu_sbi_check_std_events(struct work_struct *work)
>>>> static DECLARE_WORK(check_std_events_work, rvpmu_sbi_check_std_events);
>>>> +static ssize_t rvpmu_format_show(struct device *dev,
>>>> + struct device_attribute *attr, char *buf)
>>>> +{
>>>> + struct dev_ext_attribute *eattr = container_of(attr,
>>>> + struct dev_ext_attribute, attr);
>>>> + return sysfs_emit(buf, "%s\n", (char *)eattr->var);
>>>> +}
>>>> +
>>>> static int rvpmu_ctr_get_width(int idx)
>>>> {
>>>> return pmu_ctr_list[idx].width;
>>>> @@ -599,6 +642,38 @@ static uint8_t rvpmu_csr_index(struct perf_event *event)
>>>> return pmu_ctr_list[event->hw.idx].csr - CSR_CYCLE;
>>>> }
>>>> +static uint64_t get_deleg_priv_filter_bits(struct perf_event *event)
>>>> +{
>>>> + u64 priv_filter_bits = 0;
>>> could we explicitly initialize the priv_filter_bits to MINH? though this bit
>>> is S-mode read-only and won't have any effects, but considering the semantic
>>> is to inhibit counting at certain privilege mode, initialize it to MINH will
>>> make it clear.
>> Wouldn't that be confusing ? I feel we need a comment there as well to explain why
>> are setting MINH in S-mode if we need that.
>>
> sounds reasonable. let's keep it as is.
>
>>>> + bool guest_events = false;
>>>> +
>>>> + if (event->attr.config1 & RISCV_PMU_CONFIG1_GUEST_EVENTS)
>>>> + guest_events = true;
>>> use attr::config1 to distinguish the KVM events looks incorrect. it's a user
>>> visible interface and could be set explicitly by the user and break the
>>> logic here.. e.g. perf stat -e cycles/config1=0x1/
>> Reusing config1 for kvm guest events are already in upstream. As KVM is just another user of host perf driver, it is used. The config is event specific so a user specific event vs kvm initiated event would be separate anyways.
>>
>> But we can harden the interface with additional check using this which was exclusive to perf_event_create_kernel_counter which
>> kvm invokes[1].
>>
>> event->owner = TASK_TOMBSTONE;
>>
>> [1] https://github.com/torvalds/linux/blob/master/kernel/events/core.c#L14324
>>
> makes sense. there's a is_kernel_event() wrapper but currently is local
> there in the event core (so is TASK_TOMBSTONE).
Correct.
> but yes it's not introduced by this patch.
>
>>>> + if (event->attr.exclude_kernel)
>>>> + priv_filter_bits |= guest_events ? HPMEVENT_VSINH : HPMEVENT_SINH;
>>>> + if (event->attr.exclude_user)
>>>> + priv_filter_bits |= guest_events ? HPMEVENT_VUINH : HPMEVENT_UINH;
>>>> + if (guest_events && event->attr.exclude_hv)
>>>> + priv_filter_bits |= HPMEVENT_SINH;
>>>> + if (event->attr.exclude_host)
>>>> + priv_filter_bits |= HPMEVENT_UINH | HPMEVENT_SINH;
>>>> + if (event->attr.exclude_guest)
>>>> + priv_filter_bits |= HPMEVENT_VSINH | HPMEVENT_VUINH;
>>>> +
>>>> + return priv_filter_bits;
>>>> +}
>>>> +
> [...]
>
>>>> +static void rvpmu_deleg_ctr_enable_irq(struct perf_event *event)
>>>> +{
>>>> + unsigned long hpmevent_curr;
>>>> + unsigned long of_mask;
>>>> + struct hw_perf_event *hwc = &event->hw;
>>>> + int counter_idx = hwc->idx;
>>>> + unsigned long sip_val = csr_read(CSR_SIP);
>>>> +
>>>> + if (!is_sampling_event(event) || (sip_val & SIP_LCOFIP))
>>> we should also consider overflow for counters of non-sampling events..
>> This is intentional. As per the sscofpmf, OF bits as a interrupt disable and overflow indicator.
>> So we need to clear the bit if you need the interrupt for the sampled events.
>>
>> For non sampled events, that is not necessary. But If it overflows, it shouldn't raise an interrupt.
>>
> okay I see the existing interrupt handler skip the non-sample events as well
> so it's the current policy of the driver. but generally we should handle
> the overflow of non sampled events as well to avoid count lost if the counter
> is implemened less than 64bit. in such case it's possible to overflow
> several times for a long counting period.
The wrap is already accounted for: riscv_pmu_event_update() recovers the
delta with (new - prev) & cmask, which is correct for any advance short of a full lap,
and the half-width preload in riscv_pmu_event_init() keeps prev_count away from the
wrap point. This common design across architectures. If a platform implement too narrow
counter width such that overflow several times for a long counting period without a single
context switch, that's a platform problem.
> it's also another thing not introduced by this patch so we may keep the handling
> here as is.
>
> thanks.
WARNING: multiple messages have this Message-ID (diff)
From: Atish Patra <atish.patra@linux.dev>
To: Yicong Yang <yang.yicong@picoheart.com>
Cc: Jiri Olsa <jolsa@kernel.org>, Paul Walmsley <pjw@kernel.org>,
Mark Rutland <mark.rutland@arm.com>,
Rob Herring <robh@kernel.org>, Anup Patel <anup@brainfault.org>,
Namhyung Kim <namhyung@kernel.org>,
Arnaldo Carvalho de Melo <acme@kernel.org>,
Krzysztof Kozlowski <krzk+dt@kernel.org>,
Ian Rogers <irogers@google.com>, Will Deacon <will@kernel.org>,
James Clark <james.clark@linaro.org>,
linux-arm-kernel@lists.infradead.org,
linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org,
devicetree@vger.kernel.org, linux-perf-users@vger.kernel.org,
Conor Dooley <conor@kernel.org>
Subject: Re: [PATCH v8 14/22] RISC-V: perf: Implement supervisor counter delegation support
Date: Thu, 6 Aug 2026 14:45:03 -0700 [thread overview]
Message-ID: <a8749023-d598-43d9-8a64-569b2d057438@linux.dev> (raw)
In-Reply-To: <15b63bb1-ea29-42cd-905c-fbecc8423118@picoheart.com>
On 8/6/26 5:16 AM, Yicong Yang wrote:
> On 8/6/26 10:00 AM, Atish Patra wrote:
>> On 7/7/26 1:24 AM, Yicong Yang wrote:
>>> On 7/1/26 4:47 PM, Atish Patra wrote:
>>>> From: Atish Patra <atishp@rivosinc.com>
>>>>
>>>> There are few new RISC-V ISA exensions (ssccfg, sscsrind, smcntrpmf) which
>>>> allows the hpmcounter/hpmevents to be programmed directly from S-mode. The
>>>> implementation detects the ISA extension at runtime and uses them if
>>>> available instead of SBI PMU extension. SBI PMU extension will still be
>>>> used for firmware counters if the user requests it.
>>>>
>>>> The current linux driver relies on event encoding defined by SBI PMU
>>>> specification for standard perf events. However, there are no standard
>>>> event encoding available in the ISA. In the future, we may want to
>>>> decouple the counter delegation and SBI PMU completely. In that case,
>>>> counter delegation supported platforms must rely on the event encoding
>>>> defined in the perf json file or in the pmu driver.
>>>>
>>>> For firmware events, it will continue to use the SBI PMU encoding as
>>>> one can not support firmware event without SBI PMU.
>>>>
>>>> Signed-off-by: Atish Patra <atishp@rivosinc.com>
>>>> ---
>>>> arch/riscv/include/asm/csr.h | 1 +
>>>> drivers/perf/riscv_pmu_sbi.c | 578 +++++++++++++++++++++++++++++++++--------
>>>> include/linux/perf/riscv_pmu.h | 3 +
>>>> 3 files changed, 478 insertions(+), 104 deletions(-)
>>>>
>>>> diff --git a/arch/riscv/include/asm/csr.h b/arch/riscv/include/asm/csr.h
>>>> index a3b24b88e401..cd22b5168689 100644
>>>> --- a/arch/riscv/include/asm/csr.h
>>>> +++ b/arch/riscv/include/asm/csr.h
>>>> @@ -258,6 +258,7 @@
>>>> #endif
>>>> #define SISELECT_SSCCFG_BASE 0x40
>>>> +#define HPMEVENT_MASK GENMASK_ULL(63, 56)
>>>> /* mseccfg bits */
>>>> #define MSECCFG_PMM ENVCFG_PMM
>>>> diff --git a/drivers/perf/riscv_pmu_sbi.c b/drivers/perf/riscv_pmu_sbi.c
>>>> index 2568c6808f5d..7995da4a98a1 100644
>>>> --- a/drivers/perf/riscv_pmu_sbi.c
>>>> +++ b/drivers/perf/riscv_pmu_sbi.c
>>>> @@ -28,6 +28,8 @@
>>>> #include <asm/cpufeature.h>
>>>> #include <asm/vendor_extensions.h>
>>>> #include <asm/vendor_extensions/andes.h>
>>>> +#include <asm/hwcap.h>
>>>> +#include <asm/csr_ind.h>
>>>> #define ALT_SBI_PMU_OVERFLOW(__ovl) \
>>>> asm volatile(ALTERNATIVE_2( \
>>>> @@ -60,7 +62,20 @@ asm volatile(ALTERNATIVE( \
>>>> #define PERF_EVENT_FLAG_USER_ACCESS BIT(SYSCTL_USER_ACCESS)
>>>> #define PERF_EVENT_FLAG_LEGACY BIT(SYSCTL_LEGACY)
>>>> -PMU_FORMAT_ATTR(event, "config:0-55");
>>>> +#define RVPMU_SBI_PMU_FORMAT_ATTR "config:0-47"
>>>> +#define RVPMU_CDELEG_PMU_FORMAT_ATTR "config:0-55"
>>>> +
>>>> +static ssize_t __maybe_unused rvpmu_format_show(struct device *dev, struct device_attribute *attr,
>>>> + char *buf);
>>>> +
>>>> +#define RVPMU_ATTR_ENTRY(_name, _func, _config) ( \
>>>> + &((struct dev_ext_attribute[]) { \
>>>> + { __ATTR(_name, 0444, _func, NULL), (void *)_config } \
>>>> + })[0].attr.attr)
>>>> +
>>>> +#define RVPMU_FORMAT_ATTR_ENTRY(_name, _config) \
>>>> + RVPMU_ATTR_ENTRY(_name, rvpmu_format_show, (char *)_config)
>>>> +
>>>> PMU_FORMAT_ATTR(firmware, "config:62-63");
>>>> static bool sbi_v2_available;
>>>> @@ -68,7 +83,11 @@ static bool sbi_v3_available;
>>>> static DEFINE_STATIC_KEY_FALSE(sbi_pmu_snapshot_available);
>>>> #define sbi_pmu_snapshot_available() \
>>>> static_branch_unlikely(&sbi_pmu_snapshot_available)
>>>> +
>>>> static DEFINE_STATIC_KEY_FALSE(riscv_pmu_sbi_available);
>>>> +#define riscv_pmu_sbi_available() \
>>>> + static_branch_likely(&riscv_pmu_sbi_available)
>>>> +
>>>> static DEFINE_STATIC_KEY_FALSE(riscv_pmu_cdeleg_available);
>>>> /* Avoid unnecessary code patching in the one time booting path*/
>>>> @@ -83,19 +102,35 @@ static DEFINE_STATIC_KEY_FALSE(riscv_pmu_cdeleg_available);
>>>> #define riscv_pmu_sbi_available() \
>>>> static_branch_likely(&riscv_pmu_sbi_available)
>>>> -static struct attribute *riscv_arch_formats_attr[] = {
>>>> - &format_attr_event.attr,
>>>> +static struct attribute *riscv_sbi_pmu_formats_attr[] = {
>>>> + RVPMU_FORMAT_ATTR_ENTRY(event, RVPMU_SBI_PMU_FORMAT_ATTR),
>>>> &format_attr_firmware.attr,
>>>> NULL,
>>>> };
>>>> -static struct attribute_group riscv_pmu_format_group = {
>>>> +static struct attribute_group riscv_sbi_pmu_format_group = {
>>>> .name = "format",
>>>> - .attrs = riscv_arch_formats_attr,
>>>> + .attrs = riscv_sbi_pmu_formats_attr,
>>>> };
>>>> -static const struct attribute_group *riscv_pmu_attr_groups[] = {
>>>> - &riscv_pmu_format_group,
>>>> +static const struct attribute_group *riscv_sbi_pmu_attr_groups[] = {
>>>> + &riscv_sbi_pmu_format_group,
>>>> + NULL,
>>>> +};
>>>> +
>>>> +static struct attribute *riscv_cdeleg_pmu_formats_attr[] = {
>>>> + RVPMU_FORMAT_ATTR_ENTRY(event, RVPMU_CDELEG_PMU_FORMAT_ATTR),
>>>> + &format_attr_firmware.attr,
>>>> + NULL,
>>>> +};
>>>> +
>>>> +static struct attribute_group riscv_cdeleg_pmu_format_group = {
>>>> + .name = "format",
>>>> + .attrs = riscv_cdeleg_pmu_formats_attr,
>>>> +};
>>>> +
>>>> +static const struct attribute_group *riscv_cdeleg_pmu_attr_groups[] = {
>>>> + &riscv_cdeleg_pmu_format_group,
>>>> NULL,
>>>> };
>>>> @@ -482,6 +517,14 @@ static void rvpmu_sbi_check_std_events(struct work_struct *work)
>>>> static DECLARE_WORK(check_std_events_work, rvpmu_sbi_check_std_events);
>>>> +static ssize_t rvpmu_format_show(struct device *dev,
>>>> + struct device_attribute *attr, char *buf)
>>>> +{
>>>> + struct dev_ext_attribute *eattr = container_of(attr,
>>>> + struct dev_ext_attribute, attr);
>>>> + return sysfs_emit(buf, "%s\n", (char *)eattr->var);
>>>> +}
>>>> +
>>>> static int rvpmu_ctr_get_width(int idx)
>>>> {
>>>> return pmu_ctr_list[idx].width;
>>>> @@ -599,6 +642,38 @@ static uint8_t rvpmu_csr_index(struct perf_event *event)
>>>> return pmu_ctr_list[event->hw.idx].csr - CSR_CYCLE;
>>>> }
>>>> +static uint64_t get_deleg_priv_filter_bits(struct perf_event *event)
>>>> +{
>>>> + u64 priv_filter_bits = 0;
>>> could we explicitly initialize the priv_filter_bits to MINH? though this bit
>>> is S-mode read-only and won't have any effects, but considering the semantic
>>> is to inhibit counting at certain privilege mode, initialize it to MINH will
>>> make it clear.
>> Wouldn't that be confusing ? I feel we need a comment there as well to explain why
>> are setting MINH in S-mode if we need that.
>>
> sounds reasonable. let's keep it as is.
>
>>>> + bool guest_events = false;
>>>> +
>>>> + if (event->attr.config1 & RISCV_PMU_CONFIG1_GUEST_EVENTS)
>>>> + guest_events = true;
>>> use attr::config1 to distinguish the KVM events looks incorrect. it's a user
>>> visible interface and could be set explicitly by the user and break the
>>> logic here.. e.g. perf stat -e cycles/config1=0x1/
>> Reusing config1 for kvm guest events are already in upstream. As KVM is just another user of host perf driver, it is used. The config is event specific so a user specific event vs kvm initiated event would be separate anyways.
>>
>> But we can harden the interface with additional check using this which was exclusive to perf_event_create_kernel_counter which
>> kvm invokes[1].
>>
>> event->owner = TASK_TOMBSTONE;
>>
>> [1] https://github.com/torvalds/linux/blob/master/kernel/events/core.c#L14324
>>
> makes sense. there's a is_kernel_event() wrapper but currently is local
> there in the event core (so is TASK_TOMBSTONE).
Correct.
> but yes it's not introduced by this patch.
>
>>>> + if (event->attr.exclude_kernel)
>>>> + priv_filter_bits |= guest_events ? HPMEVENT_VSINH : HPMEVENT_SINH;
>>>> + if (event->attr.exclude_user)
>>>> + priv_filter_bits |= guest_events ? HPMEVENT_VUINH : HPMEVENT_UINH;
>>>> + if (guest_events && event->attr.exclude_hv)
>>>> + priv_filter_bits |= HPMEVENT_SINH;
>>>> + if (event->attr.exclude_host)
>>>> + priv_filter_bits |= HPMEVENT_UINH | HPMEVENT_SINH;
>>>> + if (event->attr.exclude_guest)
>>>> + priv_filter_bits |= HPMEVENT_VSINH | HPMEVENT_VUINH;
>>>> +
>>>> + return priv_filter_bits;
>>>> +}
>>>> +
> [...]
>
>>>> +static void rvpmu_deleg_ctr_enable_irq(struct perf_event *event)
>>>> +{
>>>> + unsigned long hpmevent_curr;
>>>> + unsigned long of_mask;
>>>> + struct hw_perf_event *hwc = &event->hw;
>>>> + int counter_idx = hwc->idx;
>>>> + unsigned long sip_val = csr_read(CSR_SIP);
>>>> +
>>>> + if (!is_sampling_event(event) || (sip_val & SIP_LCOFIP))
>>> we should also consider overflow for counters of non-sampling events..
>> This is intentional. As per the sscofpmf, OF bits as a interrupt disable and overflow indicator.
>> So we need to clear the bit if you need the interrupt for the sampled events.
>>
>> For non sampled events, that is not necessary. But If it overflows, it shouldn't raise an interrupt.
>>
> okay I see the existing interrupt handler skip the non-sample events as well
> so it's the current policy of the driver. but generally we should handle
> the overflow of non sampled events as well to avoid count lost if the counter
> is implemened less than 64bit. in such case it's possible to overflow
> several times for a long counting period.
The wrap is already accounted for: riscv_pmu_event_update() recovers the
delta with (new - prev) & cmask, which is correct for any advance short of a full lap,
and the half-width preload in riscv_pmu_event_init() keeps prev_count away from the
wrap point. This common design across architectures. If a platform implement too narrow
counter width such that overflow several times for a long counting period without a single
context switch, that's a platform problem.
> it's also another thing not introduced by this patch so we may keep the handling
> here as is.
>
> thanks.
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
next prev parent reply other threads:[~2026-08-06 21:45 UTC|newest]
Thread overview: 147+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-01 8:46 [PATCH v8 00/22] Add Counter delegation ISA extension support Atish Patra
2026-07-01 8:46 ` Atish Patra
2026-07-01 8:46 ` [PATCH v8 01/22] RISC-V: perf: fix resource cleanup on driver probe failure Atish Patra
2026-07-01 8:46 ` Atish Patra
2026-07-01 9:11 ` sashiko-bot
2026-07-20 7:21 ` Charlie Jenkins
2026-07-20 7:21 ` Charlie Jenkins
2026-08-04 23:25 ` Paul Walmsley
2026-08-04 23:25 ` Paul Walmsley
2026-07-01 8:46 ` [PATCH v8 02/22] RISC-V: Add Sxcsrind ISA extension CSR definitions Atish Patra
2026-07-01 8:46 ` Atish Patra
2026-07-20 7:21 ` Charlie Jenkins
2026-07-20 7:21 ` Charlie Jenkins
2026-08-04 23:35 ` Paul Walmsley
2026-08-04 23:35 ` Paul Walmsley
2026-08-04 23:42 ` Paul Walmsley
2026-08-04 23:42 ` Paul Walmsley
2026-08-05 7:30 ` Atish Patra
2026-08-05 7:30 ` Atish Patra
2026-07-01 8:46 ` [PATCH v8 03/22] RISC-V: Add Sxcsrind ISA extension definition and parsing Atish Patra
2026-07-01 8:46 ` Atish Patra
2026-07-20 7:21 ` Charlie Jenkins
2026-07-20 7:21 ` Charlie Jenkins
2026-08-04 23:58 ` Paul Walmsley
2026-08-04 23:58 ` Paul Walmsley
2026-07-01 8:46 ` [PATCH v8 04/22] dt-bindings: riscv: add Sxcsrind ISA extension description Atish Patra
2026-07-01 8:46 ` Atish Patra
2026-08-05 0:29 ` Paul Walmsley
2026-08-05 0:29 ` Paul Walmsley
2026-07-01 8:46 ` [PATCH v8 05/22] RISC-V: Define indirect CSR access helpers Atish Patra
2026-07-01 8:46 ` Atish Patra
2026-07-20 7:21 ` Charlie Jenkins
2026-07-20 7:21 ` Charlie Jenkins
2026-08-05 0:39 ` Paul Walmsley
2026-08-05 0:39 ` Paul Walmsley
2026-08-05 7:59 ` Atish Patra
2026-08-05 7:59 ` Atish Patra
2026-08-08 1:04 ` Paul Walmsley
2026-08-08 1:04 ` Paul Walmsley
2026-08-08 7:32 ` Atish Patra
2026-08-08 7:32 ` Atish Patra
2026-08-05 8:07 ` Atish Patra
2026-08-05 8:07 ` Atish Patra
2026-07-01 8:46 ` [PATCH v8 06/22] RISC-V: Add Smcntrpmf extension parsing Atish Patra
2026-07-01 8:46 ` Atish Patra
2026-07-20 7:21 ` Charlie Jenkins
2026-07-20 7:21 ` Charlie Jenkins
2026-08-05 0:44 ` Paul Walmsley
2026-08-05 0:44 ` Paul Walmsley
2026-07-01 8:46 ` [PATCH v8 07/22] dt-bindings: riscv: add Smcntrpmf ISA extension description Atish Patra
2026-07-01 8:46 ` Atish Patra
2026-08-05 0:44 ` Paul Walmsley
2026-08-05 0:44 ` Paul Walmsley
2026-07-01 8:46 ` [PATCH v8 08/22] RISC-V: Add Sscfg extension CSR definition Atish Patra
2026-07-01 8:46 ` Atish Patra
2026-07-20 7:21 ` Charlie Jenkins
2026-07-20 7:21 ` Charlie Jenkins
2026-08-05 0:43 ` Paul Walmsley
2026-08-05 0:43 ` Paul Walmsley
2026-07-01 8:46 ` [PATCH v8 09/22] RISC-V: Add Ssccfg/Smcdeleg ISA extension definition and parsing Atish Patra
2026-07-01 8:46 ` Atish Patra
2026-07-01 9:11 ` sashiko-bot
2026-07-20 7:21 ` Charlie Jenkins
2026-07-20 7:21 ` Charlie Jenkins
2026-08-05 0:46 ` Paul Walmsley
2026-08-05 0:46 ` Paul Walmsley
2026-07-01 8:46 ` [PATCH v8 10/22] dt-bindings: riscv: add Counter delegation ISA extensions description Atish Patra
2026-07-01 8:46 ` Atish Patra
2026-08-05 0:48 ` Paul Walmsley
2026-08-05 0:48 ` Paul Walmsley
2026-07-01 8:46 ` [PATCH v8 11/22] RISC-V: perf: Restructure the SBI PMU code Atish Patra
2026-07-01 8:46 ` Atish Patra
2026-08-05 2:29 ` Paul Walmsley
2026-08-05 2:29 ` Paul Walmsley
2026-08-05 8:26 ` Atish Patra
2026-08-05 8:26 ` Atish Patra
2026-07-01 8:47 ` [PATCH v8 12/22] RISC-V: perf: Modify the counter discovery mechanism Atish Patra
2026-07-01 8:47 ` Atish Patra
2026-07-01 9:20 ` sashiko-bot
2026-07-07 7:45 ` Yicong Yang
2026-07-07 7:45 ` Yicong Yang
2026-08-05 8:46 ` Atish Patra
2026-08-05 8:46 ` Atish Patra
2026-07-20 7:21 ` Charlie Jenkins
2026-07-20 7:21 ` Charlie Jenkins
2026-08-07 8:08 ` Atish Patra
2026-08-07 8:08 ` Atish Patra
2026-08-11 3:50 ` Charlie Jenkins
2026-08-11 3:50 ` Charlie Jenkins
2026-07-01 8:47 ` [PATCH v8 13/22] RISC-V: perf: Add a mechanism to defined legacy event encoding Atish Patra
2026-07-01 8:47 ` Atish Patra
2026-07-01 9:19 ` sashiko-bot
2026-07-07 7:51 ` Yicong Yang
2026-07-07 7:51 ` Yicong Yang
2026-08-03 21:53 ` Atish Patra
2026-08-03 21:53 ` Atish Patra
2026-07-20 7:21 ` Charlie Jenkins
2026-07-20 7:21 ` Charlie Jenkins
2026-07-01 8:47 ` [PATCH v8 14/22] RISC-V: perf: Implement supervisor counter delegation support Atish Patra
2026-07-01 8:47 ` Atish Patra
2026-07-01 9:27 ` sashiko-bot
2026-07-07 8:24 ` Yicong Yang
2026-07-07 8:24 ` Yicong Yang
2026-08-06 2:00 ` Atish Patra
2026-08-06 2:00 ` Atish Patra
2026-08-06 12:16 ` Yicong Yang
2026-08-06 12:16 ` Yicong Yang
2026-08-06 21:45 ` Atish Patra [this message]
2026-08-06 21:45 ` Atish Patra
2026-07-20 7:21 ` Charlie Jenkins
2026-07-20 7:21 ` Charlie Jenkins
2026-07-01 8:47 ` [PATCH v8 15/22] RISC-V: perf: Skip PMU SBI extension when not implemented Atish Patra
2026-07-01 8:47 ` Atish Patra
2026-07-01 9:26 ` sashiko-bot
2026-07-01 8:47 ` [PATCH v8 16/22] RISC-V: perf: Use config2/vendor table for event to counter mapping Atish Patra
2026-07-01 8:47 ` Atish Patra
2026-07-01 9:35 ` sashiko-bot
2026-07-20 7:21 ` Charlie Jenkins
2026-07-20 7:21 ` Charlie Jenkins
2026-07-01 8:47 ` [PATCH v8 17/22] RISC-V: perf: Add legacy event encodings via sysfs Atish Patra
2026-07-01 8:47 ` Atish Patra
2026-07-20 7:21 ` Charlie Jenkins
2026-07-20 7:21 ` Charlie Jenkins
2026-07-01 8:47 ` [PATCH v8 18/22] RISC-V: perf: Add Qemu virt machine events Atish Patra
2026-07-01 8:47 ` Atish Patra
2026-07-20 7:21 ` Charlie Jenkins
2026-07-20 7:21 ` Charlie Jenkins
2026-07-01 8:47 ` [PATCH v8 19/22] tools/perf: Support event code for arch standard events Atish Patra
2026-07-01 8:47 ` Atish Patra
2026-07-01 17:44 ` Ian Rogers
2026-07-01 17:44 ` Ian Rogers
2026-07-01 8:47 ` [PATCH v8 20/22] tools/perf: Add RISC-V CounterIDMask event field Atish Patra
2026-07-01 8:47 ` Atish Patra
2026-07-01 17:44 ` Ian Rogers
2026-07-01 17:44 ` Ian Rogers
2026-07-01 8:47 ` [PATCH v8 21/22] TEST(do-not-upstream): fake qemu-virt PMU events for cdeleg counter-mask testing Atish Patra
2026-07-01 8:47 ` Atish Patra
2026-07-01 9:38 ` sashiko-bot
2026-07-01 8:47 ` [PATCH v8 22/22] TEST(do-not-upstream): fake qemu vendor JSON + mapfile entry for CounterIDMask path Atish Patra
2026-07-01 8:47 ` Atish Patra
2026-07-01 9:34 ` sashiko-bot
2026-08-05 1:00 ` [PATCH v8 00/22] Add Counter delegation ISA extension support patchwork-bot+linux-riscv
2026-08-05 1:00 ` patchwork-bot+linux-riscv
2026-08-05 2:14 ` Paul Walmsley
2026-08-05 2:14 ` Paul Walmsley
2026-08-05 8:03 ` Atish Patra
2026-08-05 8:03 ` Atish Patra
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=a8749023-d598-43d9-8a64-569b2d057438@linux.dev \
--to=atish.patra@linux.dev \
--cc=acme@kernel.org \
--cc=anup@brainfault.org \
--cc=conor@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=irogers@google.com \
--cc=james.clark@linaro.org \
--cc=jolsa@kernel.org \
--cc=krzk+dt@kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=linux-riscv@lists.infradead.org \
--cc=mark.rutland@arm.com \
--cc=namhyung@kernel.org \
--cc=pjw@kernel.org \
--cc=robh@kernel.org \
--cc=will@kernel.org \
--cc=yang.yicong@picoheart.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.