All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/7] mm: minor clean up and improvement
@ 2024-03-25 15:04 Baoquan He
  2024-03-25 15:04 ` [PATCH 1/7] mm/mm_init.c: remove the useless dma_reserve Baoquan He
                   ` (7 more replies)
  0 siblings, 8 replies; 12+ messages in thread
From: Baoquan He @ 2024-03-25 15:04 UTC (permalink / raw)
  To: linux-mm; +Cc: akpm, rppt, mgorman, Baoquan He

These mostly are for mm init when going through code flow.

Baoquan He (7):
  mm/mm_init.c: remove the useless dma_reserve
  mm/mm_init.c: add new function calc_nr_all_pages()
  mm/mm_init.c: remove meaningless calculation of zone->managed_pages in
    free_area_init_core()
  mm/mm_init.c: remove unneeded calc_memmap_size()
  mm/mm_init.c: remove arch_reserved_kernel_pages()
  mm: move array mem_section init code out of memory_present()
  mm/init: remove the unnecessary special treatment for memory-less node

 arch/powerpc/include/asm/mmu.h |   4 -
 arch/powerpc/kernel/fadump.c   |   5 --
 include/linux/mm.h             |   4 -
 mm/mm_init.c                   | 143 ++++++++-------------------------
 mm/sparse.c                    |  26 +++---
 5 files changed, 45 insertions(+), 137 deletions(-)

-- 
2.41.0



^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH 1/7] mm/mm_init.c: remove the useless dma_reserve
  2024-03-25 15:04 [PATCH 0/7] mm: minor clean up and improvement Baoquan He
@ 2024-03-25 15:04 ` Baoquan He
  2024-03-26  8:27   ` kernel test robot
  2024-03-26  9:01   ` kernel test robot
  2024-03-25 15:04 ` [PATCH 2/7] mm/mm_init.c: add new function calc_nr_all_pages() Baoquan He
                   ` (6 subsequent siblings)
  7 siblings, 2 replies; 12+ messages in thread
From: Baoquan He @ 2024-03-25 15:04 UTC (permalink / raw)
  To: linux-mm; +Cc: akpm, rppt, mgorman, Baoquan He

Now nobody calls set_dma_reserve() to set value for dma_reserve, remove
global dma_reserve and the codes using it.

Signed-off-by: Baoquan He <bhe@redhat.com>
---
 include/linux/mm.h |  1 -
 mm/mm_init.c       | 23 -----------------------
 2 files changed, 24 deletions(-)

diff --git a/include/linux/mm.h b/include/linux/mm.h
index 0436b919f1c7..ad19350e1538 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -3210,7 +3210,6 @@ static inline int early_pfn_to_nid(unsigned long pfn)
 extern int __meminit early_pfn_to_nid(unsigned long pfn);
 #endif
 
-extern void set_dma_reserve(unsigned long new_dma_reserve);
 extern void mem_init(void);
 extern void __init mmap_init(void);
 
diff --git a/mm/mm_init.c b/mm/mm_init.c
index 549e76af8f82..153fb2dc666f 100644
--- a/mm/mm_init.c
+++ b/mm/mm_init.c
@@ -226,7 +226,6 @@ static unsigned long required_movablecore_percent __initdata;
 
 static unsigned long nr_kernel_pages __initdata;
 static unsigned long nr_all_pages __initdata;
-static unsigned long dma_reserve __initdata;
 
 static bool deferred_struct_pages __meminitdata;
 
@@ -1583,12 +1582,6 @@ static void __init free_area_init_core(struct pglist_data *pgdat)
 					zone_names[j], memmap_pages, freesize);
 		}
 
-		/* Account for reserved pages */
-		if (j == 0 && freesize > dma_reserve) {
-			freesize -= dma_reserve;
-			pr_debug("  %s zone: %lu pages reserved\n", zone_names[0], dma_reserve);
-		}
-
 		if (!is_highmem_idx(j))
 			nr_kernel_pages += freesize;
 		/* Charge for highmem memmap if there are enough kernel pages */
@@ -2547,22 +2540,6 @@ void *__init alloc_large_system_hash(const char *tablename,
 	return table;
 }
 
-/**
- * set_dma_reserve - set the specified number of pages reserved in the first zone
- * @new_dma_reserve: The number of pages to mark reserved
- *
- * The per-cpu batchsize and zone watermarks are determined by managed_pages.
- * In the DMA zone, a significant percentage may be consumed by kernel image
- * and other unfreeable allocations which can skew the watermarks badly. This
- * function may optionally be used to account for unfreeable pages in the
- * first zone (e.g., ZONE_DMA). The effect will be lower watermarks and
- * smaller per-cpu batchsize.
- */
-void __init set_dma_reserve(unsigned long new_dma_reserve)
-{
-	dma_reserve = new_dma_reserve;
-}
-
 void __init memblock_free_pages(struct page *page, unsigned long pfn,
 							unsigned int order)
 {
-- 
2.41.0



^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 2/7] mm/mm_init.c: add new function calc_nr_all_pages()
  2024-03-25 15:04 [PATCH 0/7] mm: minor clean up and improvement Baoquan He
  2024-03-25 15:04 ` [PATCH 1/7] mm/mm_init.c: remove the useless dma_reserve Baoquan He
@ 2024-03-25 15:04 ` Baoquan He
  2024-03-25 15:04 ` [PATCH 3/7] mm/mm_init.c: remove meaningless calculation of zone->managed_pages in free_area_init_core() Baoquan He
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 12+ messages in thread
From: Baoquan He @ 2024-03-25 15:04 UTC (permalink / raw)
  To: linux-mm; +Cc: akpm, rppt, mgorman, Baoquan He

This is a preparation to calculate nr_kernel_pages and nr_all_pages,
both of which will be used later in alloc_large_system_hash().

nr_all_pages counts up all free but not reserved memory in memblock
allocator, including HIGHMEM memory. While nr_kernel_pages counts up
all free but not reserved low memory in memblock allocator, excluding
HIGHMEM memory.

Signed-off-by: Baoquan He <bhe@redhat.com>
---
 mm/mm_init.c | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/mm/mm_init.c b/mm/mm_init.c
index 153fb2dc666f..c57a7fc97a16 100644
--- a/mm/mm_init.c
+++ b/mm/mm_init.c
@@ -1264,6 +1264,30 @@ static void __init reset_memoryless_node_totalpages(struct pglist_data *pgdat)
 	pr_debug("On node %d totalpages: 0\n", pgdat->node_id);
 }
 
+static void __init calc_nr_kernel_pages(void)
+{
+	unsigned long start_pfn, end_pfn;
+	phys_addr_t start_addr, end_addr;
+	u64 u;
+#ifdef CONFIG_HIGHMEM
+	unsigned long high_zone_low = arch_zone_lowest_possible_pfn[ZONE_HIGHMEM];
+#endif
+
+	for_each_free_mem_range(u, NUMA_NO_NODE, MEMBLOCK_NONE, &start_addr, &end_addr, NULL) {
+		start_pfn = PFN_UP(start_addr);
+		end_pfn   = PFN_DOWN(end_addr);
+
+		if (start_pfn < end_pfn) {
+			nr_all_pages += end_pfn - start_pfn;
+#ifdef CONFIG_HIGHMEM
+			start_pfn = clamp(start_pfn, 0, high_zone_low);
+			end_pfn = clamp(end_pfn, 0, high_zone_low);
+#endif
+			nr_kernel_pages += end_pfn - start_pfn;
+		}
+	}
+}
+
 static void __init calculate_node_totalpages(struct pglist_data *pgdat,
 						unsigned long node_start_pfn,
 						unsigned long node_end_pfn)
-- 
2.41.0



^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 3/7] mm/mm_init.c: remove meaningless calculation of zone->managed_pages in free_area_init_core()
  2024-03-25 15:04 [PATCH 0/7] mm: minor clean up and improvement Baoquan He
  2024-03-25 15:04 ` [PATCH 1/7] mm/mm_init.c: remove the useless dma_reserve Baoquan He
  2024-03-25 15:04 ` [PATCH 2/7] mm/mm_init.c: add new function calc_nr_all_pages() Baoquan He
@ 2024-03-25 15:04 ` Baoquan He
  2024-03-25 15:04 ` [PATCH 4/7] mm/mm_init.c: remove unneeded calc_memmap_size() Baoquan He
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 12+ messages in thread
From: Baoquan He @ 2024-03-25 15:04 UTC (permalink / raw)
  To: linux-mm; +Cc: akpm, rppt, mgorman, Baoquan He

Currently, in free_area_init_core(), when initialize zone's field, a
rough value is set to zone->managed_pages. That value is calculated by
(zone->present_pages - memmap_pages).

In the meantime, add the value to nr_all_pages and nr_kernel_pages which
represent all free pages of system (only low memory or including HIGHMEM
memory separately). Both of them are gonna be used in
alloc_large_system_hash().

However, the rough calculation and setting of zone->managed_pages is
meaningless because
  a) memmap pages are allocated on units of node in sparse_init() or
     alloc_node_mem_map(pgdat); The simple (zone->present_pages -
     memmap_pages) is too rough to make sense for zone;
  b) the set zone->managed_pages will be zeroed out and reset with
     acutal value in mem_init() via memblock_free_all(). Before the
     resetting, no buddy allocation request is issued.

Here, remove the meaningless and complicated calculation of
(zone->present_pages - memmap_pages), initialize zone->managed_pages as 0
which reflect its actual value because no any page is added into buddy
system right now. It will be reset in mem_init().

And also remove the assignment of nr_all_pages and nr_kernel_pages in
free_area_init_core(). Instead, call the newly added calc_nr_kernel_pages()
to count up all free but not reserved memory in memblock and assign to
nr_all_pages and nr_kernel_pages. The counting excludes memmap_pages,
and other kernel used data, which is more accurate than old way and
simpler, and can also cover the ppc required arch_reserved_kernel_pages()
case.

And also clean up the outdated code comment above free_area_init_core().
And free_area_init_core() is easy to understand now, no need to add
words to explain.

Signed-off-by: Baoquan He <bhe@redhat.com>
---
 mm/mm_init.c | 46 +++++-----------------------------------------
 1 file changed, 5 insertions(+), 41 deletions(-)

diff --git a/mm/mm_init.c b/mm/mm_init.c
index c57a7fc97a16..7f71e56e83f3 100644
--- a/mm/mm_init.c
+++ b/mm/mm_init.c
@@ -1565,15 +1565,6 @@ void __ref free_area_init_core_hotplug(struct pglist_data *pgdat)
 }
 #endif
 
-/*
- * Set up the zone data structures:
- *   - mark all pages reserved
- *   - mark all memory queues empty
- *   - clear the memory bitmaps
- *
- * NOTE: pgdat should get zeroed by caller.
- * NOTE: this function is only called during early init.
- */
 static void __init free_area_init_core(struct pglist_data *pgdat)
 {
 	enum zone_type j;
@@ -1584,41 +1575,13 @@ 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;
-
-		size = zone->spanned_pages;
-		freesize = zone->present_pages;
-
-		/*
-		 * Adjust freesize so that it accounts for how much memory
-		 * is used by this zone for memmap. This affects the watermark
-		 * and per-cpu initialisations
-		 */
-		memmap_pages = calc_memmap_size(size, freesize);
-		if (!is_highmem_idx(j)) {
-			if (freesize >= memmap_pages) {
-				freesize -= memmap_pages;
-				if (memmap_pages)
-					pr_debug("  %s zone: %lu pages used for memmap\n",
-						 zone_names[j], memmap_pages);
-			} else
-				pr_warn("  %s zone: %lu memmap pages exceeds freesize %lu\n",
-					zone_names[j], memmap_pages, freesize);
-		}
-
-		if (!is_highmem_idx(j))
-			nr_kernel_pages += freesize;
-		/* Charge for highmem memmap if there are enough kernel pages */
-		else if (nr_kernel_pages > memmap_pages * 2)
-			nr_kernel_pages -= memmap_pages;
-		nr_all_pages += freesize;
+		unsigned long size = zone->spanned_pages;
 
 		/*
-		 * Set an approximate value for lowmem here, it will be adjusted
-		 * when the bootmem allocator frees pages into the buddy system.
-		 * And all highmem pages will be managed by the buddy system.
+		 * Initialize zone->managed_pages as 0 , it will be reset
+		 * when memblock allocator frees pages into buddy system.
 		 */
-		zone_init_internals(zone, j, nid, freesize);
+		zone_init_internals(zone, j, nid, 0);
 
 		if (!size)
 			continue;
@@ -1915,6 +1878,7 @@ void __init free_area_init(unsigned long *max_zone_pfn)
 		check_for_memory(pgdat);
 	}
 
+	calc_nr_kernel_pages();
 	memmap_init();
 
 	/* disable hash distribution for systems with a single node */
-- 
2.41.0



^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 4/7] mm/mm_init.c: remove unneeded calc_memmap_size()
  2024-03-25 15:04 [PATCH 0/7] mm: minor clean up and improvement Baoquan He
                   ` (2 preceding siblings ...)
  2024-03-25 15:04 ` [PATCH 3/7] mm/mm_init.c: remove meaningless calculation of zone->managed_pages in free_area_init_core() Baoquan He
@ 2024-03-25 15:04 ` Baoquan He
  2024-03-25 15:04 ` [PATCH 5/7] mm/mm_init.c: remove arch_reserved_kernel_pages() Baoquan He
                   ` (3 subsequent siblings)
  7 siblings, 0 replies; 12+ messages in thread
From: Baoquan He @ 2024-03-25 15:04 UTC (permalink / raw)
  To: linux-mm; +Cc: akpm, rppt, mgorman, Baoquan He

Nobody calls calc_memmap_size() now.

Signed-off-by: Baoquan He <bhe@redhat.com>
---
 mm/mm_init.c | 20 --------------------
 1 file changed, 20 deletions(-)

diff --git a/mm/mm_init.c b/mm/mm_init.c
index 7f71e56e83f3..e269a724f70e 100644
--- a/mm/mm_init.c
+++ b/mm/mm_init.c
@@ -1331,26 +1331,6 @@ static void __init calculate_node_totalpages(struct pglist_data *pgdat,
 	pr_debug("On node %d totalpages: %lu\n", pgdat->node_id, realtotalpages);
 }
 
-static unsigned long __init calc_memmap_size(unsigned long spanned_pages,
-						unsigned long present_pages)
-{
-	unsigned long pages = spanned_pages;
-
-	/*
-	 * Provide a more accurate estimation if there are holes within
-	 * the zone and SPARSEMEM is in use. If there are holes within the
-	 * zone, each populated memory region may cost us one or two extra
-	 * memmap pages due to alignment because memmap pages for each
-	 * populated regions may not be naturally aligned on page boundary.
-	 * So the (present_pages >> 4) heuristic is a tradeoff for that.
-	 */
-	if (spanned_pages > present_pages + (present_pages >> 4) &&
-	    IS_ENABLED(CONFIG_SPARSEMEM))
-		pages = present_pages;
-
-	return PAGE_ALIGN(pages * sizeof(struct page)) >> PAGE_SHIFT;
-}
-
 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
 static void pgdat_init_split_queue(struct pglist_data *pgdat)
 {
-- 
2.41.0



^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 5/7] mm/mm_init.c: remove arch_reserved_kernel_pages()
  2024-03-25 15:04 [PATCH 0/7] mm: minor clean up and improvement Baoquan He
                   ` (3 preceding siblings ...)
  2024-03-25 15:04 ` [PATCH 4/7] mm/mm_init.c: remove unneeded calc_memmap_size() Baoquan He
@ 2024-03-25 15:04 ` Baoquan He
  2024-03-25 15:04 ` [PATCH 6/7] mm: move array mem_section init code out of memory_present() Baoquan He
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 12+ messages in thread
From: Baoquan He @ 2024-03-25 15:04 UTC (permalink / raw)
  To: linux-mm; +Cc: akpm, rppt, mgorman, Baoquan He

Since the current calculation of calc_nr_kernel_pages() has taken into
consideration of kernel reserved memory, no need to have
arch_reserved_kernel_pages() any more.

Signed-off-by: Baoquan He <bhe@redhat.com>
---
 arch/powerpc/include/asm/mmu.h |  4 ----
 arch/powerpc/kernel/fadump.c   |  5 -----
 include/linux/mm.h             |  3 ---
 mm/mm_init.c                   | 12 ------------
 4 files changed, 24 deletions(-)

diff --git a/arch/powerpc/include/asm/mmu.h b/arch/powerpc/include/asm/mmu.h
index 3b72c7ed24cf..aa5c0fd5edb1 100644
--- a/arch/powerpc/include/asm/mmu.h
+++ b/arch/powerpc/include/asm/mmu.h
@@ -406,9 +406,5 @@ extern void *abatron_pteptrs[2];
 #include <asm/nohash/mmu.h>
 #endif
 
-#if defined(CONFIG_FA_DUMP) || defined(CONFIG_PRESERVE_FA_DUMP)
-#define __HAVE_ARCH_RESERVED_KERNEL_PAGES
-#endif
-
 #endif /* __KERNEL__ */
 #endif /* _ASM_POWERPC_MMU_H_ */
diff --git a/arch/powerpc/kernel/fadump.c b/arch/powerpc/kernel/fadump.c
index d14eda1e8589..ae8c7619e597 100644
--- a/arch/powerpc/kernel/fadump.c
+++ b/arch/powerpc/kernel/fadump.c
@@ -1735,8 +1735,3 @@ static void __init fadump_reserve_crash_area(u64 base)
 		memblock_reserve(mstart, msize);
 	}
 }
-
-unsigned long __init arch_reserved_kernel_pages(void)
-{
-	return memblock_reserved_size() / PAGE_SIZE;
-}
diff --git a/include/linux/mm.h b/include/linux/mm.h
index ad19350e1538..ab1ba0a31429 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -3221,9 +3221,6 @@ static inline void show_mem(void)
 extern long si_mem_available(void);
 extern void si_meminfo(struct sysinfo * val);
 extern void si_meminfo_node(struct sysinfo *val, int nid);
-#ifdef __HAVE_ARCH_RESERVED_KERNEL_PAGES
-extern unsigned long arch_reserved_kernel_pages(void);
-#endif
 
 extern __printf(3, 4)
 void warn_alloc(gfp_t gfp_mask, nodemask_t *nodemask, const char *fmt, ...);
diff --git a/mm/mm_init.c b/mm/mm_init.c
index e269a724f70e..089dc60159e9 100644
--- a/mm/mm_init.c
+++ b/mm/mm_init.c
@@ -2373,17 +2373,6 @@ void __init page_alloc_init_late(void)
 	page_alloc_sysctl_init();
 }
 
-#ifndef __HAVE_ARCH_RESERVED_KERNEL_PAGES
-/*
- * Returns the number of pages that arch has reserved but
- * is not known to alloc_large_system_hash().
- */
-static unsigned long __init arch_reserved_kernel_pages(void)
-{
-	return 0;
-}
-#endif
-
 /*
  * Adaptive scale is meant to reduce sizes of hash tables on large memory
  * machines. As memory size is increased the scale is also increased but at
@@ -2426,7 +2415,6 @@ void *__init alloc_large_system_hash(const char *tablename,
 	if (!numentries) {
 		/* round applicable memory size up to nearest megabyte */
 		numentries = nr_kernel_pages;
-		numentries -= arch_reserved_kernel_pages();
 
 		/* It isn't necessary when PAGE_SIZE >= 1MB */
 		if (PAGE_SIZE < SZ_1M)
-- 
2.41.0



^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 6/7] mm: move array mem_section init code out of memory_present()
  2024-03-25 15:04 [PATCH 0/7] mm: minor clean up and improvement Baoquan He
                   ` (4 preceding siblings ...)
  2024-03-25 15:04 ` [PATCH 5/7] mm/mm_init.c: remove arch_reserved_kernel_pages() Baoquan He
@ 2024-03-25 15:04 ` Baoquan He
  2024-03-25 15:04 ` [PATCH 7/7] mm/init: remove the unnecessary special treatment for memory-less node Baoquan He
  2024-03-25 15:08 ` [PATCH 0/7] mm: minor clean up and improvement Baoquan He
  7 siblings, 0 replies; 12+ messages in thread
From: Baoquan He @ 2024-03-25 15:04 UTC (permalink / raw)
  To: linux-mm; +Cc: akpm, rppt, mgorman, Baoquan He

When CONFIG_SPARSEMEM_EXTREME is enabled, mem_section need be initialized
to point at a two-dimensional array, and its 1st dimension of length
NR_SECTION_ROOTS will be dynamically allocated. Once the allocation is
done, it's available for all nodes.

So take the 1st dimension of mem_section initialization out of
memory_present()(), and put it into memblocks_present() which is a more
appripriate place.

Signed-off-by: Baoquan He <bhe@redhat.com>
---
 mm/sparse.c | 26 +++++++++++++-------------
 1 file changed, 13 insertions(+), 13 deletions(-)

diff --git a/mm/sparse.c b/mm/sparse.c
index aed0951b87fa..46e88549d1a6 100644
--- a/mm/sparse.c
+++ b/mm/sparse.c
@@ -226,19 +226,6 @@ static void __init memory_present(int nid, unsigned long start, unsigned long en
 {
 	unsigned long pfn;
 
-#ifdef CONFIG_SPARSEMEM_EXTREME
-	if (unlikely(!mem_section)) {
-		unsigned long size, align;
-
-		size = sizeof(struct mem_section *) * NR_SECTION_ROOTS;
-		align = 1 << (INTERNODE_CACHE_SHIFT);
-		mem_section = memblock_alloc(size, align);
-		if (!mem_section)
-			panic("%s: Failed to allocate %lu bytes align=0x%lx\n",
-			      __func__, size, align);
-	}
-#endif
-
 	start &= PAGE_SECTION_MASK;
 	mminit_validate_memmodel_limits(&start, &end);
 	for (pfn = start; pfn < end; pfn += PAGES_PER_SECTION) {
@@ -267,6 +254,19 @@ static void __init memblocks_present(void)
 	unsigned long start, end;
 	int i, nid;
 
+#ifdef CONFIG_SPARSEMEM_EXTREME
+	if (unlikely(!mem_section)) {
+		unsigned long size, align;
+
+		size = sizeof(struct mem_section *) * NR_SECTION_ROOTS;
+		align = 1 << (INTERNODE_CACHE_SHIFT);
+		mem_section = memblock_alloc(size, align);
+		if (!mem_section)
+			panic("%s: Failed to allocate %lu bytes align=0x%lx\n",
+			      __func__, size, align);
+	}
+#endif
+
 	for_each_mem_pfn_range(i, MAX_NUMNODES, &start, &end, &nid)
 		memory_present(nid, start, end);
 }
-- 
2.41.0



^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 7/7] mm/init: remove the unnecessary special treatment for memory-less node
  2024-03-25 15:04 [PATCH 0/7] mm: minor clean up and improvement Baoquan He
                   ` (5 preceding siblings ...)
  2024-03-25 15:04 ` [PATCH 6/7] mm: move array mem_section init code out of memory_present() Baoquan He
@ 2024-03-25 15:04 ` Baoquan He
  2024-03-25 15:08 ` [PATCH 0/7] mm: minor clean up and improvement Baoquan He
  7 siblings, 0 replies; 12+ messages in thread
From: Baoquan He @ 2024-03-25 15:04 UTC (permalink / raw)
  To: linux-mm; +Cc: akpm, rppt, mgorman, Baoquan He

Because memory-less node's ->node_present_pages and its
zone's ->present_pages are all 0, the judgement before calling
node_set_state() to set N_MEMORY, N_HIGH_MEMORY, N_NORMAL_MEMORY for
node is enough to skip memory-less node. The 'continue;' statement
inside for_each_node() loop of free_area_init() is gilding the lily.

Here, remove the special handling to make memory-less node share the
same code flow as normal node. And the code comment above the 'continue'
statement is not needed either.

Signed-off-by: Baoquan He <bhe@redhat.com>
---
 mm/mm_init.c | 18 +++---------------
 1 file changed, 3 insertions(+), 15 deletions(-)

diff --git a/mm/mm_init.c b/mm/mm_init.c
index 089dc60159e9..99681ffb9091 100644
--- a/mm/mm_init.c
+++ b/mm/mm_init.c
@@ -1834,28 +1834,16 @@ void __init free_area_init(unsigned long *max_zone_pfn)
 				panic("Cannot allocate %zuB for node %d.\n",
 				       sizeof(*pgdat), nid);
 			arch_refresh_nodedata(nid, pgdat);
-			free_area_init_node(nid);
-
-			/*
-			 * We do not want to confuse userspace by sysfs
-			 * files/directories for node without any memory
-			 * attached to it, so this node is not marked as
-			 * N_MEMORY and not marked online so that no sysfs
-			 * hierarchy will be created via register_one_node for
-			 * it. The pgdat will get fully initialized by
-			 * hotadd_init_pgdat() when memory is hotplugged into
-			 * this node.
-			 */
-			continue;
 		}
 
 		pgdat = NODE_DATA(nid);
 		free_area_init_node(nid);
 
 		/* Any memory on that node */
-		if (pgdat->node_present_pages)
+		if (pgdat->node_present_pages) {
 			node_set_state(nid, N_MEMORY);
-		check_for_memory(pgdat);
+			check_for_memory(pgdat);
+		}
 	}
 
 	calc_nr_kernel_pages();
-- 
2.41.0



^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH 0/7] mm: minor clean up and improvement
  2024-03-25 15:04 [PATCH 0/7] mm: minor clean up and improvement Baoquan He
                   ` (6 preceding siblings ...)
  2024-03-25 15:04 ` [PATCH 7/7] mm/init: remove the unnecessary special treatment for memory-less node Baoquan He
@ 2024-03-25 15:08 ` Baoquan He
  7 siblings, 0 replies; 12+ messages in thread
From: Baoquan He @ 2024-03-25 15:08 UTC (permalink / raw)
  To: linux-mm; +Cc: akpm, rppt, mgorman

On 03/25/24 at 11:04pm, Baoquan He wrote:

Sorry for the noise, I did misoperation on my local git commits,
please ignore this series.

> These mostly are for mm init when going through code flow.
> 
> Baoquan He (7):
>   mm/mm_init.c: remove the useless dma_reserve
>   mm/mm_init.c: add new function calc_nr_all_pages()
>   mm/mm_init.c: remove meaningless calculation of zone->managed_pages in
>     free_area_init_core()
>   mm/mm_init.c: remove unneeded calc_memmap_size()
>   mm/mm_init.c: remove arch_reserved_kernel_pages()
>   mm: move array mem_section init code out of memory_present()
>   mm/init: remove the unnecessary special treatment for memory-less node
> 
>  arch/powerpc/include/asm/mmu.h |   4 -
>  arch/powerpc/kernel/fadump.c   |   5 --
>  include/linux/mm.h             |   4 -
>  mm/mm_init.c                   | 143 ++++++++-------------------------
>  mm/sparse.c                    |  26 +++---
>  5 files changed, 45 insertions(+), 137 deletions(-)
> 
> -- 
> 2.41.0
> 



^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 1/7] mm/mm_init.c: remove the useless dma_reserve
  2024-03-25 15:04 ` [PATCH 1/7] mm/mm_init.c: remove the useless dma_reserve Baoquan He
@ 2024-03-26  8:27   ` kernel test robot
  2024-03-26  9:01   ` kernel test robot
  1 sibling, 0 replies; 12+ messages in thread
From: kernel test robot @ 2024-03-26  8:27 UTC (permalink / raw)
  To: Baoquan He; +Cc: llvm, oe-kbuild-all

Hi Baoquan,

kernel test robot noticed the following build errors:

[auto build test ERROR on powerpc/next]
[also build test ERROR on powerpc/fixes linus/master v6.9-rc1]
[cannot apply to akpm-mm/mm-everything next-20240325]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Baoquan-He/mm-mm_init-c-remove-the-useless-dma_reserve/20240325-230756
base:   https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git next
patch link:    https://lore.kernel.org/r/20240325150459.1045407-2-bhe%40redhat.com
patch subject: [PATCH 1/7] mm/mm_init.c: remove the useless dma_reserve
config: x86_64-rhel-8.3-bpf (https://download.01.org/0day-ci/archive/20240326/202403261658.HmbcBKca-lkp@intel.com/config)
compiler: clang version 17.0.6 (https://github.com/llvm/llvm-project 6009708b4367171ccdbf4b5905cb6a803753fe18)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240326/202403261658.HmbcBKca-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202403261658.HmbcBKca-lkp@intel.com/

All errors (new ones prefixed by >>):

>> arch/x86/mm/init.c:1036:2: error: call to undeclared function 'set_dma_reserve'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
    1036 |         set_dma_reserve(nr_pages - nr_free_pages);
         |         ^
   arch/x86/mm/init.c:1036:2: note: did you mean 'get_dma_residue'?
   arch/x86/include/asm/dma.h:288:19: note: 'get_dma_residue' declared here
     288 | static inline int get_dma_residue(unsigned int dmanr)
         |                   ^
   1 error generated.


vim +/set_dma_reserve +1036 arch/x86/mm/init.c

176239153049a0 Pekka Enberg 2011-11-01   992  
4270fd8b4c27f0 Ingo Molnar  2017-01-28   993  /*
4270fd8b4c27f0 Ingo Molnar  2017-01-28   994   * Calculate the precise size of the DMA zone (first 16 MB of RAM),
4270fd8b4c27f0 Ingo Molnar  2017-01-28   995   * and pass it to the MM layer - to help it set zone watermarks more
4270fd8b4c27f0 Ingo Molnar  2017-01-28   996   * accurately.
4270fd8b4c27f0 Ingo Molnar  2017-01-28   997   *
4270fd8b4c27f0 Ingo Molnar  2017-01-28   998   * Done on 64-bit systems only for the time being, although 32-bit systems
4270fd8b4c27f0 Ingo Molnar  2017-01-28   999   * might benefit from this as well.
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1000   */
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1001  void __init memblock_find_dma_reserve(void)
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1002  {
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1003  #ifdef CONFIG_X86_64
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1004  	u64 nr_pages = 0, nr_free_pages = 0;
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1005  	unsigned long start_pfn, end_pfn;
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1006  	phys_addr_t start_addr, end_addr;
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1007  	int i;
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1008  	u64 u;
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1009  
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1010  	/*
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1011  	 * Iterate over all memory ranges (free and reserved ones alike),
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1012  	 * to calculate the total number of pages in the first 16 MB of RAM:
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1013  	 */
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1014  	nr_pages = 0;
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1015  	for_each_mem_pfn_range(i, MAX_NUMNODES, &start_pfn, &end_pfn, NULL) {
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1016  		start_pfn = min(start_pfn, MAX_DMA_PFN);
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1017  		end_pfn   = min(end_pfn,   MAX_DMA_PFN);
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1018  
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1019  		nr_pages += end_pfn - start_pfn;
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1020  	}
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1021  
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1022  	/*
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1023  	 * Iterate over free memory ranges to calculate the number of free
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1024  	 * pages in the DMA zone, while not counting potential partial
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1025  	 * pages at the beginning or the end of the range:
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1026  	 */
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1027  	nr_free_pages = 0;
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1028  	for_each_free_mem_range(u, NUMA_NO_NODE, MEMBLOCK_NONE, &start_addr, &end_addr, NULL) {
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1029  		start_pfn = min_t(unsigned long, PFN_UP(start_addr), MAX_DMA_PFN);
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1030  		end_pfn   = min_t(unsigned long, PFN_DOWN(end_addr), MAX_DMA_PFN);
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1031  
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1032  		if (start_pfn < end_pfn)
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1033  			nr_free_pages += end_pfn - start_pfn;
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1034  	}
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1035  
4270fd8b4c27f0 Ingo Molnar  2017-01-28 @1036  	set_dma_reserve(nr_pages - nr_free_pages);
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1037  #endif
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1038  }
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1039  

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 1/7] mm/mm_init.c: remove the useless dma_reserve
  2024-03-25 15:04 ` [PATCH 1/7] mm/mm_init.c: remove the useless dma_reserve Baoquan He
  2024-03-26  8:27   ` kernel test robot
@ 2024-03-26  9:01   ` kernel test robot
  2024-03-26 11:01     ` Baoquan He
  1 sibling, 1 reply; 12+ messages in thread
From: kernel test robot @ 2024-03-26  9:01 UTC (permalink / raw)
  To: Baoquan He; +Cc: oe-kbuild-all

Hi Baoquan,

kernel test robot noticed the following build errors:

[auto build test ERROR on powerpc/next]
[also build test ERROR on powerpc/fixes linus/master v6.9-rc1]
[cannot apply to akpm-mm/mm-everything next-20240326]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Baoquan-He/mm-mm_init-c-remove-the-useless-dma_reserve/20240325-230756
base:   https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git next
patch link:    https://lore.kernel.org/r/20240325150459.1045407-2-bhe%40redhat.com
patch subject: [PATCH 1/7] mm/mm_init.c: remove the useless dma_reserve
config: x86_64-rhel-8.3 (https://download.01.org/0day-ci/archive/20240326/202403261645.M4PkWdmb-lkp@intel.com/config)
compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240326/202403261645.M4PkWdmb-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202403261645.M4PkWdmb-lkp@intel.com/

All errors (new ones prefixed by >>):

   arch/x86/mm/init.c: In function 'memblock_find_dma_reserve':
>> arch/x86/mm/init.c:1036:9: error: implicit declaration of function 'set_dma_reserve'; did you mean 'get_dma_residue'? [-Werror=implicit-function-declaration]
    1036 |         set_dma_reserve(nr_pages - nr_free_pages);
         |         ^~~~~~~~~~~~~~~
         |         get_dma_residue
   cc1: some warnings being treated as errors


vim +1036 arch/x86/mm/init.c

176239153049a0 Pekka Enberg 2011-11-01   992  
4270fd8b4c27f0 Ingo Molnar  2017-01-28   993  /*
4270fd8b4c27f0 Ingo Molnar  2017-01-28   994   * Calculate the precise size of the DMA zone (first 16 MB of RAM),
4270fd8b4c27f0 Ingo Molnar  2017-01-28   995   * and pass it to the MM layer - to help it set zone watermarks more
4270fd8b4c27f0 Ingo Molnar  2017-01-28   996   * accurately.
4270fd8b4c27f0 Ingo Molnar  2017-01-28   997   *
4270fd8b4c27f0 Ingo Molnar  2017-01-28   998   * Done on 64-bit systems only for the time being, although 32-bit systems
4270fd8b4c27f0 Ingo Molnar  2017-01-28   999   * might benefit from this as well.
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1000   */
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1001  void __init memblock_find_dma_reserve(void)
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1002  {
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1003  #ifdef CONFIG_X86_64
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1004  	u64 nr_pages = 0, nr_free_pages = 0;
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1005  	unsigned long start_pfn, end_pfn;
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1006  	phys_addr_t start_addr, end_addr;
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1007  	int i;
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1008  	u64 u;
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1009  
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1010  	/*
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1011  	 * Iterate over all memory ranges (free and reserved ones alike),
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1012  	 * to calculate the total number of pages in the first 16 MB of RAM:
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1013  	 */
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1014  	nr_pages = 0;
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1015  	for_each_mem_pfn_range(i, MAX_NUMNODES, &start_pfn, &end_pfn, NULL) {
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1016  		start_pfn = min(start_pfn, MAX_DMA_PFN);
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1017  		end_pfn   = min(end_pfn,   MAX_DMA_PFN);
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1018  
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1019  		nr_pages += end_pfn - start_pfn;
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1020  	}
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1021  
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1022  	/*
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1023  	 * Iterate over free memory ranges to calculate the number of free
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1024  	 * pages in the DMA zone, while not counting potential partial
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1025  	 * pages at the beginning or the end of the range:
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1026  	 */
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1027  	nr_free_pages = 0;
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1028  	for_each_free_mem_range(u, NUMA_NO_NODE, MEMBLOCK_NONE, &start_addr, &end_addr, NULL) {
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1029  		start_pfn = min_t(unsigned long, PFN_UP(start_addr), MAX_DMA_PFN);
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1030  		end_pfn   = min_t(unsigned long, PFN_DOWN(end_addr), MAX_DMA_PFN);
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1031  
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1032  		if (start_pfn < end_pfn)
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1033  			nr_free_pages += end_pfn - start_pfn;
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1034  	}
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1035  
4270fd8b4c27f0 Ingo Molnar  2017-01-28 @1036  	set_dma_reserve(nr_pages - nr_free_pages);
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1037  #endif
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1038  }
4270fd8b4c27f0 Ingo Molnar  2017-01-28  1039  

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 1/7] mm/mm_init.c: remove the useless dma_reserve
  2024-03-26  9:01   ` kernel test robot
@ 2024-03-26 11:01     ` Baoquan He
  0 siblings, 0 replies; 12+ messages in thread
From: Baoquan He @ 2024-03-26 11:01 UTC (permalink / raw)
  To: kernel test robot; +Cc: oe-kbuild-all

Hi,

On 03/26/24 at 05:01pm, kernel test robot wrote:
> Hi Baoquan,
> 
> kernel test robot noticed the following build errors:
> 
> [auto build test ERROR on powerpc/next]
> [also build test ERROR on powerpc/fixes linus/master v6.9-rc1]
> [cannot apply to akpm-mm/mm-everything next-20240326]
> [If your patch is applied to the wrong git tree, kindly drop us a note.
> And when submitting patch, we suggest to use '--base' as documented in
> https://git-scm.com/docs/git-format-patch#_base_tree_information]
> 
> url:    https://github.com/intel-lab-lkp/linux/commits/Baoquan-He/mm-mm_init-c-remove-the-useless-dma_reserve/20240325-230756
> base:   https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git next
> patch link:    https://lore.kernel.org/r/20240325150459.1045407-2-bhe%40redhat.com
> patch subject: [PATCH 1/7] mm/mm_init.c: remove the useless dma_reserve
> config: x86_64-rhel-8.3 (https://download.01.org/0day-ci/archive/20240326/202403261645.M4PkWdmb-lkp@intel.com/config)
> compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
> reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240326/202403261645.M4PkWdmb-lkp@intel.com/reproduce)
> 
> If you fix the issue in a separate patch/commit (i.e. not just a new version of
> the same patch/commit), kindly add following tags
> | Reported-by: kernel test robot <lkp@intel.com>
> | Closes: https://lore.kernel.org/oe-kbuild-all/202403261645.M4PkWdmb-lkp@intel.com/

This patch series is discarded, please skip the testing for it.


^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2024-03-26 11:01 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-03-25 15:04 [PATCH 0/7] mm: minor clean up and improvement Baoquan He
2024-03-25 15:04 ` [PATCH 1/7] mm/mm_init.c: remove the useless dma_reserve Baoquan He
2024-03-26  8:27   ` kernel test robot
2024-03-26  9:01   ` kernel test robot
2024-03-26 11:01     ` Baoquan He
2024-03-25 15:04 ` [PATCH 2/7] mm/mm_init.c: add new function calc_nr_all_pages() Baoquan He
2024-03-25 15:04 ` [PATCH 3/7] mm/mm_init.c: remove meaningless calculation of zone->managed_pages in free_area_init_core() Baoquan He
2024-03-25 15:04 ` [PATCH 4/7] mm/mm_init.c: remove unneeded calc_memmap_size() Baoquan He
2024-03-25 15:04 ` [PATCH 5/7] mm/mm_init.c: remove arch_reserved_kernel_pages() Baoquan He
2024-03-25 15:04 ` [PATCH 6/7] mm: move array mem_section init code out of memory_present() Baoquan He
2024-03-25 15:04 ` [PATCH 7/7] mm/init: remove the unnecessary special treatment for memory-less node Baoquan He
2024-03-25 15:08 ` [PATCH 0/7] mm: minor clean up and improvement Baoquan He

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.