| Message ID | 20251208125617.2557594-1-vladimir.kondratiev@mobileye.com |
|---|---|
| State | Accepted |
| Headers | show |
| Series | [v2] lib/sbi: optimize domain memory regions copying | expand |
On 2025-12-08 9:56 PM, Vladimir Kondratiev 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@mobileye.com> > --- > lib/sbi/sbi_domain.c | 20 +++++--------------- > 1 file changed, 5 insertions(+), 15 deletions(-) Reviewed-by: Samuel Holland <samuel.holland@sifive.com>
On Mon, Dec 8, 2025 at 6:26 PM Vladimir Kondratiev <vladimir.kondratiev@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@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 >
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--; }
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@mobileye.com> --- lib/sbi/sbi_domain.c | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) base-commit: de376252f4f3e3df4998bd14893cb687821b4102