Skip to content

Commit

Permalink
mm: concentrate modification of totalram_pages into the mm core
Browse files Browse the repository at this point in the history
Concentrate code to modify totalram_pages into the mm core, so the arch
memory initialized code doesn't need to take care of it.  With these
changes applied, only following functions from mm core modify global
variable totalram_pages: free_bootmem_late(), free_all_bootmem(),
free_all_bootmem_node(), adjust_managed_page_count().

With this patch applied, it will be much more easier for us to keep
totalram_pages and zone->managed_pages in consistence.

Signed-off-by: Jiang Liu <[email protected]>
Acked-by: David Howells <[email protected]>
Cc: "H. Peter Anvin" <[email protected]>
Cc: "Michael S. Tsirkin" <[email protected]>
Cc: <[email protected]>
Cc: Arnd Bergmann <[email protected]>
Cc: Catalin Marinas <[email protected]>
Cc: Chris Metcalf <[email protected]>
Cc: Geert Uytterhoeven <[email protected]>
Cc: Ingo Molnar <[email protected]>
Cc: Jeremy Fitzhardinge <[email protected]>
Cc: Jianguo Wu <[email protected]>
Cc: Joonsoo Kim <[email protected]>
Cc: Kamezawa Hiroyuki <[email protected]>
Cc: Konrad Rzeszutek Wilk <[email protected]>
Cc: Marek Szyprowski <[email protected]>
Cc: Mel Gorman <[email protected]>
Cc: Michel Lespinasse <[email protected]>
Cc: Minchan Kim <[email protected]>
Cc: Rik van Riel <[email protected]>
Cc: Rusty Russell <[email protected]>
Cc: Tang Chen <[email protected]>
Cc: Tejun Heo <[email protected]>
Cc: Thomas Gleixner <[email protected]>
Cc: Wen Congyang <[email protected]>
Cc: Will Deacon <[email protected]>
Cc: Yasuaki Ishimatsu <[email protected]>
Cc: Yinghai Lu <[email protected]>
Cc: Russell King <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
jiangliu authored and torvalds committed Jul 3, 2013
1 parent 3dcc057 commit 0c98853
Show file tree
Hide file tree
Showing 36 changed files with 50 additions and 46 deletions.
2 changes: 1 addition & 1 deletion arch/alpha/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -309,7 +309,7 @@ void __init
mem_init(void)
{
max_mapnr = num_physpages = max_low_pfn;
totalram_pages += free_all_bootmem();
free_all_bootmem();
high_memory = (void *) __va(max_low_pfn * PAGE_SIZE);

printk_memory_info();
Expand Down
2 changes: 1 addition & 1 deletion arch/alpha/mm/numa.c
Original file line number Diff line number Diff line change
Expand Up @@ -334,7 +334,7 @@ void __init mem_init(void)
/*
* This will free up the bootmem, ie, slot 0 memory
*/
totalram_pages += free_all_bootmem_node(NODE_DATA(nid));
free_all_bootmem_node(NODE_DATA(nid));

pfn = NODE_DATA(nid)->node_start_pfn;
for (i = 0; i < node_spanned_pages(nid); i++, pfn++)
Expand Down
2 changes: 1 addition & 1 deletion arch/arc/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ void __init mem_init(void)

high_memory = (void *)(CONFIG_LINUX_LINK_BASE + arc_mem_sz);

totalram_pages = free_all_bootmem();
free_all_bootmem();

/* count all reserved pages [kernel code/data/mem_map..] */
reserved_pages = 0;
Expand Down
3 changes: 1 addition & 2 deletions arch/arm/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -596,8 +596,7 @@ void __init mem_init(void)

/* this will put all unused low memory onto the freelists */
free_unused_memmap(&meminfo);

totalram_pages += free_all_bootmem();
free_all_bootmem();

#ifdef CONFIG_SA1111
/* now that our DMA memory is actually so designated, we can free it */
Expand Down
2 changes: 1 addition & 1 deletion arch/arm64/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -284,7 +284,7 @@ void __init mem_init(void)
free_unused_memmap();
#endif

totalram_pages += free_all_bootmem();
free_all_bootmem();

reserved_pages = free_pages = 0;

Expand Down
2 changes: 0 additions & 2 deletions arch/avr32/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -117,8 +117,6 @@ void __init mem_init(void)
if (pgdat->node_spanned_pages != 0)
node_pages = free_all_bootmem_node(pgdat);

totalram_pages += node_pages;

for (i = 0; i < node_pages; i++)
if (PageReserved(pgdat->node_mem_map + i))
reservedpages++;
Expand Down
2 changes: 1 addition & 1 deletion arch/blackfin/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ void __init mem_init(void)
printk(KERN_DEBUG "Kernel managed physical pages: %lu\n", num_physpages);

/* This will put all low memory onto the freelists. */
totalram_pages = free_all_bootmem();
free_all_bootmem();

reservedpages = 0;
for (tmp = ARCH_PFN_OFFSET; tmp < max_mapnr; tmp++)
Expand Down
2 changes: 1 addition & 1 deletion arch/c6x/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ void __init mem_init(void)
high_memory = (void *)(memory_end & PAGE_MASK);

/* this will put all memory onto the freelists */
totalram_pages = free_all_bootmem();
free_all_bootmem();

codek = (_etext - _stext) >> 10;
datak = (_end - _sdata) >> 10;
Expand Down
2 changes: 1 addition & 1 deletion arch/cris/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ mem_init(void)
max_mapnr = num_physpages = max_low_pfn - min_low_pfn;

/* this will put all memory onto the freelists */
totalram_pages = free_all_bootmem();
free_all_bootmem();

reservedpages = 0;
for (tmp = 0; tmp < max_mapnr; tmp++) {
Expand Down
2 changes: 1 addition & 1 deletion arch/frv/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ void __init mem_init(void)
int codek = 0, datak = 0;

/* this will put all low memory onto the freelists */
totalram_pages = free_all_bootmem();
free_all_bootmem();

#ifdef CONFIG_MMU
for (loop = 0 ; loop < npages ; loop++)
Expand Down
2 changes: 1 addition & 1 deletion arch/h8300/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ void __init mem_init(void)
max_mapnr = num_physpages = MAP_NR(high_memory);

/* this will put all low memory onto the freelists */
totalram_pages = free_all_bootmem();
free_all_bootmem();

codek = (_etext - _stext) >> 10;
datak = (__bss_stop - _sdata) >> 10;
Expand Down
2 changes: 1 addition & 1 deletion arch/hexagon/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ unsigned long long kmap_generation;
void __init mem_init(void)
{
/* No idea where this is actually declared. Seems to evade LXR. */
totalram_pages += free_all_bootmem();
free_all_bootmem();
num_physpages = bootmem_lastpg-ARCH_PFN_OFFSET;

printk(KERN_INFO "totalram_pages = %ld\n", totalram_pages);
Expand Down
2 changes: 1 addition & 1 deletion arch/ia64/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -622,7 +622,7 @@ mem_init (void)

for_each_online_pgdat(pgdat)
if (pgdat->bdata->node_bootmem_map)
totalram_pages += free_all_bootmem_node(pgdat);
free_all_bootmem_node(pgdat);

reserved_pages = 0;
efi_memmap_walk(count_reserved_pages, &reserved_pages);
Expand Down
2 changes: 1 addition & 1 deletion arch/m32r/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@ void __init mem_init(void)

/* this will put all low memory onto the freelists */
for_each_online_node(nid)
totalram_pages += free_all_bootmem_node(NODE_DATA(nid));
free_all_bootmem_node(NODE_DATA(nid));

reservedpages = reservedpages_count() - hole_pages;
codesize = (unsigned long) &_etext - (unsigned long)&_text;
Expand Down
4 changes: 2 additions & 2 deletions arch/m68k/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -155,11 +155,11 @@ void __init mem_init(void)
int i;

/* this will put all memory onto the freelists */
totalram_pages = num_physpages = 0;
num_physpages = 0;
for_each_online_pgdat(pgdat) {
num_physpages += pgdat->node_present_pages;

totalram_pages += free_all_bootmem_node(pgdat);
free_all_bootmem_node(pgdat);
for (i = 0; i < pgdat->node_spanned_pages; i++) {
struct page *page = pgdat->node_mem_map + i;
char *addr = page_to_virt(page);
Expand Down
5 changes: 1 addition & 4 deletions arch/metag/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -393,14 +393,11 @@ void __init mem_init(void)

for_each_online_node(nid) {
pg_data_t *pgdat = NODE_DATA(nid);
unsigned long node_pages = 0;

num_physpages += pgdat->node_present_pages;

if (pgdat->node_spanned_pages)
node_pages = free_all_bootmem_node(pgdat);

totalram_pages += node_pages;
free_all_bootmem_node(pgdat);
}

pr_info("Memory: %luk/%luk available\n",
Expand Down
2 changes: 1 addition & 1 deletion arch/microblaze/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -252,7 +252,7 @@ void __init mem_init(void)
high_memory = (void *)__va(memory_start + lowmem_size - 1);

/* this will put all memory onto the freelists */
totalram_pages += free_all_bootmem();
free_all_bootmem();

for_each_online_pgdat(pgdat) {
unsigned long i;
Expand Down
2 changes: 1 addition & 1 deletion arch/mips/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -374,7 +374,7 @@ void __init mem_init(void)
#endif
high_memory = (void *) __va(max_low_pfn << PAGE_SHIFT);

totalram_pages += free_all_bootmem();
free_all_bootmem();
setup_zero_pages(); /* Setup zeroed pages. */

reservedpages = ram = 0;
Expand Down
2 changes: 1 addition & 1 deletion arch/mips/sgi-ip27/ip27-memory.c
Original file line number Diff line number Diff line change
Expand Up @@ -489,7 +489,7 @@ void __init mem_init(void)
/*
* This will free up the bootmem, ie, slot 0 memory.
*/
totalram_pages += free_all_bootmem_node(NODE_DATA(node));
free_all_bootmem_node(NODE_DATA(node));
}

setup_zero_pages(); /* This comes from node 0 */
Expand Down
2 changes: 1 addition & 1 deletion arch/mn10300/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ void __init mem_init(void)
memset(empty_zero_page, 0, PAGE_SIZE);

/* this will put all low memory onto the freelists */
totalram_pages += free_all_bootmem();
free_all_bootmem();

reservedpages = 0;
for (tmp = 0; tmp < num_physpages; tmp++)
Expand Down
2 changes: 1 addition & 1 deletion arch/openrisc/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,7 @@ static int __init free_pages_init(void)
int reservedpages, pfn;

/* this will put all low memory onto the freelists */
totalram_pages = free_all_bootmem();
free_all_bootmem();

reservedpages = 0;
for (pfn = 0; pfn < max_low_pfn; pfn++) {
Expand Down
4 changes: 2 additions & 2 deletions arch/parisc/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -593,13 +593,13 @@ void __init mem_init(void)

#ifndef CONFIG_DISCONTIGMEM
max_mapnr = page_to_pfn(virt_to_page(high_memory - 1)) + 1;
totalram_pages += free_all_bootmem();
free_all_bootmem();
#else
{
int i;

for (i = 0; i < npmem_ranges; i++)
totalram_pages += free_all_bootmem_node(NODE_DATA(i));
free_all_bootmem_node(NODE_DATA(i));
}
#endif

Expand Down
5 changes: 2 additions & 3 deletions arch/powerpc/mm/mem.c
Original file line number Diff line number Diff line change
Expand Up @@ -318,13 +318,12 @@ void __init mem_init(void)
for_each_online_node(nid) {
if (NODE_DATA(nid)->node_spanned_pages != 0) {
printk("freeing bootmem node %d\n", nid);
totalram_pages +=
free_all_bootmem_node(NODE_DATA(nid));
free_all_bootmem_node(NODE_DATA(nid));
}
}
#else
max_mapnr = max_pfn;
totalram_pages += free_all_bootmem();
free_all_bootmem();
#endif
for_each_online_pgdat(pgdat) {
for (i = 0; i < pgdat->node_spanned_pages; i++) {
Expand Down
2 changes: 1 addition & 1 deletion arch/s390/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ void __init mem_init(void)
cmma_init();

/* this will put all low memory onto the freelists */
totalram_pages += free_all_bootmem();
free_all_bootmem();
setup_zero_pages(); /* Setup zeroed pages. */

reservedpages = 0;
Expand Down
2 changes: 1 addition & 1 deletion arch/score/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ void __init mem_init(void)
unsigned long tmp, ram = 0;

high_memory = (void *) __va(max_low_pfn << PAGE_SHIFT);
totalram_pages += free_all_bootmem();
free_all_bootmem();
setup_zero_page(); /* Setup zeroed pages. */
reservedpages = 0;

Expand Down
2 changes: 1 addition & 1 deletion arch/sh/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -422,7 +422,7 @@ void __init mem_init(void)
num_physpages += pgdat->node_present_pages;

if (pgdat->node_spanned_pages)
totalram_pages += free_all_bootmem_node(pgdat);
free_all_bootmem_node(pgdat);


node_high_memory = (void *)__va((pgdat->node_start_pfn +
Expand Down
3 changes: 1 addition & 2 deletions arch/sparc/mm/init_32.c
Original file line number Diff line number Diff line change
Expand Up @@ -323,8 +323,7 @@ void __init mem_init(void)

max_mapnr = last_valid_pfn - pfn_base;
high_memory = __va(max_low_pfn << PAGE_SHIFT);

totalram_pages = free_all_bootmem();
free_all_bootmem();

for (i = 0; sp_banks[i].num_bytes != 0; i++) {
unsigned long start_pfn = sp_banks[i].base_addr >> PAGE_SHIFT;
Expand Down
2 changes: 1 addition & 1 deletion arch/sparc/mm/init_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -2061,7 +2061,7 @@ void __init mem_init(void)
high_memory = __va(last_valid_pfn << PAGE_SHIFT);

register_page_bootmem_info();
totalram_pages = free_all_bootmem();
free_all_bootmem();

/* We subtract one to account for the mem_map_zero page
* allocated below.
Expand Down
2 changes: 1 addition & 1 deletion arch/tile/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -846,7 +846,7 @@ void __init mem_init(void)
set_max_mapnr_init();

/* this will put all bootmem onto the freelists */
totalram_pages += free_all_bootmem();
free_all_bootmem();

#ifndef CONFIG_64BIT
/* count all remaining LOWMEM and give all HIGHMEM to page allocator */
Expand Down
2 changes: 1 addition & 1 deletion arch/um/kernel/mem.c
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ void __init mem_init(void)
uml_reserved = brk_end;

/* this will put all low memory onto the freelists */
totalram_pages = free_all_bootmem();
free_all_bootmem();
max_low_pfn = totalram_pages;
#ifdef CONFIG_HIGHMEM
setup_highmem(end_iomem, highmem);
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 @@ -392,7 +392,7 @@ void __init mem_init(void)
free_unused_memmap(&meminfo);

/* this will put all unused low memory onto the freelists */
totalram_pages += free_all_bootmem();
free_all_bootmem();

reserved_pages = free_pages = 0;

Expand Down
2 changes: 1 addition & 1 deletion arch/x86/mm/init_32.c
Original file line number Diff line number Diff line change
Expand Up @@ -759,7 +759,7 @@ void __init mem_init(void)
set_highmem_pages_init();

/* this will put all low memory onto the freelists */
totalram_pages += free_all_bootmem();
free_all_bootmem();

reservedpages = 0;
for (tmp = 0; tmp < max_low_pfn; tmp++)
Expand Down
2 changes: 1 addition & 1 deletion arch/x86/mm/init_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -1054,7 +1054,7 @@ void __init mem_init(void)
register_page_bootmem_info();

/* this will put all memory onto the freelists */
totalram_pages = free_all_bootmem();
free_all_bootmem();

absent_pages = absent_pages_in_range(0, max_pfn);
reservedpages = max_pfn - totalram_pages - absent_pages;
Expand Down
2 changes: 1 addition & 1 deletion arch/xtensa/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,7 @@ void __init mem_init(void)
#error HIGHGMEM not implemented in init.c
#endif

totalram_pages += free_all_bootmem();
free_all_bootmem();

reservedpages = ram = 0;
for (tmp = 0; tmp < max_mapnr; tmp++) {
Expand Down
9 changes: 8 additions & 1 deletion mm/bootmem.c
Original file line number Diff line number Diff line change
Expand Up @@ -271,9 +271,14 @@ void __init reset_all_zones_managed_pages(void)
*/
unsigned long __init free_all_bootmem_node(pg_data_t *pgdat)
{
unsigned long pages;

register_page_bootmem_info_node(pgdat);
reset_node_managed_pages(pgdat);
return free_all_bootmem_core(pgdat->bdata);
pages = free_all_bootmem_core(pgdat->bdata);
totalram_pages += pages;

return pages;
}

/**
Expand All @@ -291,6 +296,8 @@ unsigned long __init free_all_bootmem(void)
list_for_each_entry(bdata, &bdata_list, list)
total_pages += free_all_bootmem_core(bdata);

totalram_pages += total_pages;

return total_pages;
}

Expand Down
7 changes: 6 additions & 1 deletion mm/nobootmem.c
Original file line number Diff line number Diff line change
Expand Up @@ -165,14 +165,19 @@ void __init reset_all_zones_managed_pages(void)
*/
unsigned long __init free_all_bootmem(void)
{
unsigned long pages;

reset_all_zones_managed_pages();

/*
* We need to use MAX_NUMNODES instead of NODE_DATA(0)->node_id
* because in some case like Node0 doesn't have RAM installed
* low ram will be on Node1
*/
return free_low_memory_core_early();
pages = free_low_memory_core_early();
totalram_pages += pages;

return pages;
}

/**
Expand Down

0 comments on commit 0c98853

Please sign in to comment.