[PATCH 1/2] lib: sbi_pmu: do not ignore pmu_ctr_start_hw() error in cfg_match
Anup Patel
anup at brainfault.org
Sun Oct 25 01:19:02 PDT 2026
On Sun, Oct 25, 2026 at 11:59 AM Sebastian Alba Vives
<sebasjosue84 at gmail.com> wrote:
>
> sbi_pmu_ctr_cfg_match() calls pmu_ctr_start_hw() for the AUTO_START
> flag and drops the result. pmu_ctr_start_hw() carries its own index
> guard
>
> if (cidx >= num_hw_ctrs || cidx == 1)
> return SBI_EINVAL;
>
> so a rejected index is reported to the caller as a successful
> configure.
>
> This is the only one of the three start paths in the file that
> discards the error. sbi_pmu_ctr_start() propagates it:
>
> ret = pmu_ctr_start_hw(cidx, ival, bUpdate);
> if (ret)
> return ret;
>
> and the firmware branch directly below this call site propagates the
> error from pmu_dev->fw_counter_start() as well.
>
> Propagate the error, except SBI_EALREADY_STARTED. That value only
> says the mcountinhibit bit was already clear, which is a benign
> condition for a configure call, and failing the whole call because
> the counter was already running would be a behaviour change for
> existing supervisors.
On the contrary, the configure should fail if the counter was already
running because the counter might have been configured for a different
event previously.
Otherwise, this looks good.
Regards,
Anup
>
> Fixes: 13d40f21d588 ("lib: sbi: Add PMU support")
> Signed-off-by: Sebastian Alba Vives <sebasjosue84 at gmail.com>
> ---
>
> Two things I kept out of the commit message because they are design
> questions rather than part of the fix.
>
> I filtered SBI_EALREADY_STARTED on the assumption that a configure
> call should not fail just because the counter was already running. If
> you would rather have every value propagated, the change is to drop
> the second half of the condition.
>
> The other is partial success. By the time this call site runs,
> phs->active_events[ctr_idx] has already been written, so returning an
> error leaves the counter configured while reporting a failed configure
> to the supervisor. I did not add a rollback because that goes beyond
> what you asked for, but I can send that instead if you would rather
> the call be all-or-nothing.
>
> lib/sbi/sbi_pmu.c | 7 +++++--
> 1 file changed, 5 insertions(+), 2 deletions(-)
>
> diff --git a/lib/sbi/sbi_pmu.c b/lib/sbi/sbi_pmu.c
> index 653b8f69..62d5e206 100644
> --- a/lib/sbi/sbi_pmu.c
> +++ b/lib/sbi/sbi_pmu.c
> @@ -982,8 +982,11 @@ skip_match:
> event_type == SBI_PMU_EVENT_TYPE_HW_RAW_V2) {
> if (flags & SBI_PMU_CFG_FLAG_CLEAR_VALUE)
> pmu_ctr_write_hw(ctr_idx, 0);
> - if (flags & SBI_PMU_CFG_FLAG_AUTO_START)
> - pmu_ctr_start_hw(ctr_idx, 0, false);
> + if (flags & SBI_PMU_CFG_FLAG_AUTO_START) {
> + ret = pmu_ctr_start_hw(ctr_idx, 0, false);
> + if (ret && ret != SBI_EALREADY_STARTED)
> + return ret;
> + }
> } else if (event_type == SBI_PMU_EVENT_TYPE_FW) {
> if (flags & SBI_PMU_CFG_FLAG_CLEAR_VALUE)
> phs->fw_counters_data[ctr_idx - num_hw_ctrs] = 0;
> --
> 2.43.0
>
>
> --
> opensbi mailing list
> opensbi at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/opensbi
More information about the opensbi
mailing list