On Thu, Apr 25, 2024 at 07:19:25AM +0000, Wei Yang wrote: > In memblock_remove_range, we would remove consecutive regions after > isolation. > > Instead of removing each region from end to start one by one, we could > remove those consecutive regions at once. I don't think this is worth the churn. > Signed-off-by: Wei Yang <richard.weiyang@xxxxxxxxx> > --- > mm/memblock.c | 24 ++++++++++++++++-------- > 1 file changed, 16 insertions(+), 8 deletions(-) > > diff --git a/mm/memblock.c b/mm/memblock.c > index 5a363ef283d0..53e3aa2cd9a2 100644 > --- a/mm/memblock.c > +++ b/mm/memblock.c > @@ -343,12 +343,15 @@ static phys_addr_t __init_memblock memblock_find_in_range(phys_addr_t start, > return ret; > } > > -static void __init_memblock memblock_remove_region(struct memblock_type *type, unsigned long r) > +static void __init_memblock memblock_remove_regions(struct memblock_type *type, > + unsigned long r, > + unsigned int num) > { > - type->total_size -= type->regions[r].size; > - memmove(&type->regions[r], &type->regions[r + 1], > - (type->cnt - (r + 1)) * sizeof(type->regions[r])); > - type->cnt--; > + for (int i = 0; i < num; i++) > + type->total_size -= type->regions[r + i].size; > + memmove(&type->regions[r], &type->regions[r + num], > + (type->cnt - (r + num)) * sizeof(type->regions[r])); > + type->cnt -= num; > > /* Special case for empty arrays */ > if (type->cnt == 0) { > @@ -360,6 +363,11 @@ static void __init_memblock memblock_remove_region(struct memblock_type *type, u > } > } > > +static void __init_memblock memblock_remove_region(struct memblock_type *type, unsigned long r) > +{ > + memblock_remove_regions(type, r, 1); > +} > + > #ifndef CONFIG_ARCH_KEEP_MEMBLOCK > /** > * memblock_discard - discard memory and reserved arrays if they were allocated > @@ -846,14 +854,14 @@ static int __init_memblock memblock_remove_range(struct memblock_type *type, > phys_addr_t base, phys_addr_t size) > { > int start_rgn, end_rgn; > - int i, ret; > + int ret; > > ret = memblock_isolate_range(type, base, size, &start_rgn, &end_rgn); > if (ret) > return ret; > > - for (i = end_rgn - 1; i >= start_rgn; i--) > - memblock_remove_region(type, i); > + if (end_rgn - start_rgn) > + memblock_remove_regions(type, start_rgn, end_rgn - start_rgn); > return 0; > } > > -- > 2.34.1 > -- Sincerely yours, Mike.