Skip to content

Commit

Permalink
arch, mm: filter disallowed nodes from arch specific show_mem functions
Browse files Browse the repository at this point in the history
Architectures that implement their own show_mem() function did not pass
the filter argument to show_free_areas() to appropriately avoid emitting
the state of nodes that are disallowed in the current context.  This patch
now passes the filter argument to show_free_areas() so those nodes are now
avoided.

This patch also removes the show_free_areas() wrapper around
__show_free_areas() and converts existing callers to pass an empty filter.

ia64 emits additional information for each node, so skip_free_areas_zone()
must be made global to filter disallowed nodes and it is converted to use
a nid argument rather than a zone for this use case.

Signed-off-by: David Rientjes <[email protected]>
Cc: Russell King <[email protected]>
Cc: Tony Luck <[email protected]>
Cc: Fenghua Yu <[email protected]>
Cc: Kyle McMartin <[email protected]>
Cc: Helge Deller <[email protected]>
Cc: James Bottomley <[email protected]>
Cc: "David S. Miller" <[email protected]>
Cc: Guan Xuetao <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
rientjes authored and torvalds committed May 25, 2011
1 parent 851cc85 commit 7bf02ea
Show file tree
Hide file tree
Showing 13 changed files with 34 additions and 36 deletions.
2 changes: 1 addition & 1 deletion arch/arm/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ void show_mem(unsigned int filter)
struct meminfo * mi = &meminfo;

printk("Mem-info:\n");
show_free_areas();
show_free_areas(filter);

for_each_bank (i, mi) {
struct membank *bank = &mi->bank[i];
Expand Down
10 changes: 6 additions & 4 deletions arch/ia64/mm/contig.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,13 +44,16 @@ void show_mem(unsigned int filter)
pg_data_t *pgdat;

printk(KERN_INFO "Mem-info:\n");
show_free_areas();
show_free_areas(filter);
printk(KERN_INFO "Node memory in pages:\n");
for_each_online_pgdat(pgdat) {
unsigned long present;
unsigned long flags;
int shared = 0, cached = 0, reserved = 0;
int nid = pgdat->node_id;

if (skip_free_areas_node(filter, nid))
continue;
pgdat_resize_lock(pgdat, &flags);
present = pgdat->node_present_pages;
for(i = 0; i < pgdat->node_spanned_pages; i++) {
Expand All @@ -64,8 +67,7 @@ void show_mem(unsigned int filter)
if (max_gap < LARGE_GAP)
continue;
#endif
i = vmemmap_find_next_valid_pfn(pgdat->node_id,
i) - 1;
i = vmemmap_find_next_valid_pfn(nid, i) - 1;
continue;
}
if (PageReserved(page))
Expand All @@ -81,7 +83,7 @@ void show_mem(unsigned int filter)
total_cached += cached;
total_shared += shared;
printk(KERN_INFO "Node %4d: RAM: %11ld, rsvd: %8d, "
"shrd: %10d, swpd: %10d\n", pgdat->node_id,
"shrd: %10d, swpd: %10d\n", nid,
present, reserved, shared, cached);
}
printk(KERN_INFO "%ld pages of RAM\n", total_present);
Expand Down
10 changes: 6 additions & 4 deletions arch/ia64/mm/discontig.c
Original file line number Diff line number Diff line change
Expand Up @@ -622,13 +622,16 @@ void show_mem(unsigned int filter)
pg_data_t *pgdat;

printk(KERN_INFO "Mem-info:\n");
show_free_areas();
show_free_areas(filter);
printk(KERN_INFO "Node memory in pages:\n");
for_each_online_pgdat(pgdat) {
unsigned long present;
unsigned long flags;
int shared = 0, cached = 0, reserved = 0;
int nid = pgdat->node_id;

if (skip_free_areas_node(filter, nid))
continue;
pgdat_resize_lock(pgdat, &flags);
present = pgdat->node_present_pages;
for(i = 0; i < pgdat->node_spanned_pages; i++) {
Expand All @@ -638,8 +641,7 @@ void show_mem(unsigned int filter)
if (pfn_valid(pgdat->node_start_pfn + i))
page = pfn_to_page(pgdat->node_start_pfn + i);
else {
i = vmemmap_find_next_valid_pfn(pgdat->node_id,
i) - 1;
i = vmemmap_find_next_valid_pfn(nid, i) - 1;
continue;
}
if (PageReserved(page))
Expand All @@ -655,7 +657,7 @@ void show_mem(unsigned int filter)
total_cached += cached;
total_shared += shared;
printk(KERN_INFO "Node %4d: RAM: %11ld, rsvd: %8d, "
"shrd: %10d, swpd: %10d\n", pgdat->node_id,
"shrd: %10d, swpd: %10d\n", nid,
present, reserved, shared, cached);
}
printk(KERN_INFO "%ld pages of RAM\n", total_present);
Expand Down
2 changes: 1 addition & 1 deletion arch/parisc/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -686,7 +686,7 @@ void show_mem(unsigned int filter)
int shared = 0, cached = 0;

printk(KERN_INFO "Mem-info:\n");
show_free_areas();
show_free_areas(filter);
#ifndef CONFIG_DISCONTIGMEM
i = max_mapnr;
while (i-- > 0) {
Expand Down
2 changes: 1 addition & 1 deletion arch/sparc/kernel/setup_32.c
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ static void prom_sync_me(void)
"nop\n\t" : : "r" (&trapbase));

prom_printf("PROM SYNC COMMAND...\n");
show_free_areas();
show_free_areas(0);
if(current->pid != 0) {
local_irq_enable();
sys_sync();
Expand Down
2 changes: 1 addition & 1 deletion arch/sparc/mm/init_32.c
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ void __init kmap_init(void)
void show_mem(unsigned int filter)
{
printk("Mem-info:\n");
show_free_areas();
show_free_areas(filter);
printk("Free swap: %6ldkB\n",
nr_swap_pages << (PAGE_SHIFT-10));
printk("%ld pages of RAM\n", totalram_pages);
Expand Down
2 changes: 1 addition & 1 deletion arch/unicore32/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ void show_mem(unsigned int filter)
struct meminfo *mi = &meminfo;

printk(KERN_DEFAULT "Mem-info:\n");
show_free_areas();
show_free_areas(filter);

for_each_bank(i, mi) {
struct membank *bank = &mi->bank[i];
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/ioc3-eth.c
Original file line number Diff line number Diff line change
Expand Up @@ -915,7 +915,7 @@ static void ioc3_alloc_rings(struct net_device *dev)

skb = ioc3_alloc_skb(RX_BUF_ALLOC_SIZE, GFP_ATOMIC);
if (!skb) {
show_free_areas();
show_free_areas(0);
continue;
}

Expand Down
2 changes: 1 addition & 1 deletion drivers/tty/serial/68328serial.c
Original file line number Diff line number Diff line change
Expand Up @@ -281,7 +281,7 @@ static void receive_chars(struct m68k_serial *info, unsigned short rx)
#ifdef CONFIG_MAGIC_SYSRQ
} else if (ch == 0x10) { /* ^P */
show_state();
show_free_areas();
show_free_areas(0);
show_buffers();
/* show_net_buffers(); */
return;
Expand Down
6 changes: 3 additions & 3 deletions include/linux/mm.h
Original file line number Diff line number Diff line change
Expand Up @@ -862,13 +862,13 @@ extern void pagefault_out_of_memory(void);
#define offset_in_page(p) ((unsigned long)(p) & ~PAGE_MASK)

/*
* Flags passed to show_mem() and __show_free_areas() to suppress output in
* Flags passed to show_mem() and show_free_areas() to suppress output in
* various contexts.
*/
#define SHOW_MEM_FILTER_NODES (0x0001u) /* filter disallowed nodes */

extern void show_free_areas(void);
extern void __show_free_areas(unsigned int flags);
extern void show_free_areas(unsigned int flags);
extern bool skip_free_areas_node(unsigned int flags, int nid);

int shmem_lock(struct file *file, int lock, struct user_struct *user);
struct file *shmem_file_setup(const char *name, loff_t size, unsigned long flags);
Expand Down
2 changes: 1 addition & 1 deletion lib/show_mem.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ void show_mem(unsigned int filter)
nonshared = 0, highmem = 0;

printk("Mem-Info:\n");
__show_free_areas(filter);
show_free_areas(filter);

for_each_online_pgdat(pgdat) {
unsigned long i, flags;
Expand Down
6 changes: 3 additions & 3 deletions mm/nommu.c
Original file line number Diff line number Diff line change
Expand Up @@ -1235,7 +1235,7 @@ static int do_mmap_private(struct vm_area_struct *vma,
enomem:
printk("Allocation of length %lu from process %d (%s) failed\n",
len, current->pid, current->comm);
show_free_areas();
show_free_areas(0);
return -ENOMEM;
}

Expand Down Expand Up @@ -1468,14 +1468,14 @@ unsigned long do_mmap_pgoff(struct file *file,
printk(KERN_WARNING "Allocation of vma for %lu byte allocation"
" from process %d failed\n",
len, current->pid);
show_free_areas();
show_free_areas(0);
return -ENOMEM;

error_getting_region:
printk(KERN_WARNING "Allocation of vm region for %lu byte allocation"
" from process %d failed\n",
len, current->pid);
show_free_areas();
show_free_areas(0);
return -ENOMEM;
}
EXPORT_SYMBOL(do_mmap_pgoff);
Expand Down
22 changes: 8 additions & 14 deletions mm/page_alloc.c
Original file line number Diff line number Diff line change
Expand Up @@ -2473,19 +2473,18 @@ void si_meminfo_node(struct sysinfo *val, int nid)
#endif

/*
* Determine whether the zone's node should be displayed or not, depending on
* whether SHOW_MEM_FILTER_NODES was passed to __show_free_areas().
* Determine whether the node should be displayed or not, depending on whether
* SHOW_MEM_FILTER_NODES was passed to show_free_areas().
*/
static bool skip_free_areas_zone(unsigned int flags, const struct zone *zone)
bool skip_free_areas_node(unsigned int flags, int nid)
{
bool ret = false;

if (!(flags & SHOW_MEM_FILTER_NODES))
goto out;

get_mems_allowed();
ret = !node_isset(zone->zone_pgdat->node_id,
cpuset_current_mems_allowed);
ret = !node_isset(nid, cpuset_current_mems_allowed);
put_mems_allowed();
out:
return ret;
Expand All @@ -2500,13 +2499,13 @@ static bool skip_free_areas_zone(unsigned int flags, const struct zone *zone)
* Suppresses nodes that are not allowed by current's cpuset if
* SHOW_MEM_FILTER_NODES is passed.
*/
void __show_free_areas(unsigned int filter)
void show_free_areas(unsigned int filter)
{
int cpu;
struct zone *zone;

for_each_populated_zone(zone) {
if (skip_free_areas_zone(filter, zone))
if (skip_free_areas_node(filter, zone_to_nid(zone)))
continue;
show_node(zone);
printk("%s per-cpu:\n", zone->name);
Expand Down Expand Up @@ -2549,7 +2548,7 @@ void __show_free_areas(unsigned int filter)
for_each_populated_zone(zone) {
int i;

if (skip_free_areas_zone(filter, zone))
if (skip_free_areas_node(filter, zone_to_nid(zone)))
continue;
show_node(zone);
printk("%s"
Expand Down Expand Up @@ -2618,7 +2617,7 @@ void __show_free_areas(unsigned int filter)
for_each_populated_zone(zone) {
unsigned long nr[MAX_ORDER], flags, order, total = 0;

if (skip_free_areas_zone(filter, zone))
if (skip_free_areas_node(filter, zone_to_nid(zone)))
continue;
show_node(zone);
printk("%s: ", zone->name);
Expand All @@ -2639,11 +2638,6 @@ void __show_free_areas(unsigned int filter)
show_swap_cache_info();
}

void show_free_areas(void)
{
__show_free_areas(0);
}

static void zoneref_set_zone(struct zone *zone, struct zoneref *zoneref)
{
zoneref->zone = zone;
Expand Down

0 comments on commit 7bf02ea

Please sign in to comment.