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