Message ID | 20240425071929.18004-5-richard.weiyang@gmail.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | memblock: clenup | expand |
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@gmail.com> > --- > 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 >
On Sun, Apr 28, 2024 at 09:44:30AM +0300, Mike Rapoport wrote: >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. > Will drop it.
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; }
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. Signed-off-by: Wei Yang <richard.weiyang@gmail.com> --- mm/memblock.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-)