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

Anup Patel anup at brainfault.org
Thu Apr 6 00:38:59 PDT 2023


On Thu, Feb 2, 2023 at 2:52 PM Xiang W <wxjstz at 126.com> wrote:
>
> the original sbI_ipi will be processed by hart by hart, after optimization,

s/sbl_ipi/sbi_ipi/

> send ipi first and finally wait together.
>
> Signed-off-by: Xiang W <wxjstz at 126.com>
> ---
>  lib/sbi/sbi_ipi.c | 42 ++++++++++++++++++++++++++++++++++++------
>  1 file changed, 36 insertions(+), 6 deletions(-)
>
> diff --git a/lib/sbi/sbi_ipi.c b/lib/sbi/sbi_ipi.c
> index 1bcc2e4..92a33bd 100644
> --- a/lib/sbi/sbi_ipi.c
> +++ b/lib/sbi/sbi_ipi.c
> @@ -31,7 +31,7 @@ static unsigned long ipi_data_off;
>  static const struct sbi_ipi_device *ipi_dev = NULL;
>  static const struct sbi_ipi_event_ops *ipi_ops_array[SBI_IPI_EVENT_MAX];
>
> -static int sbi_ipi_send(struct sbi_scratch *scratch, u32 remote_hartid,
> +static int sbi_ipi_update(struct sbi_scratch *scratch, u32 remote_hartid,
>                         u32 event, void *data)

This is unnecessary renaming. Please drop this renaming.

>  {
>         int ret;
> @@ -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,19 +104,37 @@ 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);
> +                               sbi_ipi_update(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)) {
> +                       for (i = hbase; m; i++, m >>= 1) {
> +                               if (m & 1UL)
> +                                       sbi_ipi_update(scratch, i, event, data);
> +                       }
> +                       hbase += BITS_PER_LONG;
> +               }
> +
> +               /* sync IPIs */
>                 hbase = 0;

Set "m = n" here.

>                 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);
> +                                       sbi_ipi_sync(scratch, event);
>                         }
>                         hbase += BITS_PER_LONG;
>                 }
> --
> 2.39.0
>
>
> --
> opensbi mailing list
> opensbi at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/opensbi

Regards,
Anup



More information about the opensbi mailing list