mirror of
https://github.com/riscv-software-src/opensbi.git
synced 2026-01-03 02:51:19 +00:00
lib/sbi: optimize domain memory regions copying
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> Reviewed-by: Samuel Holland <samuel.holland@sifive.com> Link: https://lore.kernel.org/r/20251208125617.2557594-1-vladimir.kondratiev@mobileye.com Signed-off-by: Anup Patel <anup@brainfault.org>
This commit is contained in:
committed by
Anup Patel
parent
fbb5fe811d
commit
19f0c83512
@@ -371,11 +371,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;
|
||||
@@ -463,10 +458,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++;
|
||||
@@ -708,7 +700,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 */
|
||||
@@ -750,12 +742,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--;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user