[PATCH] lib: sbi: Optimize saddr mapping in sbi_dbtr.c
Himanshu Chauhan
hchauhan at ventanamicro.com
Sun Jun 15 23:09:19 PDT 2025
> On 14 May 2025, at 10:45 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>
> ---
> lib/sbi/sbi_dbtr.c | 13 ++++++-------
> 1 file changed, 6 insertions(+), 7 deletions(-)
>
> diff --git a/lib/sbi/sbi_dbtr.c b/lib/sbi/sbi_dbtr.c
> index f0e91285..06f6cd9e 100644
> --- a/lib/sbi/sbi_dbtr.c
> +++ b/lib/sbi/sbi_dbtr.c
> @@ -523,16 +523,16 @@ int sbi_dbtr_read_trig(unsigned long smode,
>
> shmem_base = hart_shmem_base(hs);
>
> + sbi_hart_map_saddr(shmem_base, trig_count * sizeof(*entry));
There is compilation warning here. The shmem_base variable is void * and sbi_hart_map_saddr expects
unsigned long.
> 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 +556,10 @@ int sbi_dbtr_install_trig(unsigned long smode,
> return SBI_ERR_NO_SHMEM;
>
> shmem_base = hart_shmem_base(hs);
> + sbi_hart_map_saddr(shmem_base, trig_count * sizeof(*entry));
ditto
>
> /* 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 +574,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 +590,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;
> }
As this warning exist prior to the patch…
Tested-by: Himanshu Chauhan <hchauhan at ventanamicro.com>
Reviewed-by: Himanshu Chauhan <hchauhan at ventanamicro.com>
> --
> 2.47.2
>
More information about the opensbi
mailing list