forked from Minki/linux
mm: reduce noise in show_mem for lowmem allocations
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@lst.de [mhocko@suse.com: update] Link: https://lkml.kernel.org/r/Yw29bmJTIkKogTiW@dhcp22.suse.cz [mhocko@suse.com: fix build] [akpm@linux-foundation.org: fix it for mapletree] [akpm@linux-foundation.org: update it for Michal's update] [mhocko@suse.com: fix arch/powerpc/xmon/xmon.c] Link: https://lkml.kernel.org/r/Ywh3C4dKB9B93jIy@dhcp22.suse.cz [akpm@linux-foundation.org: fix arch/sparc/kernel/setup_32.c] Link: https://lkml.kernel.org/r/YwScVmVofIZkopkF@dhcp22.suse.cz Signed-off-by: Michal Hocko <mhocko@suse.com> Acked-by: Johannes Weiner <hannes@cmpxchg.org> Acked-by: Vlastimil Babka <vbabka@suse.cz> Cc: Christoph Hellwig <hch@infradead.org> Cc: Mel Gorman <mgorman@suse.de> Cc: Dan Carpenter <dan.carpenter@oracle.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
7014887a01
commit
974f4367dd
@ -1838,7 +1838,11 @@ extern void pagefault_out_of_memory(void);
|
|||||||
*/
|
*/
|
||||||
#define SHOW_MEM_FILTER_NODES (0x0001u) /* disallowed nodes */
|
#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, int max_zone_idx);
|
||||||
|
static void __maybe_unused show_free_areas(unsigned int flags, nodemask_t *nodemask)
|
||||||
|
{
|
||||||
|
__show_free_areas(flags, nodemask, MAX_NR_ZONES - 1);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_MMU
|
#ifdef CONFIG_MMU
|
||||||
extern bool can_do_mlock(void);
|
extern bool can_do_mlock(void);
|
||||||
@ -2578,7 +2582,12 @@ extern void calculate_min_free_kbytes(void);
|
|||||||
extern int __meminit init_per_zone_wmark_min(void);
|
extern int __meminit init_per_zone_wmark_min(void);
|
||||||
extern void mem_init(void);
|
extern void mem_init(void);
|
||||||
extern void __init mmap_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, int max_zone_idx);
|
||||||
|
static inline void show_mem(unsigned int flags, nodemask_t *nodemask)
|
||||||
|
{
|
||||||
|
__show_mem(flags, nodemask, MAX_NR_ZONES - 1);
|
||||||
|
}
|
||||||
extern long si_mem_available(void);
|
extern long si_mem_available(void);
|
||||||
extern void si_meminfo(struct sysinfo * val);
|
extern void si_meminfo(struct sysinfo * val);
|
||||||
extern void si_meminfo_node(struct sysinfo *val, int nid);
|
extern void si_meminfo_node(struct sysinfo *val, int nid);
|
||||||
|
@ -8,13 +8,13 @@
|
|||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/cma.h>
|
#include <linux/cma.h>
|
||||||
|
|
||||||
void show_mem(unsigned int filter, nodemask_t *nodemask)
|
void __show_mem(unsigned int filter, nodemask_t *nodemask, int max_zone_idx)
|
||||||
{
|
{
|
||||||
pg_data_t *pgdat;
|
pg_data_t *pgdat;
|
||||||
unsigned long total = 0, reserved = 0, highmem = 0;
|
unsigned long total = 0, reserved = 0, highmem = 0;
|
||||||
|
|
||||||
printk("Mem-Info:\n");
|
printk("Mem-Info:\n");
|
||||||
show_free_areas(filter, nodemask);
|
__show_free_areas(filter, nodemask, max_zone_idx);
|
||||||
|
|
||||||
for_each_online_pgdat(pgdat) {
|
for_each_online_pgdat(pgdat) {
|
||||||
int zoneid;
|
int zoneid;
|
||||||
|
@ -461,7 +461,7 @@ static void dump_header(struct oom_control *oc, struct task_struct *p)
|
|||||||
if (is_memcg_oom(oc))
|
if (is_memcg_oom(oc))
|
||||||
mem_cgroup_print_oom_meminfo(oc->memcg);
|
mem_cgroup_print_oom_meminfo(oc->memcg);
|
||||||
else {
|
else {
|
||||||
show_mem(SHOW_MEM_FILTER_NODES, oc->nodemask);
|
__show_mem(SHOW_MEM_FILTER_NODES, oc->nodemask, gfp_zone(oc->gfp_mask));
|
||||||
if (should_dump_unreclaim_slab())
|
if (should_dump_unreclaim_slab())
|
||||||
dump_unreclaimable_slab();
|
dump_unreclaimable_slab();
|
||||||
}
|
}
|
||||||
|
@ -4322,7 +4322,7 @@ static void warn_alloc_show_mem(gfp_t gfp_mask, nodemask_t *nodemask)
|
|||||||
if (!in_task() || !(gfp_mask & __GFP_DIRECT_RECLAIM))
|
if (!in_task() || !(gfp_mask & __GFP_DIRECT_RECLAIM))
|
||||||
filter &= ~SHOW_MEM_FILTER_NODES;
|
filter &= ~SHOW_MEM_FILTER_NODES;
|
||||||
|
|
||||||
show_mem(filter, nodemask);
|
__show_mem(filter, nodemask, gfp_zone(gfp_mask));
|
||||||
}
|
}
|
||||||
|
|
||||||
void warn_alloc(gfp_t gfp_mask, nodemask_t *nodemask, const char *fmt, ...)
|
void warn_alloc(gfp_t gfp_mask, nodemask_t *nodemask, const char *fmt, ...)
|
||||||
@ -6050,6 +6050,15 @@ static void show_migration_types(unsigned char type)
|
|||||||
printk(KERN_CONT "(%s) ", tmp);
|
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)
|
* Show free area list (used inside shift_scroll-lock stuff)
|
||||||
* We also calculate the percentage fragmentation. We do this by counting the
|
* We also calculate the percentage fragmentation. We do this by counting the
|
||||||
@ -6059,7 +6068,7 @@ static void show_migration_types(unsigned char type)
|
|||||||
* SHOW_MEM_FILTER_NODES: suppress nodes that are not allowed by current's
|
* SHOW_MEM_FILTER_NODES: suppress nodes that are not allowed by current's
|
||||||
* cpuset.
|
* cpuset.
|
||||||
*/
|
*/
|
||||||
void show_free_areas(unsigned int filter, nodemask_t *nodemask)
|
void __show_free_areas(unsigned int filter, nodemask_t *nodemask, int max_zone_idx)
|
||||||
{
|
{
|
||||||
unsigned long free_pcp = 0;
|
unsigned long free_pcp = 0;
|
||||||
int cpu, nid;
|
int cpu, nid;
|
||||||
@ -6067,6 +6076,8 @@ void show_free_areas(unsigned int filter, nodemask_t *nodemask)
|
|||||||
pg_data_t *pgdat;
|
pg_data_t *pgdat;
|
||||||
|
|
||||||
for_each_populated_zone(zone) {
|
for_each_populated_zone(zone) {
|
||||||
|
if (zone_idx(zone) > max_zone_idx)
|
||||||
|
continue;
|
||||||
if (show_mem_node_skip(filter, zone_to_nid(zone), nodemask))
|
if (show_mem_node_skip(filter, zone_to_nid(zone), nodemask))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@ -6104,6 +6115,8 @@ void show_free_areas(unsigned int filter, nodemask_t *nodemask)
|
|||||||
for_each_online_pgdat(pgdat) {
|
for_each_online_pgdat(pgdat) {
|
||||||
if (show_mem_node_skip(filter, pgdat->node_id, nodemask))
|
if (show_mem_node_skip(filter, pgdat->node_id, nodemask))
|
||||||
continue;
|
continue;
|
||||||
|
if (!node_has_managed_zones(pgdat, max_zone_idx))
|
||||||
|
continue;
|
||||||
|
|
||||||
printk("Node %d"
|
printk("Node %d"
|
||||||
" active_anon:%lukB"
|
" active_anon:%lukB"
|
||||||
@ -6160,6 +6173,8 @@ void show_free_areas(unsigned int filter, nodemask_t *nodemask)
|
|||||||
for_each_populated_zone(zone) {
|
for_each_populated_zone(zone) {
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
if (zone_idx(zone) > max_zone_idx)
|
||||||
|
continue;
|
||||||
if (show_mem_node_skip(filter, zone_to_nid(zone), nodemask))
|
if (show_mem_node_skip(filter, zone_to_nid(zone), nodemask))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@ -6221,6 +6236,8 @@ void show_free_areas(unsigned int filter, nodemask_t *nodemask)
|
|||||||
unsigned long nr[MAX_ORDER], flags, total = 0;
|
unsigned long nr[MAX_ORDER], flags, total = 0;
|
||||||
unsigned char types[MAX_ORDER];
|
unsigned char types[MAX_ORDER];
|
||||||
|
|
||||||
|
if (zone_idx(zone) > max_zone_idx)
|
||||||
|
continue;
|
||||||
if (show_mem_node_skip(filter, zone_to_nid(zone), nodemask))
|
if (show_mem_node_skip(filter, zone_to_nid(zone), nodemask))
|
||||||
continue;
|
continue;
|
||||||
show_node(zone);
|
show_node(zone);
|
||||||
|
Loading…
Reference in New Issue
Block a user