[PATCH] lib/sbi: optimize domain memory regions copying
Vladimir Kondratiev
vladimir.kondratiev at mobileye.com
Mon Dec 8 01:45:04 PST 2025
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>
---
lib/sbi/sbi_domain.c | 19 ++++---------------
1 file changed, 4 insertions(+), 15 deletions(-)
diff --git a/lib/sbi/sbi_domain.c b/lib/sbi/sbi_domain.c
index 99f453f9e5ac..f6753b06ebdc 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,9 @@ 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 - dom->regions;
nreg->order++;
- while (nreg1->order) {
- nreg2 = nreg1 + 1;
- sbi_memcpy(nreg1, nreg2, sizeof(*nreg1));
- nreg1++;
- }
+ sbi_memmove(nreg1, nreg1 + 1, sizeof(*nreg1) * (count - i1));
reg_merged = true;
root_memregs_count--;
}
base-commit: de376252f4f3e3df4998bd14893cb687821b4102
--
2.43.0
More information about the opensbi
mailing list