+ mm-reduce-noise-in-show_mem-for-lowmem-allocations.patch added to mm-unstable branch

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



The patch titled
     Subject: mm: reduce noise in show_mem for lowmem allocations
has been added to the -mm mm-unstable branch.  Its filename is
     mm-reduce-noise-in-show_mem-for-lowmem-allocations.patch

This patch will shortly appear at
     https://git.kernel.org/pub/scm/linux/kernel/git/akpm/25-new.git/tree/patches/mm-reduce-noise-in-show_mem-for-lowmem-allocations.patch

This patch will later appear in the mm-unstable branch at
    git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm

Before you just go and hit "reply", please:
   a) Consider who else should be cc'ed
   b) Prefer to cc a suitable mailing list as well
   c) Ideally: find the original patch on the mailing list and do a
      reply-to-all to that, adding suitable additional cc's

*** Remember to use Documentation/process/submit-checklist.rst when testing your code ***

The -mm tree is included into linux-next via the mm-everything
branch at git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
and is updated there every 2-3 working days

------------------------------------------------------
From: Michal Hocko <mhocko@xxxxxxxx>
Subject: mm: reduce noise in show_mem for lowmem allocations
Date: Tue, 23 Aug 2022 11:22:30 +0200

While discussing early DMA pool pre-allocation failure with Christoph [1]
I have realized that the allocation failure warning is rather noisy for
constrained allocations like GFP_DMA{32}.  Those zones are usually not
populated on all nodes very often as their memory ranges are constrained.

This is an attempt to reduce the ballast that doesn't provide any relevant
information for those allocation failures investigation.  Please note that
I have only compile tested it (in my default config setup) and I am
throwing it mostly to see what people think about it.

[1] http://lkml.kernel.org/r/20220817060647.1032426-1-hch@xxxxxx

Link: https://lkml.kernel.org/r/YwScVmVofIZkopkF@xxxxxxxxxxxxxx
Signed-off-by: Michal Hocko <mhocko@xxxxxxxx>
Acked-by: Johannes Weiner <hannes@xxxxxxxxxxx>
Cc: Christoph Hellwig <hch@xxxxxxxxxxxxx>
Cc: Mel Gorman <mgorman@xxxxxxx>
Cc: Vlastimil Babka <vbabka@xxxxxxx>

Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx>
---

 drivers/tty/sysrq.c       |    2 +-
 drivers/tty/vt/keyboard.c |    2 +-
 include/linux/mm.h        |    4 ++--
 init/initramfs.c          |    2 +-
 kernel/panic.c            |    2 +-
 lib/show_mem.c            |    4 ++--
 mm/nommu.c                |    6 +++---
 mm/oom_kill.c             |    2 +-
 mm/page_alloc.c           |   22 ++++++++++++++++++++--
 9 files changed, 32 insertions(+), 14 deletions(-)

--- a/drivers/tty/sysrq.c~mm-reduce-noise-in-show_mem-for-lowmem-allocations
+++ a/drivers/tty/sysrq.c
@@ -342,7 +342,7 @@ static const struct sysrq_key_op sysrq_f
 
 static void sysrq_handle_showmem(int key)
 {
-	show_mem(0, NULL);
+	show_mem(0, NULL, GFP_HIGHUSER_MOVABLE);
 }
 static const struct sysrq_key_op sysrq_showmem_op = {
 	.handler	= sysrq_handle_showmem,
--- a/drivers/tty/vt/keyboard.c~mm-reduce-noise-in-show_mem-for-lowmem-allocations
+++ a/drivers/tty/vt/keyboard.c
@@ -606,7 +606,7 @@ static void fn_scroll_back(struct vc_dat
 
 static void fn_show_mem(struct vc_data *vc)
 {
-	show_mem(0, NULL);
+	show_mem(0, NULL, GFP_HIGHUSER_MOVABLE);
 }
 
 static void fn_show_state(struct vc_data *vc)
--- a/include/linux/mm.h~mm-reduce-noise-in-show_mem-for-lowmem-allocations
+++ a/include/linux/mm.h
@@ -1842,7 +1842,7 @@ extern void pagefault_out_of_memory(void
  */
 #define SHOW_MEM_FILTER_NODES		(0x0001u)	/* disallowed nodes */
 
-extern void show_free_areas(unsigned int flags, nodemask_t *nodemask);
+extern void show_free_areas(unsigned int flags, nodemask_t *nodemask, gfp_t gfp_mask);
 
 #ifdef CONFIG_MMU
 extern bool can_do_mlock(void);
@@ -2582,7 +2582,7 @@ extern void calculate_min_free_kbytes(vo
 extern int __meminit init_per_zone_wmark_min(void);
 extern void mem_init(void);
 extern void __init mmap_init(void);
-extern void show_mem(unsigned int flags, nodemask_t *nodemask);
+extern void show_mem(unsigned int flags, nodemask_t *nodemask, gfp_t gfp_mask);
 extern long si_mem_available(void);
 extern void si_meminfo(struct sysinfo * val);
 extern void si_meminfo_node(struct sysinfo *val, int nid);
--- a/init/initramfs.c~mm-reduce-noise-in-show_mem-for-lowmem-allocations
+++ a/init/initramfs.c
@@ -63,7 +63,7 @@ static void panic_show_mem(const char *f
 {
 	va_list args;
 
-	show_mem(0, NULL);
+	show_mem(0, NULL, GFP_HIGHUSER_MOVABLE);
 	va_start(args, fmt);
 	panic(fmt, args);
 	va_end(args);
--- a/kernel/panic.c~mm-reduce-noise-in-show_mem-for-lowmem-allocations
+++ a/kernel/panic.c
@@ -187,7 +187,7 @@ static void panic_print_sys_info(bool co
 		show_state();
 
 	if (panic_print & PANIC_PRINT_MEM_INFO)
-		show_mem(0, NULL);
+		show_mem(0, NULL, GFP_HIGHUSER_MOVABLE);
 
 	if (panic_print & PANIC_PRINT_TIMER_INFO)
 		sysrq_timer_list_show();
--- a/lib/show_mem.c~mm-reduce-noise-in-show_mem-for-lowmem-allocations
+++ a/lib/show_mem.c
@@ -8,13 +8,13 @@
 #include <linux/mm.h>
 #include <linux/cma.h>
 
-void show_mem(unsigned int filter, nodemask_t *nodemask)
+void show_mem(unsigned int filter, nodemask_t *nodemask, gfp_t gfp_mask)
 {
 	pg_data_t *pgdat;
 	unsigned long total = 0, reserved = 0, highmem = 0;
 
 	printk("Mem-Info:\n");
-	show_free_areas(filter, nodemask);
+	show_free_areas(filter, nodemask, gfp_mask);
 
 	for_each_online_pgdat(pgdat) {
 		int zoneid;
--- a/mm/nommu.c~mm-reduce-noise-in-show_mem-for-lowmem-allocations
+++ a/mm/nommu.c
@@ -1030,7 +1030,7 @@ error_free:
 enomem:
 	pr_err("Allocation of length %lu from process %d (%s) failed\n",
 	       len, current->pid, current->comm);
-	show_free_areas(0, NULL);
+	show_free_areas(0, NULL, GFP_KERNEL);
 	return -ENOMEM;
 }
 
@@ -1259,13 +1259,13 @@ error_getting_vma:
 	kmem_cache_free(vm_region_jar, region);
 	pr_warn("Allocation of vma for %lu byte allocation from process %d failed\n",
 			len, current->pid);
-	show_free_areas(0, NULL);
+	show_free_areas(0, NULL, GFP_KERNEL);
 	return -ENOMEM;
 
 error_getting_region:
 	pr_warn("Allocation of vm region for %lu byte allocation from process %d failed\n",
 			len, current->pid);
-	show_free_areas(0, NULL);
+	show_free_areas(0, NULL, GFP_KERNEL);
 	return -ENOMEM;
 
 error_maple_preallocate:
--- a/mm/oom_kill.c~mm-reduce-noise-in-show_mem-for-lowmem-allocations
+++ a/mm/oom_kill.c
@@ -461,7 +461,7 @@ static void dump_header(struct oom_contr
 	if (is_memcg_oom(oc))
 		mem_cgroup_print_oom_meminfo(oc->memcg);
 	else {
-		show_mem(SHOW_MEM_FILTER_NODES, oc->nodemask);
+		show_mem(SHOW_MEM_FILTER_NODES, oc->nodemask, oc->gfp_mask);
 		if (should_dump_unreclaim_slab())
 			dump_unreclaimable_slab();
 	}
--- a/mm/page_alloc.c~mm-reduce-noise-in-show_mem-for-lowmem-allocations
+++ a/mm/page_alloc.c
@@ -4329,7 +4329,7 @@ static void warn_alloc_show_mem(gfp_t gf
 	if (!in_task() || !(gfp_mask & __GFP_DIRECT_RECLAIM))
 		filter &= ~SHOW_MEM_FILTER_NODES;
 
-	show_mem(filter, nodemask);
+	show_mem(filter, nodemask, gfp_mask);
 }
 
 void warn_alloc(gfp_t gfp_mask, nodemask_t *nodemask, const char *fmt, ...)
@@ -6049,6 +6049,15 @@ static void show_migration_types(unsigne
 	printk(KERN_CONT "(%s) ", tmp);
 }
 
+static bool node_has_managed_zones(pg_data_t *pgdat, int max_zone_idx)
+{
+	int zone_idx;
+	for (zone_idx = 0; zone_idx <= max_zone_idx; zone_idx++)
+		if (zone_managed_pages(pgdat->node_zones + zone_idx))
+			return true;
+	return false;
+}
+
 /*
  * Show free area list (used inside shift_scroll-lock stuff)
  * We also calculate the percentage fragmentation. We do this by counting the
@@ -6058,14 +6067,17 @@ static void show_migration_types(unsigne
  * SHOW_MEM_FILTER_NODES: suppress nodes that are not allowed by current's
  *   cpuset.
  */
-void show_free_areas(unsigned int filter, nodemask_t *nodemask)
+void show_free_areas(unsigned int filter, nodemask_t *nodemask, gfp_t gfp_mask)
 {
 	unsigned long free_pcp = 0;
+	int max_zone_idx = gfp_zone(gfp_mask);
 	int cpu, nid;
 	struct zone *zone;
 	pg_data_t *pgdat;
 
 	for_each_populated_zone(zone) {
+		if (zone_idx(zone) > max_zone_idx)
+			continue;
 		if (show_mem_node_skip(filter, zone_to_nid(zone), nodemask))
 			continue;
 
@@ -6103,6 +6115,8 @@ void show_free_areas(unsigned int filter
 	for_each_online_pgdat(pgdat) {
 		if (show_mem_node_skip(filter, pgdat->node_id, nodemask))
 			continue;
+		if (!node_has_managed_zones(pgdat, max_zone_idx))
+			continue;
 
 		printk("Node %d"
 			" active_anon:%lukB"
@@ -6159,6 +6173,8 @@ void show_free_areas(unsigned int filter
 	for_each_populated_zone(zone) {
 		int i;
 
+		if (zone_idx(zone) > max_zone_idx)
+			continue;
 		if (show_mem_node_skip(filter, zone_to_nid(zone), nodemask))
 			continue;
 
@@ -6220,6 +6236,8 @@ void show_free_areas(unsigned int filter
 		unsigned long nr[MAX_ORDER], flags, total = 0;
 		unsigned char types[MAX_ORDER];
 
+		if (zone_idx(zone) > max_zone_idx)
+			continue;
 		if (show_mem_node_skip(filter, zone_to_nid(zone), nodemask))
 			continue;
 		show_node(zone);
_

Patches currently in -mm which might be from mhocko@xxxxxxxx are

mm-reduce-noise-in-show_mem-for-lowmem-allocations.patch




[Index of Archives]     [Kernel Archive]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]

  Powered by Linux