[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