[PATCH v5 2/4] lib: sbi: Optimize sbi_ipi

Anup Patel anup at brainfault.org
Thu Apr 13 02:15:16 PDT 2023


On Tue, Apr 11, 2023 at 10:27 AM Xiang W <wxjstz at 126.com> wrote:
>
> the original sbi_ipi will be processed by hart by hart, after optimization,
> send ipi first and finally wait together.
>
> Signed-off-by: Xiang W <wxjstz at 126.com>

Reviewed-by: Anup Patel <anup at brainfault.org>
Tested-by: Anup Patel <anup at brainfault.org>

Applied this patch to the riscv/opensbi repo.

Thanks,
Anup

> ---
>  lib/sbi/sbi_ipi.c | 36 +++++++++++++++++++++++++++++++++---
>  1 file changed, 33 insertions(+), 3 deletions(-)
>
> diff --git a/lib/sbi/sbi_ipi.c b/lib/sbi/sbi_ipi.c
> index b9f6205..33bff7a 100644
> --- a/lib/sbi/sbi_ipi.c
> +++ b/lib/sbi/sbi_ipi.c
> @@ -69,6 +69,18 @@ static int sbi_ipi_send(struct sbi_scratch *scratch, u32 remote_hartid,
>
>         sbi_pmu_ctr_incr_fw(SBI_PMU_FW_IPI_SENT);
>
> +       return 0;
> +}
> +
> +static int sbi_ipi_sync(struct sbi_scratch *scratch, u32 event)
> +{
> +       const struct sbi_ipi_event_ops *ipi_ops;
> +
> +       if ((SBI_IPI_EVENT_MAX <= event) ||
> +           !ipi_ops_array[event])
> +               return SBI_EINVAL;
> +       ipi_ops = ipi_ops_array[event];
> +
>         if (ipi_ops->sync)
>                 ipi_ops->sync(scratch);
>
> @@ -83,7 +95,7 @@ static int sbi_ipi_send(struct sbi_scratch *scratch, u32 remote_hartid,
>  int sbi_ipi_send_many(ulong hmask, ulong hbase, u32 event, void *data)
>  {
>         int rc;
> -       ulong i, m;
> +       ulong i, m, n;
>         struct sbi_domain *dom = sbi_domain_thishart_ptr();
>         struct sbi_scratch *scratch = sbi_scratch_thishart_ptr();
>
> @@ -92,22 +104,40 @@ int sbi_ipi_send_many(ulong hmask, ulong hbase, u32 event, void *data)
>                 if (rc)
>                         return rc;
>                 m &= hmask;
> +               n = m;
>
> -               /* Send IPIs */
> +               /* update IPIs */
>                 for (i = hbase; m; i++, m >>= 1) {
>                         if (m & 1UL)
>                                 sbi_ipi_send(scratch, i, event, data);
>                 }
> +
> +               /* sync IPIs */
> +               m = n;
> +               for (i = hbase; m; i++, m >>= 1) {
> +                       if (m & 1UL)
> +                               sbi_ipi_sync(scratch, event);
> +               }
>         } else {
> +               /* update IPIs */
>                 hbase = 0;
>                 while (!sbi_hsm_hart_interruptible_mask(dom, hbase, &m)) {
> -                       /* Send IPIs */
>                         for (i = hbase; m; i++, m >>= 1) {
>                                 if (m & 1UL)
>                                         sbi_ipi_send(scratch, i, event, data);
>                         }
>                         hbase += BITS_PER_LONG;
>                 }
> +
> +               /* sync IPIs */
> +               hbase = 0;
> +               while (!sbi_hsm_hart_interruptible_mask(dom, hbase, &m)) {
> +                       for (i = hbase; m; i++, m >>= 1) {
> +                               if (m & 1UL)
> +                                       sbi_ipi_sync(scratch, event);
> +                       }
> +                       hbase += BITS_PER_LONG;
> +               }
>         }
>
>         return 0;
> --
> 2.39.2
>



More information about the opensbi mailing list