[PATCH v2] lib/sbi: optimize domain memory regions copying

Anup Patel anup at brainfault.org
Fri Dec 26 21:23:10 PST 2025


On Mon, Dec 8, 2025 at 6:26 PM Vladimir Kondratiev
<vladimir.kondratiev at mobileye.com> wrote:
>
> There are 2 locations where memory regions moved in a bulk,
> but this implemented in a region-by region move or even swap.
>
> Use more effective way. Note, last entry, dom->regions[count], always
> exists and is empty, copying it replaces clear_region()
>
> Signed-off-by: Vladimir Kondratiev <vladimir.kondratiev at mobileye.com>

Applied this patch to the riscv/opensbi repo.

Thanks,
Anup

> ---
>  lib/sbi/sbi_domain.c | 20 +++++---------------
>  1 file changed, 5 insertions(+), 15 deletions(-)
>
> diff --git a/lib/sbi/sbi_domain.c b/lib/sbi/sbi_domain.c
> index 99f453f9e5ac..c5cf656e92b7 100644
> --- a/lib/sbi/sbi_domain.c
> +++ b/lib/sbi/sbi_domain.c
> @@ -362,11 +362,6 @@ static void swap_region(struct sbi_domain_memregion* reg1,
>         sbi_memcpy(reg2, &treg, sizeof(treg));
>  }
>
> -static void clear_region(struct sbi_domain_memregion* reg)
> -{
> -       sbi_memset(reg, 0x0, sizeof(*reg));
> -}
> -
>  static int sbi_domain_used_memregions(const struct sbi_domain *dom)
>  {
>         int count = 0;
> @@ -454,10 +449,7 @@ static int sanitize_domain(struct sbi_domain *dom)
>
>                 /* find a region is superset of reg, remove reg */
>                 if (is_covered) {
> -                       for (j = i; j < (count - 1); j++)
> -                               swap_region(&dom->regions[j],
> -                                           &dom->regions[j + 1]);
> -                       clear_region(&dom->regions[count - 1]);
> +                       sbi_memmove(reg, reg + 1, sizeof(*reg) * (count - i));
>                         count--;
>                 } else
>                         i++;
> @@ -699,7 +691,7 @@ static int root_add_memregion(const struct sbi_domain_memregion *reg)
>  {
>         int rc;
>         bool reg_merged;
> -       struct sbi_domain_memregion *nreg, *nreg1, *nreg2;
> +       struct sbi_domain_memregion *nreg, *nreg1;
>         int root_memregs_count = sbi_domain_used_memregions(&root);
>
>         /* Sanity checks */
> @@ -741,12 +733,10 @@ static int root_add_memregion(const struct sbi_domain_memregion *reg)
>                             (nreg->base + BIT(nreg->order)) == nreg1->base &&
>                             nreg->order == nreg1->order &&
>                             nreg->flags == nreg1->flags) {
> +                               int i1 = nreg1 - root.regions;
>                                 nreg->order++;
> -                               while (nreg1->order) {
> -                                       nreg2 = nreg1 + 1;
> -                                       sbi_memcpy(nreg1, nreg2, sizeof(*nreg1));
> -                                       nreg1++;
> -                               }
> +                               sbi_memmove(nreg1, nreg1 + 1,
> +                                           sizeof(*nreg1) * (root_memregs_count - i1));
>                                 reg_merged = true;
>                                 root_memregs_count--;
>                         }
>
> base-commit: de376252f4f3e3df4998bd14893cb687821b4102
> --
> 2.43.0
>



More information about the opensbi mailing list