[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