[PATCH v2] lib: sbi: Optimize saddr mapping in sbi_dbtr.c

Anup Patel anup at brainfault.org
Mon Jun 16 04:41:23 PDT 2025


On Wed, May 14, 2025 at 10:54 AM Xiang W <wxjstz at 126.com> wrote:
>
> The original implementation mapped saddr individually for each entry.
> The updated code now maps saddr for all entries in a single operation.
> This change reduces the number of PMP (Physical Memory Protection)
> operations, improving efficiency and performance.
>
> Signed-off-by: Xiang W <wxjstz at 126.com>

Included Himanshu's Reviewed-by and Tested-by at the time
of merging this patch.

Applied this patch to the riscv/opensbi repo.

Thanks,
Anup


> ---
> changes in v2:
> - Fixed a type conversion error
> ---
>  lib/sbi/sbi_dbtr.c | 15 ++++++++-------
>  1 file changed, 8 insertions(+), 7 deletions(-)
>
> diff --git a/lib/sbi/sbi_dbtr.c b/lib/sbi/sbi_dbtr.c
> index f0e91285..b018e7cb 100644
> --- a/lib/sbi/sbi_dbtr.c
> +++ b/lib/sbi/sbi_dbtr.c
> @@ -523,16 +523,17 @@ int sbi_dbtr_read_trig(unsigned long smode,
>
>         shmem_base = hart_shmem_base(hs);
>
> +       sbi_hart_map_saddr((unsigned long)shmem_base,
> +                          trig_count * sizeof(*entry));
>         for_each_trig_entry(shmem_base, trig_count, typeof(*entry), entry) {
> -               sbi_hart_map_saddr((unsigned long)entry, sizeof(*entry));
>                 xmit = &entry->data;
>                 trig = INDEX_TO_TRIGGER((_idx + trig_idx_base));
>                 xmit->tstate = cpu_to_lle(trig->state);
>                 xmit->tdata1 = cpu_to_lle(trig->tdata1);
>                 xmit->tdata2 = cpu_to_lle(trig->tdata2);
>                 xmit->tdata3 = cpu_to_lle(trig->tdata3);
> -               sbi_hart_unmap_saddr();
>         }
> +       sbi_hart_unmap_saddr();
>
>         return SBI_SUCCESS;
>  }
> @@ -556,10 +557,11 @@ int sbi_dbtr_install_trig(unsigned long smode,
>                 return SBI_ERR_NO_SHMEM;
>
>         shmem_base = hart_shmem_base(hs);
> +       sbi_hart_map_saddr((unsigned long)shmem_base,
> +                          trig_count * sizeof(*entry));
>
>         /* Check requested triggers configuration */
>         for_each_trig_entry(shmem_base, trig_count, typeof(*entry), entry) {
> -               sbi_hart_map_saddr((unsigned long)entry, sizeof(*entry));
>                 recv = (struct sbi_dbtr_data_msg *)(&entry->data);
>                 ctrl = recv->tdata1;
>
> @@ -574,11 +576,11 @@ int sbi_dbtr_install_trig(unsigned long smode,
>                         sbi_hart_unmap_saddr();
>                         return SBI_ERR_FAILED;
>                 }
> -               sbi_hart_unmap_saddr();
>         }
>
>         if (hs->available_trigs < trig_count) {
>                 *out = hs->available_trigs;
> +               sbi_hart_unmap_saddr();
>                 return SBI_ERR_FAILED;
>         }
>
> @@ -590,16 +592,15 @@ int sbi_dbtr_install_trig(unsigned long smode,
>                  */
>                 trig = sbi_alloc_trigger();
>
> -               sbi_hart_map_saddr((unsigned long)entry, sizeof(*entry));
> -
>                 recv = (struct sbi_dbtr_data_msg *)(&entry->data);
>                 xmit = (struct sbi_dbtr_id_msg *)(&entry->id);
>
>                 dbtr_trigger_setup(trig,  recv);
>                 dbtr_trigger_enable(trig);
>                 xmit->idx = cpu_to_lle(trig->index);
> -               sbi_hart_unmap_saddr();
> +
>         }
> +       sbi_hart_unmap_saddr();
>
>         return SBI_SUCCESS;
>  }
> --
> 2.47.2
>



More information about the opensbi mailing list