Re: [PATCH] lib: sbi_ipi: Validate hartids against domain, not HSM state

Anup Patel <[email protected]> Tue, 21 Jul 2026 11:34:23 +0530
Newsgroups org.infradead.lists.opensbi
Message-ID <CAAhSdy0XEA8K=okZL3vaR+e6nKEx+3NZ+hYy2HOCSsQmRb2P5Q@mail.gmail.com>
On Fri, Jun 12, 2026 at 5:22 PM Chen Pei <[email protected]> wrote:
>
> Commit 37eaca4ab33d ("lib: sbi_ipi: Return error for invalid hartids")
> added a weight check against the HSM-interruptible mask, which excludes
> harts in STOPPED state. This causes sbi_ipi_send_many() to return
> SBI_EINVAL when the kernel sends a remote fence (e.g. TLB shootdown)
> whose hmask includes a hart that was stopped by CPU hotplug:
>
>   __sbi_rfence_v02_call: hbase = [0] hmask = [0x3] failed (error [-22])
>
> Validate requested hartids against the domain's assigned hartmask
> instead. This still rejects truly invalid or cross-domain hartids, but
> allows HSM-STOPPED harts to be silently skipped — which is safe because
> a stopped hart will do a full local TLB flush on its next HSM start
> before re-entering S-mode.
>
> Fixes: 37eaca4ab33d ("lib: sbi_ipi: Return error for invalid hartids")
> Signed-off-by: Chen Pei <[email protected]>

LGTM.

Reviewed-by: Anup Patel <[email protected]>

Applied this patch to the riscv/opensbi repo.

Thanks,
Anup

> ---
>  lib/sbi/sbi_ipi.c | 11 +++++++++--
>  1 file changed, 9 insertions(+), 2 deletions(-)
>
> diff --git a/lib/sbi/sbi_ipi.c b/lib/sbi/sbi_ipi.c
> index 5b2d2f72..b04a5877 100644
> --- a/lib/sbi/sbi_ipi.c
> +++ b/lib/sbi/sbi_ipi.c
> @@ -136,6 +136,7 @@ int sbi_ipi_send_many(ulong hmask, ulong hbase, u32 event, void *data)
>
>         if (hbase != -1UL) {
>                 struct sbi_hartmask tmp_mask = { 0 };
> +               struct sbi_hartmask domain_mask;
>                 int count = sbi_popcount(hmask);
>
>                 for (i = hbase; hmask; i++, hmask >>= 1) {
> @@ -143,10 +144,16 @@ int sbi_ipi_send_many(ulong hmask, ulong hbase, u32 event, void *data)
>                                 sbi_hartmask_set_hartid(i, &tmp_mask);
>                 }
>
> -               sbi_hartmask_and(&target_mask, &target_mask, &tmp_mask);
> +               /* Validate hartids against domain assignment, not HSM state */
> +               rc = sbi_domain_get_assigned_hartmask(dom, &domain_mask);
> +               if (rc)
> +                       return rc;
>
> -               if (sbi_hartmask_weight(&target_mask) != count)
> +               sbi_hartmask_and(&domain_mask, &domain_mask, &tmp_mask);
> +               if (sbi_hartmask_weight(&domain_mask) != count)
>                         return SBI_EINVAL;
> +
> +               sbi_hartmask_and(&target_mask, &target_mask, &tmp_mask);
>         }
>
>         /* Send IPIs */
> --
> 2.50.1
>
>
> --
> opensbi mailing list
> [email protected]
> http://lists.infradead.org/mailman/listinfo/opensbi

-- 
opensbi mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/opensbi