mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-28 20:02:17 +00:00
![David Rientjes](/assets/img/avatar_default.png)
Commit ddd588b5dd
("oom: suppress nodes that are not allowed from
meminfo on oom kill") moved lib/show_mem.o out of lib/lib.a, which
resulted in build warnings on all architectures that implement their own
versions of show_mem():
lib/lib.a(show_mem.o): In function `show_mem':
show_mem.c:(.text+0x1f4): multiple definition of `show_mem'
arch/sparc/mm/built-in.o:(.text+0xd70): first defined here
The fix is to remove __show_mem() and add its argument to show_mem() in
all implementations to prevent this breakage.
Architectures that implement their own show_mem() actually don't do
anything with the argument yet, but they could be made to filter nodes
that aren't allowed in the current context in the future just like the
generic implementation.
Reported-by: Stephen Rothwell <sfr@canb.auug.org.au>
Reported-by: James Bottomley <James.Bottomley@hansenpartnership.com>
Suggested-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: David Rientjes <rientjes@google.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
63 lines
1.3 KiB
C
63 lines
1.3 KiB
C
/*
|
|
* Generic show_mem() implementation
|
|
*
|
|
* Copyright (C) 2008 Johannes Weiner <hannes@saeurebad.de>
|
|
* All code subject to the GPL version 2.
|
|
*/
|
|
|
|
#include <linux/mm.h>
|
|
#include <linux/nmi.h>
|
|
#include <linux/quicklist.h>
|
|
|
|
void show_mem(unsigned int filter)
|
|
{
|
|
pg_data_t *pgdat;
|
|
unsigned long total = 0, reserved = 0, shared = 0,
|
|
nonshared = 0, highmem = 0;
|
|
|
|
printk("Mem-Info:\n");
|
|
__show_free_areas(filter);
|
|
|
|
for_each_online_pgdat(pgdat) {
|
|
unsigned long i, flags;
|
|
|
|
pgdat_resize_lock(pgdat, &flags);
|
|
for (i = 0; i < pgdat->node_spanned_pages; i++) {
|
|
struct page *page;
|
|
unsigned long pfn = pgdat->node_start_pfn + i;
|
|
|
|
if (unlikely(!(i % MAX_ORDER_NR_PAGES)))
|
|
touch_nmi_watchdog();
|
|
|
|
if (!pfn_valid(pfn))
|
|
continue;
|
|
|
|
page = pfn_to_page(pfn);
|
|
|
|
if (PageHighMem(page))
|
|
highmem++;
|
|
|
|
if (PageReserved(page))
|
|
reserved++;
|
|
else if (page_count(page) == 1)
|
|
nonshared++;
|
|
else if (page_count(page) > 1)
|
|
shared += page_count(page) - 1;
|
|
|
|
total++;
|
|
}
|
|
pgdat_resize_unlock(pgdat, &flags);
|
|
}
|
|
|
|
printk("%lu pages RAM\n", total);
|
|
#ifdef CONFIG_HIGHMEM
|
|
printk("%lu pages HighMem\n", highmem);
|
|
#endif
|
|
printk("%lu pages reserved\n", reserved);
|
|
printk("%lu pages shared\n", shared);
|
|
printk("%lu pages non-shared\n", nonshared);
|
|
#ifdef CONFIG_QUICKLIST
|
|
printk("%lu pages in pagetable cache\n",
|
|
quicklist_total_size());
|
|
#endif
|
|
}
|