2020-12-20 08:31:19

by Baoquan He

[permalink] [raw]
Subject: [PATCH v2 0/5] Fix the incorrect memmep defer init handling and do some cleanup

VMware reported the performance regression during memmap_init() invocation.
And they bisected to commit 73a6e474cb376 ("mm: memmap_init: iterate over
memblock regions rather that check each PFN") causing it.

https://lore.kernel.org/linux-mm/DM6PR05MB52921FF90FA01CC337DD23A1A4080@DM6PR05MB5292.namprd05.prod.outlook.com/

After investigation, it's caused by incorrect memmap init defer handling
in memmap_init_zone() after commit 73a6e474cb376. The current
memmap_init_zone() only handle one memory region of one zone, while
memmap_init() iterates over all its memory regions and pass them one by
one into memmap_init_zone() to handle.

So in this patchset, patch 1/5 fixes the bug observed by VMware. Patch
2~5/5 clean up codes.
accordingly.

VMware helped do the testing for the patch 1 of v1 version which was based
on master branch of Linus's tree on their VMware ESI platform, while the
patch 1 is not changed in functionality in v2. And I haven't got a
ia64 machine to compile or test, will really appreciate if anyone can help
compile this patchset on one. This patchset is based on the latest next/master,
only did the basic test.

Baoquan He (5):
mm: memmap defer init dosn't work as expected
mm: rename memmap_init() and memmap_init_zone()
mm: simplify parater of function memmap_init_zone()
mm: simplify parameter of setup_usemap()
mm: remove unneeded local variable in free_area_init_core

arch/ia64/include/asm/pgtable.h | 3 +-
arch/ia64/mm/init.c | 16 +++++----
include/linux/mm.h | 5 +--
mm/memory_hotplug.c | 2 +-
mm/page_alloc.c | 60 ++++++++++++++++-----------------
5 files changed, 43 insertions(+), 43 deletions(-)

--
2.17.2


2020-12-20 08:32:37

by Baoquan He

[permalink] [raw]
Subject: [PATCH v2 3/5] mm: simplify parater of function memmap_init_zone()

As David suggested, simply passing 'struct zone *zone' is enough. We can
get all needed information from 'struct zone*' easily.

Suggested-by: David Hildenbrand <[email protected]>
Signed-off-by: Baoquan He <[email protected]>
---
arch/ia64/include/asm/pgtable.h | 3 +--
arch/ia64/mm/init.c | 12 +++++++-----
mm/page_alloc.c | 20 ++++++++++----------
3 files changed, 18 insertions(+), 17 deletions(-)

diff --git a/arch/ia64/include/asm/pgtable.h b/arch/ia64/include/asm/pgtable.h
index dce2ff37df65..2c81394a2430 100644
--- a/arch/ia64/include/asm/pgtable.h
+++ b/arch/ia64/include/asm/pgtable.h
@@ -520,8 +520,7 @@ extern struct page *zero_page_memmap_ptr;

# ifdef CONFIG_VIRTUAL_MEM_MAP
/* arch mem_map init routine is needed due to holes in a virtual mem_map */
- extern void memmap_init_zone(unsigned long size, int nid, unsigned long zone,
- unsigned long start_pfn);
+ extern void memmap_init_zone(struct zone *zone);
# endif /* CONFIG_VIRTUAL_MEM_MAP */
# endif /* !__ASSEMBLY__ */

diff --git a/arch/ia64/mm/init.c b/arch/ia64/mm/init.c
index c8e68e92beb3..ccbda1a74c95 100644
--- a/arch/ia64/mm/init.c
+++ b/arch/ia64/mm/init.c
@@ -541,12 +541,14 @@ virtual_memmap_init(u64 start, u64 end, void *arg)
return 0;
}

-void __meminit
-memmap_init_zone(unsigned long size, int nid, unsigned long zone,
- unsigned long start_pfn)
+void __meminit memmap_init_zone(struct zone *zone)
{
+ unsigned long size = zone->spanned_pages;
+ int nid = zone_to_nid(zone), zone_id = zone_idx(zone);
+ unsigned long start_pfn = zone->zone_start_pfn;
+
if (!vmem_map) {
- memmap_init_range(size, nid, zone, start_pfn, start_pfn + size,
+ memmap_init_range(size, nid, zone_id, start_pfn, start_pfn + size,
MEMINIT_EARLY, NULL, MIGRATE_MOVABLE);
} else {
struct page *start;
@@ -556,7 +558,7 @@ memmap_init_zone(unsigned long size, int nid, unsigned long zone,
args.start = start;
args.end = start + size;
args.nid = nid;
- args.zone = zone;
+ args.zone = zone_id;

efi_memmap_walk(virtual_memmap_init, &args);
}
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 4b46326099d9..7a6626351ed7 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -6292,16 +6292,16 @@ static inline u64 init_unavailable_range(unsigned long spfn, unsigned long epfn,
}
#endif

-void __init __weak memmap_init_zone(unsigned long size, int nid,
- unsigned long zone,
- unsigned long zone_start_pfn)
+void __init __weak memmap_init_zone(struct zone *zone)
{
unsigned long start_pfn, end_pfn, hole_start_pfn = 0;
- unsigned long zone_end_pfn = zone_start_pfn + size;
+ int i, nid = zone_to_nid(zone), zone_id = zone_idx(zone);
+ unsigned long zone_start_pfn = zone->zone_start_pfn;
+ unsigned long zone_end_pfn = zone_start_pfn + zone->spanned_pages;
u64 pgcnt = 0;
- int i;

for_each_mem_pfn_range(i, nid, &start_pfn, &end_pfn, NULL) {
+ unsigned long size;
start_pfn = clamp(start_pfn, zone_start_pfn, zone_end_pfn);
end_pfn = clamp(end_pfn, zone_start_pfn, zone_end_pfn);
hole_start_pfn = clamp(hole_start_pfn, zone_start_pfn,
@@ -6309,13 +6309,13 @@ void __init __weak memmap_init_zone(unsigned long size, int nid,

if (end_pfn > start_pfn) {
size = end_pfn - start_pfn;
- memmap_init_range(size, nid, zone, start_pfn, zone_end_pfn,
+ memmap_init_range(size, nid, zone_id, start_pfn, zone_end_pfn,
MEMINIT_EARLY, NULL, MIGRATE_MOVABLE);
}

if (hole_start_pfn < start_pfn)
pgcnt += init_unavailable_range(hole_start_pfn,
- start_pfn, zone, nid);
+ start_pfn, zone_id, nid);
hole_start_pfn = end_pfn;
}

@@ -6328,11 +6328,11 @@ void __init __weak memmap_init_zone(unsigned long size, int nid,
*/
if (hole_start_pfn < zone_end_pfn)
pgcnt += init_unavailable_range(hole_start_pfn, zone_end_pfn,
- zone, nid);
+ zone_id, nid);

if (pgcnt)
pr_info("%s: Zeroed struct page in unavailable ranges: %lld\n",
- zone_names[zone], pgcnt);
+ zone_names[zone_id], pgcnt);
}

static int zone_batchsize(struct zone *zone)
@@ -7039,7 +7039,7 @@ static void __init free_area_init_core(struct pglist_data *pgdat)
set_pageblock_order();
setup_usemap(pgdat, zone, zone_start_pfn, size);
init_currently_empty_zone(zone, zone_start_pfn, size);
- memmap_init_zone(size, nid, j, zone_start_pfn);
+ memmap_init_zone(zone);
}
}

--
2.17.2

2020-12-20 08:33:09

by Baoquan He

[permalink] [raw]
Subject: [PATCH v2 4/5] mm: simplify parameter of setup_usemap()

Parameter 'zone' has got needed information, let's remove other
unnecessary parameters.

Signed-off-by: Baoquan He <[email protected]>
---
mm/page_alloc.c | 17 +++++++----------
1 file changed, 7 insertions(+), 10 deletions(-)

diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 7a6626351ed7..7f0a917ab858 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -6824,25 +6824,22 @@ static unsigned long __init usemap_size(unsigned long zone_start_pfn, unsigned l
return usemapsize / 8;
}

-static void __ref setup_usemap(struct pglist_data *pgdat,
- struct zone *zone,
- unsigned long zone_start_pfn,
- unsigned long zonesize)
+static void __ref setup_usemap(struct zone *zone)
{
- unsigned long usemapsize = usemap_size(zone_start_pfn, zonesize);
+ unsigned long usemapsize = usemap_size(zone->zone_start_pfn,
+ zone->spanned_pages);
zone->pageblock_flags = NULL;
if (usemapsize) {
zone->pageblock_flags =
memblock_alloc_node(usemapsize, SMP_CACHE_BYTES,
- pgdat->node_id);
+ zone_to_nid(zone));
if (!zone->pageblock_flags)
panic("Failed to allocate %ld bytes for zone %s pageblock flags on node %d\n",
- usemapsize, zone->name, pgdat->node_id);
+ usemapsize, zone->name, zone_to_nid(zone));
}
}
#else
-static inline void setup_usemap(struct pglist_data *pgdat, struct zone *zone,
- unsigned long zone_start_pfn, unsigned long zonesize) {}
+static inline void setup_usemap(struct zone *zone) {}
#endif /* CONFIG_SPARSEMEM */

#ifdef CONFIG_HUGETLB_PAGE_SIZE_VARIABLE
@@ -7037,7 +7034,7 @@ static void __init free_area_init_core(struct pglist_data *pgdat)
continue;

set_pageblock_order();
- setup_usemap(pgdat, zone, zone_start_pfn, size);
+ setup_usemap(zone);
init_currently_empty_zone(zone, zone_start_pfn, size);
memmap_init_zone(zone);
}
--
2.17.2

2020-12-20 08:33:24

by Baoquan He

[permalink] [raw]
Subject: [PATCH v2 5/5] mm: remove unneeded local variable in free_area_init_core

Local variable 'zone_start_pfn' is not needed since there's only
one call site in free_area_init_core(). Let's remove it and pass
zone->zone_start_pfn directly to init_currently_empty_zone().

Signed-off-by: Baoquan He <[email protected]>
---
mm/page_alloc.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 7f0a917ab858..189a86253c93 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -6986,7 +6986,6 @@ static void __init free_area_init_core(struct pglist_data *pgdat)
for (j = 0; j < MAX_NR_ZONES; j++) {
struct zone *zone = pgdat->node_zones + j;
unsigned long size, freesize, memmap_pages;
- unsigned long zone_start_pfn = zone->zone_start_pfn;

size = zone->spanned_pages;
freesize = zone->present_pages;
@@ -7035,7 +7034,7 @@ static void __init free_area_init_core(struct pglist_data *pgdat)

set_pageblock_order();
setup_usemap(zone);
- init_currently_empty_zone(zone, zone_start_pfn, size);
+ init_currently_empty_zone(zone, zone->zone_start_pfn, size);
memmap_init_zone(zone);
}
}
--
2.17.2

2020-12-21 06:37:13

by Mike Rapoport

[permalink] [raw]
Subject: Re: [PATCH v2 3/5] mm: simplify parater of function memmap_init_zone()

On Sun, Dec 20, 2020 at 04:27:52PM +0800, Baoquan He wrote:
> As David suggested, simply passing 'struct zone *zone' is enough. We can
> get all needed information from 'struct zone*' easily.
>
> Suggested-by: David Hildenbrand <[email protected]>
> Signed-off-by: Baoquan He <[email protected]>

Reviewed-by: Mike Rapoport <[email protected]>

> ---
> arch/ia64/include/asm/pgtable.h | 3 +--
> arch/ia64/mm/init.c | 12 +++++++-----
> mm/page_alloc.c | 20 ++++++++++----------
> 3 files changed, 18 insertions(+), 17 deletions(-)
>
> diff --git a/arch/ia64/include/asm/pgtable.h b/arch/ia64/include/asm/pgtable.h
> index dce2ff37df65..2c81394a2430 100644
> --- a/arch/ia64/include/asm/pgtable.h
> +++ b/arch/ia64/include/asm/pgtable.h
> @@ -520,8 +520,7 @@ extern struct page *zero_page_memmap_ptr;
>
> # ifdef CONFIG_VIRTUAL_MEM_MAP
> /* arch mem_map init routine is needed due to holes in a virtual mem_map */
> - extern void memmap_init_zone(unsigned long size, int nid, unsigned long zone,
> - unsigned long start_pfn);
> + extern void memmap_init_zone(struct zone *zone);
> # endif /* CONFIG_VIRTUAL_MEM_MAP */
> # endif /* !__ASSEMBLY__ */
>
> diff --git a/arch/ia64/mm/init.c b/arch/ia64/mm/init.c
> index c8e68e92beb3..ccbda1a74c95 100644
> --- a/arch/ia64/mm/init.c
> +++ b/arch/ia64/mm/init.c
> @@ -541,12 +541,14 @@ virtual_memmap_init(u64 start, u64 end, void *arg)
> return 0;
> }
>
> -void __meminit
> -memmap_init_zone(unsigned long size, int nid, unsigned long zone,
> - unsigned long start_pfn)
> +void __meminit memmap_init_zone(struct zone *zone)
> {
> + unsigned long size = zone->spanned_pages;
> + int nid = zone_to_nid(zone), zone_id = zone_idx(zone);
> + unsigned long start_pfn = zone->zone_start_pfn;
> +
> if (!vmem_map) {
> - memmap_init_range(size, nid, zone, start_pfn, start_pfn + size,
> + memmap_init_range(size, nid, zone_id, start_pfn, start_pfn + size,
> MEMINIT_EARLY, NULL, MIGRATE_MOVABLE);
> } else {
> struct page *start;
> @@ -556,7 +558,7 @@ memmap_init_zone(unsigned long size, int nid, unsigned long zone,
> args.start = start;
> args.end = start + size;
> args.nid = nid;
> - args.zone = zone;
> + args.zone = zone_id;
>
> efi_memmap_walk(virtual_memmap_init, &args);
> }
> diff --git a/mm/page_alloc.c b/mm/page_alloc.c
> index 4b46326099d9..7a6626351ed7 100644
> --- a/mm/page_alloc.c
> +++ b/mm/page_alloc.c
> @@ -6292,16 +6292,16 @@ static inline u64 init_unavailable_range(unsigned long spfn, unsigned long epfn,
> }
> #endif
>
> -void __init __weak memmap_init_zone(unsigned long size, int nid,
> - unsigned long zone,
> - unsigned long zone_start_pfn)
> +void __init __weak memmap_init_zone(struct zone *zone)
> {
> unsigned long start_pfn, end_pfn, hole_start_pfn = 0;
> - unsigned long zone_end_pfn = zone_start_pfn + size;
> + int i, nid = zone_to_nid(zone), zone_id = zone_idx(zone);
> + unsigned long zone_start_pfn = zone->zone_start_pfn;
> + unsigned long zone_end_pfn = zone_start_pfn + zone->spanned_pages;
> u64 pgcnt = 0;
> - int i;
>
> for_each_mem_pfn_range(i, nid, &start_pfn, &end_pfn, NULL) {
> + unsigned long size;
> start_pfn = clamp(start_pfn, zone_start_pfn, zone_end_pfn);
> end_pfn = clamp(end_pfn, zone_start_pfn, zone_end_pfn);
> hole_start_pfn = clamp(hole_start_pfn, zone_start_pfn,
> @@ -6309,13 +6309,13 @@ void __init __weak memmap_init_zone(unsigned long size, int nid,
>
> if (end_pfn > start_pfn) {
> size = end_pfn - start_pfn;
> - memmap_init_range(size, nid, zone, start_pfn, zone_end_pfn,
> + memmap_init_range(size, nid, zone_id, start_pfn, zone_end_pfn,
> MEMINIT_EARLY, NULL, MIGRATE_MOVABLE);
> }
>
> if (hole_start_pfn < start_pfn)
> pgcnt += init_unavailable_range(hole_start_pfn,
> - start_pfn, zone, nid);
> + start_pfn, zone_id, nid);
> hole_start_pfn = end_pfn;
> }
>
> @@ -6328,11 +6328,11 @@ void __init __weak memmap_init_zone(unsigned long size, int nid,
> */
> if (hole_start_pfn < zone_end_pfn)
> pgcnt += init_unavailable_range(hole_start_pfn, zone_end_pfn,
> - zone, nid);
> + zone_id, nid);
>
> if (pgcnt)
> pr_info("%s: Zeroed struct page in unavailable ranges: %lld\n",
> - zone_names[zone], pgcnt);
> + zone_names[zone_id], pgcnt);
> }
>
> static int zone_batchsize(struct zone *zone)
> @@ -7039,7 +7039,7 @@ static void __init free_area_init_core(struct pglist_data *pgdat)
> set_pageblock_order();
> setup_usemap(pgdat, zone, zone_start_pfn, size);
> init_currently_empty_zone(zone, zone_start_pfn, size);
> - memmap_init_zone(size, nid, j, zone_start_pfn);
> + memmap_init_zone(zone);
> }
> }
>
> --
> 2.17.2
>

--
Sincerely yours,
Mike.

2020-12-21 06:37:32

by Mike Rapoport

[permalink] [raw]
Subject: Re: [PATCH v2 4/5] mm: simplify parameter of setup_usemap()

On Sun, Dec 20, 2020 at 04:27:53PM +0800, Baoquan He wrote:
> Parameter 'zone' has got needed information, let's remove other
> unnecessary parameters.
>
> Signed-off-by: Baoquan He <[email protected]>

Reviewed-by: Mike Rapoport <[email protected]>

> ---
> mm/page_alloc.c | 17 +++++++----------
> 1 file changed, 7 insertions(+), 10 deletions(-)
>
> diff --git a/mm/page_alloc.c b/mm/page_alloc.c
> index 7a6626351ed7..7f0a917ab858 100644
> --- a/mm/page_alloc.c
> +++ b/mm/page_alloc.c
> @@ -6824,25 +6824,22 @@ static unsigned long __init usemap_size(unsigned long zone_start_pfn, unsigned l
> return usemapsize / 8;
> }
>
> -static void __ref setup_usemap(struct pglist_data *pgdat,
> - struct zone *zone,
> - unsigned long zone_start_pfn,
> - unsigned long zonesize)
> +static void __ref setup_usemap(struct zone *zone)
> {
> - unsigned long usemapsize = usemap_size(zone_start_pfn, zonesize);
> + unsigned long usemapsize = usemap_size(zone->zone_start_pfn,
> + zone->spanned_pages);
> zone->pageblock_flags = NULL;
> if (usemapsize) {
> zone->pageblock_flags =
> memblock_alloc_node(usemapsize, SMP_CACHE_BYTES,
> - pgdat->node_id);
> + zone_to_nid(zone));
> if (!zone->pageblock_flags)
> panic("Failed to allocate %ld bytes for zone %s pageblock flags on node %d\n",
> - usemapsize, zone->name, pgdat->node_id);
> + usemapsize, zone->name, zone_to_nid(zone));
> }
> }
> #else
> -static inline void setup_usemap(struct pglist_data *pgdat, struct zone *zone,
> - unsigned long zone_start_pfn, unsigned long zonesize) {}
> +static inline void setup_usemap(struct zone *zone) {}
> #endif /* CONFIG_SPARSEMEM */
>
> #ifdef CONFIG_HUGETLB_PAGE_SIZE_VARIABLE
> @@ -7037,7 +7034,7 @@ static void __init free_area_init_core(struct pglist_data *pgdat)
> continue;
>
> set_pageblock_order();
> - setup_usemap(pgdat, zone, zone_start_pfn, size);
> + setup_usemap(zone);
> init_currently_empty_zone(zone, zone_start_pfn, size);
> memmap_init_zone(zone);
> }
> --
> 2.17.2
>

--
Sincerely yours,
Mike.

2020-12-21 06:38:00

by Mike Rapoport

[permalink] [raw]
Subject: Re: [PATCH v2 5/5] mm: remove unneeded local variable in free_area_init_core

On Sun, Dec 20, 2020 at 04:27:54PM +0800, Baoquan He wrote:
> Local variable 'zone_start_pfn' is not needed since there's only
> one call site in free_area_init_core(). Let's remove it and pass
> zone->zone_start_pfn directly to init_currently_empty_zone().
>
> Signed-off-by: Baoquan He <[email protected]>

Reviewed-by: Mike Rapoport <[email protected]>

> ---
> mm/page_alloc.c | 3 +--
> 1 file changed, 1 insertion(+), 2 deletions(-)
>
> diff --git a/mm/page_alloc.c b/mm/page_alloc.c
> index 7f0a917ab858..189a86253c93 100644
> --- a/mm/page_alloc.c
> +++ b/mm/page_alloc.c
> @@ -6986,7 +6986,6 @@ static void __init free_area_init_core(struct pglist_data *pgdat)
> for (j = 0; j < MAX_NR_ZONES; j++) {
> struct zone *zone = pgdat->node_zones + j;
> unsigned long size, freesize, memmap_pages;
> - unsigned long zone_start_pfn = zone->zone_start_pfn;
>
> size = zone->spanned_pages;
> freesize = zone->present_pages;
> @@ -7035,7 +7034,7 @@ static void __init free_area_init_core(struct pglist_data *pgdat)
>
> set_pageblock_order();
> setup_usemap(zone);
> - init_currently_empty_zone(zone, zone_start_pfn, size);
> + init_currently_empty_zone(zone, zone->zone_start_pfn, size);
> memmap_init_zone(zone);
> }
> }
> --
> 2.17.2
>

--
Sincerely yours,
Mike.

2020-12-23 01:49:27

by Andrew Morton

[permalink] [raw]
Subject: Re: [PATCH v2 0/5] Fix the incorrect memmep defer init handling and do some cleanup

On Sun, 20 Dec 2020 16:27:49 +0800 Baoquan He <[email protected]> wrote:

> VMware reported the performance regression during memmap_init() invocation.
> And they bisected to commit 73a6e474cb376 ("mm: memmap_init: iterate over
> memblock regions rather that check each PFN") causing it.
>
> https://lore.kernel.org/linux-mm/DM6PR05MB52921FF90FA01CC337DD23A1A4080@DM6PR05MB5292.namprd05.prod.outlook.com/
>
> After investigation, it's caused by incorrect memmap init defer handling
> in memmap_init_zone() after commit 73a6e474cb376. The current
> memmap_init_zone() only handle one memory region of one zone, while
> memmap_init() iterates over all its memory regions and pass them one by
> one into memmap_init_zone() to handle.
>
> So in this patchset, patch 1/5 fixes the bug observed by VMware. Patch
> 2~5/5 clean up codes.
> accordingly.

This series doesn't apply well to current mainline (plus, perhaps,
material which I sent to Linus today).

So please check all that against mainline in a day or so, refresh,
retest and resend.

Please separate the fix for the performance regression (1/5) into a
single standalone patch, ready for -stable backporting. And then a
separate 4-patch series with the cleanups for a 5.11 merge.

Thanks.

2020-12-23 02:08:51

by Baoquan He

[permalink] [raw]
Subject: Re: [PATCH v2 0/5] Fix the incorrect memmep defer init handling and do some cleanup

On 12/22/20 at 05:46pm, Andrew Morton wrote:
> On Sun, 20 Dec 2020 16:27:49 +0800 Baoquan He <[email protected]> wrote:
>
> > VMware reported the performance regression during memmap_init() invocation.
> > And they bisected to commit 73a6e474cb376 ("mm: memmap_init: iterate over
> > memblock regions rather that check each PFN") causing it.
> >
> > https://lore.kernel.org/linux-mm/DM6PR05MB52921FF90FA01CC337DD23A1A4080@DM6PR05MB5292.namprd05.prod.outlook.com/
> >
> > After investigation, it's caused by incorrect memmap init defer handling
> > in memmap_init_zone() after commit 73a6e474cb376. The current
> > memmap_init_zone() only handle one memory region of one zone, while
> > memmap_init() iterates over all its memory regions and pass them one by
> > one into memmap_init_zone() to handle.
> >
> > So in this patchset, patch 1/5 fixes the bug observed by VMware. Patch
> > 2~5/5 clean up codes.
> > accordingly.
>
> This series doesn't apply well to current mainline (plus, perhaps,
> material which I sent to Linus today).
>
> So please check all that against mainline in a day or so, refresh,
> retest and resend.
>
> Please separate the fix for the performance regression (1/5) into a
> single standalone patch, ready for -stable backporting. And then a
> separate 4-patch series with the cleanups for a 5.11 merge.

Sure, doing now.

By the way, when sending patches to linux-mm ML, which branch should I
rebase them on? I usually take your akpm/master as base, thought this
will make your patch picking easier. Seems my understanding is not true,
akpm/master is changed very soon, we should always base patch on linus's
master branch, whether patch is sending to linux-mm or not, right?

Thanks
Baoquan

2020-12-23 08:14:48

by Baoquan He

[permalink] [raw]
Subject: Re: [PATCH v2 0/5] Fix the incorrect memmep defer init handling and do some cleanup

On 12/23/20 at 10:05am, Baoquan He wrote:
> On 12/22/20 at 05:46pm, Andrew Morton wrote:
> > On Sun, 20 Dec 2020 16:27:49 +0800 Baoquan He <[email protected]> wrote:
> >
> > > VMware reported the performance regression during memmap_init() invocation.
> > > And they bisected to commit 73a6e474cb376 ("mm: memmap_init: iterate over
> > > memblock regions rather that check each PFN") causing it.
> > >
> > > https://lore.kernel.org/linux-mm/DM6PR05MB52921FF90FA01CC337DD23A1A4080@DM6PR05MB5292.namprd05.prod.outlook.com/
> > >
> > > After investigation, it's caused by incorrect memmap init defer handling
> > > in memmap_init_zone() after commit 73a6e474cb376. The current
> > > memmap_init_zone() only handle one memory region of one zone, while
> > > memmap_init() iterates over all its memory regions and pass them one by
> > > one into memmap_init_zone() to handle.
> > >
> > > So in this patchset, patch 1/5 fixes the bug observed by VMware. Patch
> > > 2~5/5 clean up codes.
> > > accordingly.
> >
> > This series doesn't apply well to current mainline (plus, perhaps,
> > material which I sent to Linus today).
> >
> > So please check all that against mainline in a day or so, refresh,
> > retest and resend.
> >
> > Please separate the fix for the performance regression (1/5) into a
> > single standalone patch, ready for -stable backporting. And then a
> > separate 4-patch series with the cleanups for a 5.11 merge.

Have sent the 1/5 as a standalone patch. Will send the rest 4 patches as
a patchset once the patch 1/5 is merged into linux-next. Thanks, Andrew.

>
> Sure, doing now.
>
> By the way, when sending patches to linux-mm ML, which branch should I
> rebase them on? I usually take your akpm/master as base, thought this
> will make your patch picking easier. Seems my understanding is not true,
> akpm/master is changed very soon, we should always base patch on linus's
> master branch, whether patch is sending to linux-mm or not, right?