Skip to content

Commit

Permalink
[PATCH] remove set_page_count() outside mm/
Browse files Browse the repository at this point in the history
set_page_count usage outside mm/ is limited to setting the refcount to 1.
Remove set_page_count from outside mm/, and replace those users with
init_page_count() and set_page_refcounted().

This allows more debug checking, and tighter control on how code is allowed
to play around with page->_count.

Signed-off-by: Nick Piggin <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
Nick Piggin authored and Linus Torvalds committed Mar 22, 2006
1 parent 70dc991 commit 7835e98
Show file tree
Hide file tree
Showing 40 changed files with 96 additions and 79 deletions.
2 changes: 1 addition & 1 deletion arch/alpha/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -357,7 +357,7 @@ free_reserved_mem(void *start, void *end)
void *__start = start;
for (; __start < end; __start += PAGE_SIZE) {
ClearPageReserved(virt_to_page(__start));
set_page_count(virt_to_page(__start), 1);
init_page_count(virt_to_page(__start));
free_page((long)__start);
totalram_pages++;
}
Expand Down
2 changes: 1 addition & 1 deletion arch/arm/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -531,7 +531,7 @@ static inline void free_area(unsigned long addr, unsigned long end, char *s)
for (; addr < end; addr += PAGE_SIZE) {
struct page *page = virt_to_page(addr);
ClearPageReserved(page);
set_page_count(page, 1);
init_page_count(page);
free_page(addr);
totalram_pages++;
}
Expand Down
2 changes: 1 addition & 1 deletion arch/arm26/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -324,7 +324,7 @@ static inline void free_area(unsigned long addr, unsigned long end, char *s)
for (; addr < end; addr += PAGE_SIZE) {
struct page *page = virt_to_page(addr);
ClearPageReserved(page);
set_page_count(page, 1);
init_page_count(page);
free_page(addr);
totalram_pages++;
}
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 @@ -216,7 +216,7 @@ free_initmem(void)
addr = (unsigned long)(&__init_begin);
for (; addr < (unsigned long)(&__init_end); addr += PAGE_SIZE) {
ClearPageReserved(virt_to_page(addr));
set_page_count(virt_to_page(addr), 1);
init_page_count(virt_to_page(addr));
free_page(addr);
totalram_pages++;
}
Expand Down
6 changes: 3 additions & 3 deletions arch/frv/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ void __init mem_init(void)
struct page *page = &mem_map[pfn];

ClearPageReserved(page);
set_page_count(page, 1);
init_page_count(page);
__free_page(page);
totalram_pages++;
}
Expand Down Expand Up @@ -210,7 +210,7 @@ void __init free_initmem(void)
/* next to check that the page we free is not a partial page */
for (addr = start; addr < end; addr += PAGE_SIZE) {
ClearPageReserved(virt_to_page(addr));
set_page_count(virt_to_page(addr), 1);
init_page_count(virt_to_page(addr));
free_page(addr);
totalram_pages++;
}
Expand All @@ -230,7 +230,7 @@ void __init free_initrd_mem(unsigned long start, unsigned long end)
int pages = 0;
for (; start < end; start += PAGE_SIZE) {
ClearPageReserved(virt_to_page(start));
set_page_count(virt_to_page(start), 1);
init_page_count(virt_to_page(start));
free_page(start);
totalram_pages++;
pages++;
Expand Down
4 changes: 2 additions & 2 deletions arch/h8300/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,7 @@ void free_initrd_mem(unsigned long start, unsigned long end)
int pages = 0;
for (; start < end; start += PAGE_SIZE) {
ClearPageReserved(virt_to_page(start));
set_page_count(virt_to_page(start), 1);
init_page_count(virt_to_page(start));
free_page(start);
totalram_pages++;
pages++;
Expand All @@ -219,7 +219,7 @@ free_initmem()
/* next to check that the page we free is not a partial page */
for (; addr + PAGE_SIZE < (unsigned long)(&__init_end); addr +=PAGE_SIZE) {
ClearPageReserved(virt_to_page(addr));
set_page_count(virt_to_page(addr), 1);
init_page_count(virt_to_page(addr));
free_page(addr);
totalram_pages++;
}
Expand Down
6 changes: 3 additions & 3 deletions arch/i386/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -270,7 +270,7 @@ static void __init permanent_kmaps_init(pgd_t *pgd_base)

static void __meminit free_new_highpage(struct page *page)
{
set_page_count(page, 1);
init_page_count(page);
__free_page(page);
totalhigh_pages++;
}
Expand Down Expand Up @@ -727,7 +727,7 @@ void free_initmem(void)
addr = (unsigned long)(&__init_begin);
for (; addr < (unsigned long)(&__init_end); addr += PAGE_SIZE) {
ClearPageReserved(virt_to_page(addr));
set_page_count(virt_to_page(addr), 1);
init_page_count(virt_to_page(addr));
memset((void *)addr, 0xcc, PAGE_SIZE);
free_page(addr);
totalram_pages++;
Expand Down Expand Up @@ -766,7 +766,7 @@ void free_initrd_mem(unsigned long start, unsigned long end)
printk (KERN_INFO "Freeing initrd memory: %ldk freed\n", (end - start) >> 10);
for (; start < end; start += PAGE_SIZE) {
ClearPageReserved(virt_to_page(start));
set_page_count(virt_to_page(start), 1);
init_page_count(virt_to_page(start));
free_page(start);
totalram_pages++;
}
Expand Down
6 changes: 3 additions & 3 deletions arch/ia64/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ free_initmem (void)
eaddr = (unsigned long) ia64_imva(__init_end);
while (addr < eaddr) {
ClearPageReserved(virt_to_page(addr));
set_page_count(virt_to_page(addr), 1);
init_page_count(virt_to_page(addr));
free_page(addr);
++totalram_pages;
addr += PAGE_SIZE;
Expand Down Expand Up @@ -252,7 +252,7 @@ free_initrd_mem (unsigned long start, unsigned long end)
continue;
page = virt_to_page(start);
ClearPageReserved(page);
set_page_count(page, 1);
init_page_count(page);
free_page(start);
++totalram_pages;
}
Expand Down Expand Up @@ -640,7 +640,7 @@ mem_init (void)
void online_page(struct page *page)
{
ClearPageReserved(page);
set_page_count(page, 1);
init_page_count(page);
__free_page(page);
totalram_pages++;
num_physpages++;
Expand Down
4 changes: 2 additions & 2 deletions arch/m32r/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -226,7 +226,7 @@ void free_initmem(void)
addr = (unsigned long)(&__init_begin);
for (; addr < (unsigned long)(&__init_end); addr += PAGE_SIZE) {
ClearPageReserved(virt_to_page(addr));
set_page_count(virt_to_page(addr), 1);
init_page_count(virt_to_page(addr));
free_page(addr);
totalram_pages++;
}
Expand All @@ -244,7 +244,7 @@ void free_initrd_mem(unsigned long start, unsigned long end)
unsigned long p;
for (p = start; p < end; p += PAGE_SIZE) {
ClearPageReserved(virt_to_page(p));
set_page_count(virt_to_page(p), 1);
init_page_count(virt_to_page(p));
free_page(p);
totalram_pages++;
}
Expand Down
2 changes: 1 addition & 1 deletion arch/m68k/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ void free_initrd_mem(unsigned long start, unsigned long end)
int pages = 0;
for (; start < end; start += PAGE_SIZE) {
ClearPageReserved(virt_to_page(start));
set_page_count(virt_to_page(start), 1);
init_page_count(virt_to_page(start));
free_page(start);
totalram_pages++;
pages++;
Expand Down
2 changes: 1 addition & 1 deletion arch/m68k/mm/memory.c
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ void __init init_pointer_table(unsigned long ptable)

/* unreserve the page so it's possible to free that page */
PD_PAGE(dp)->flags &= ~(1 << PG_reserved);
set_page_count(PD_PAGE(dp), 1);
init_page_count(PD_PAGE(dp));

return;
}
Expand Down
2 changes: 1 addition & 1 deletion arch/m68k/mm/motorola.c
Original file line number Diff line number Diff line change
Expand Up @@ -276,7 +276,7 @@ void free_initmem(void)
addr = (unsigned long)&__init_begin;
for (; addr < (unsigned long)&__init_end; addr += PAGE_SIZE) {
virt_to_page(addr)->flags &= ~(1 << PG_reserved);
set_page_count(virt_to_page(addr), 1);
init_page_count(virt_to_page(addr));
free_page(addr);
totalram_pages++;
}
Expand Down
4 changes: 2 additions & 2 deletions arch/m68knommu/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -195,7 +195,7 @@ void free_initrd_mem(unsigned long start, unsigned long end)
int pages = 0;
for (; start < end; start += PAGE_SIZE) {
ClearPageReserved(virt_to_page(start));
set_page_count(virt_to_page(start), 1);
init_page_count(virt_to_page(start));
free_page(start);
totalram_pages++;
pages++;
Expand All @@ -218,7 +218,7 @@ free_initmem()
/* next to check that the page we free is not a partial page */
for (; addr + PAGE_SIZE < (unsigned long)(&__init_end); addr +=PAGE_SIZE) {
ClearPageReserved(virt_to_page(addr));
set_page_count(virt_to_page(addr), 1);
init_page_count(virt_to_page(addr));
free_page(addr);
totalram_pages++;
}
Expand Down
2 changes: 1 addition & 1 deletion arch/mips/arc/memory.c
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@ unsigned long __init prom_free_prom_memory(void)
while (addr < boot_mem_map.map[i].addr
+ boot_mem_map.map[i].size) {
ClearPageReserved(virt_to_page(__va(addr)));
set_page_count(virt_to_page(__va(addr)), 1);
init_page_count(virt_to_page(__va(addr)));
free_page((unsigned long)__va(addr));
addr += PAGE_SIZE;
freed += PAGE_SIZE;
Expand Down
2 changes: 1 addition & 1 deletion arch/mips/dec/prom/memory.c
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ unsigned long __init prom_free_prom_memory(void)
addr = PAGE_SIZE;
while (addr < end) {
ClearPageReserved(virt_to_page(__va(addr)));
set_page_count(virt_to_page(__va(addr)), 1);
init_page_count(virt_to_page(__va(addr)));
free_page((unsigned long)__va(addr));
addr += PAGE_SIZE;
}
Expand Down
2 changes: 1 addition & 1 deletion arch/mips/mips-boards/generic/memory.c
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,7 @@ unsigned long __init prom_free_prom_memory(void)
while (addr < boot_mem_map.map[i].addr
+ boot_mem_map.map[i].size) {
ClearPageReserved(virt_to_page(__va(addr)));
set_page_count(virt_to_page(__va(addr)), 1);
init_page_count(virt_to_page(__va(addr)));
free_page((unsigned long)__va(addr));
addr += PAGE_SIZE;
freed += PAGE_SIZE;
Expand Down
2 changes: 1 addition & 1 deletion arch/mips/mips-boards/sim/sim_mem.c
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ unsigned long __init prom_free_prom_memory(void)
while (addr < boot_mem_map.map[i].addr
+ boot_mem_map.map[i].size) {
ClearPageReserved(virt_to_page(__va(addr)));
set_page_count(virt_to_page(__va(addr)), 1);
init_page_count(virt_to_page(__va(addr)));
free_page((unsigned long)__va(addr));
addr += PAGE_SIZE;
freed += PAGE_SIZE;
Expand Down
6 changes: 3 additions & 3 deletions arch/mips/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -245,7 +245,7 @@ void __init mem_init(void)
#ifdef CONFIG_LIMITED_DMA
set_page_address(page, lowmem_page_address(page));
#endif
set_page_count(page, 1);
init_page_count(page);
__free_page(page);
totalhigh_pages++;
}
Expand Down Expand Up @@ -292,7 +292,7 @@ void free_initrd_mem(unsigned long start, unsigned long end)

for (; start < end; start += PAGE_SIZE) {
ClearPageReserved(virt_to_page(start));
set_page_count(virt_to_page(start), 1);
init_page_count(virt_to_page(start));
free_page(start);
totalram_pages++;
}
Expand All @@ -315,7 +315,7 @@ void free_initmem(void)
page = addr;
#endif
ClearPageReserved(virt_to_page(page));
set_page_count(virt_to_page(page), 1);
init_page_count(virt_to_page(page));
free_page(page);
totalram_pages++;
freed += PAGE_SIZE;
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 @@ -559,7 +559,7 @@ void __init mem_init(void)
/* if (!page_is_ram(pgnr)) continue; */
/* commented out until page_is_ram works */
ClearPageReserved(p);
set_page_count(p, 1);
init_page_count(p);
__free_page(p);
totalram_pages++;
}
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 @@ -398,7 +398,7 @@ void free_initmem(void)
addr = (unsigned long)(&__init_begin);
for (; addr < (unsigned long)(&__init_end); addr += PAGE_SIZE) {
ClearPageReserved(virt_to_page(addr));
set_page_count(virt_to_page(addr), 1);
init_page_count(virt_to_page(addr));
free_page(addr);
num_physpages++;
totalram_pages++;
Expand Down Expand Up @@ -1018,7 +1018,7 @@ void free_initrd_mem(unsigned long start, unsigned long end)
printk(KERN_INFO "Freeing initrd memory: %ldk freed\n", (end - start) >> 10);
for (; start < end; start += PAGE_SIZE) {
ClearPageReserved(virt_to_page(start));
set_page_count(virt_to_page(start), 1);
init_page_count(virt_to_page(start));
free_page(start);
num_physpages++;
totalram_pages++;
Expand Down
4 changes: 2 additions & 2 deletions arch/powerpc/mm/init_32.c
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,7 @@ static void free_sec(unsigned long start, unsigned long end, const char *name)

while (start < end) {
ClearPageReserved(virt_to_page(start));
set_page_count(virt_to_page(start), 1);
init_page_count(virt_to_page(start));
free_page(start);
cnt++;
start += PAGE_SIZE;
Expand Down Expand Up @@ -248,7 +248,7 @@ void free_initrd_mem(unsigned long start, unsigned long end)
printk ("Freeing initrd memory: %ldk freed\n", (end - start) >> 10);
for (; start < end; start += PAGE_SIZE) {
ClearPageReserved(virt_to_page(start));
set_page_count(virt_to_page(start), 1);
init_page_count(virt_to_page(start));
free_page(start);
totalram_pages++;
}
Expand Down
4 changes: 2 additions & 2 deletions arch/powerpc/mm/init_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ void free_initmem(void)
for (; addr < (unsigned long)__init_end; addr += PAGE_SIZE) {
memset((void *)addr, 0xcc, PAGE_SIZE);
ClearPageReserved(virt_to_page(addr));
set_page_count(virt_to_page(addr), 1);
init_page_count(virt_to_page(addr));
free_page(addr);
totalram_pages++;
}
Expand All @@ -155,7 +155,7 @@ void free_initrd_mem(unsigned long start, unsigned long end)
printk ("Freeing initrd memory: %ldk freed\n", (end - start) >> 10);
for (; start < end; start += PAGE_SIZE) {
ClearPageReserved(virt_to_page(start));
set_page_count(virt_to_page(start), 1);
init_page_count(virt_to_page(start));
free_page(start);
totalram_pages++;
}
Expand Down
4 changes: 2 additions & 2 deletions arch/powerpc/mm/mem.c
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ EXPORT_SYMBOL(phys_mem_access_prot);
void online_page(struct page *page)
{
ClearPageReserved(page);
set_page_count(page, 1);
init_page_count(page);
__free_page(page);
totalram_pages++;
num_physpages++;
Expand Down Expand Up @@ -376,7 +376,7 @@ void __init mem_init(void)
struct page *page = pfn_to_page(pfn);

ClearPageReserved(page);
set_page_count(page, 1);
init_page_count(page);
__free_page(page);
totalhigh_pages++;
}
Expand Down
2 changes: 1 addition & 1 deletion arch/powerpc/platforms/cell/setup.c
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ static void __init cell_spuprop_present(struct device_node *spe,
for (pfn = start_pfn; pfn < end_pfn; pfn++) {
struct page *page = pfn_to_page(pfn);
set_page_links(page, ZONE_DMA, node_id, pfn);
set_page_count(page, 1);
init_page_count(page);
reset_page_mapcount(page);
SetPageReserved(page);
INIT_LIST_HEAD(&page->lru);
Expand Down
6 changes: 3 additions & 3 deletions arch/ppc/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ static void free_sec(unsigned long start, unsigned long end, const char *name)

while (start < end) {
ClearPageReserved(virt_to_page(start));
set_page_count(virt_to_page(start), 1);
init_page_count(virt_to_page(start));
free_page(start);
cnt++;
start += PAGE_SIZE;
Expand Down Expand Up @@ -172,7 +172,7 @@ void free_initrd_mem(unsigned long start, unsigned long end)

for (; start < end; start += PAGE_SIZE) {
ClearPageReserved(virt_to_page(start));
set_page_count(virt_to_page(start), 1);
init_page_count(virt_to_page(start));
free_page(start);
totalram_pages++;
}
Expand Down Expand Up @@ -441,7 +441,7 @@ void __init mem_init(void)
struct page *page = mem_map + pfn;

ClearPageReserved(page);
set_page_count(page, 1);
init_page_count(page);
__free_page(page);
totalhigh_pages++;
}
Expand Down
4 changes: 2 additions & 2 deletions arch/s390/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -292,7 +292,7 @@ void free_initmem(void)
addr = (unsigned long)(&__init_begin);
for (; addr < (unsigned long)(&__init_end); addr += PAGE_SIZE) {
ClearPageReserved(virt_to_page(addr));
set_page_count(virt_to_page(addr), 1);
init_page_count(virt_to_page(addr));
free_page(addr);
totalram_pages++;
}
Expand All @@ -307,7 +307,7 @@ void free_initrd_mem(unsigned long start, unsigned long end)
printk ("Freeing initrd memory: %ldk freed\n", (end - start) >> 10);
for (; start < end; start += PAGE_SIZE) {
ClearPageReserved(virt_to_page(start));
set_page_count(virt_to_page(start), 1);
init_page_count(virt_to_page(start));
free_page(start);
totalram_pages++;
}
Expand Down
Loading

0 comments on commit 7835e98

Please sign in to comment.