aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNick Piggin <npiggin@suse.de>2006-03-22 03:08:40 -0500
committerLinus Torvalds <torvalds@g5.osdl.org>2006-03-22 10:54:02 -0500
commit7835e98b2e3c66dba79cb0ff8ebb90a2fe030c29 (patch)
tree405a96eade34845dabe2f125b6c5eb095846869d
parent70dc991d66cac40fdb07346dba2b5d862d732c34 (diff)
[PATCH] remove set_page_count() outside mm/
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 <npiggin@suse.de> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--arch/alpha/mm/init.c2
-rw-r--r--arch/arm/mm/init.c2
-rw-r--r--arch/arm26/mm/init.c2
-rw-r--r--arch/cris/mm/init.c2
-rw-r--r--arch/frv/mm/init.c6
-rw-r--r--arch/h8300/mm/init.c4
-rw-r--r--arch/i386/mm/init.c6
-rw-r--r--arch/ia64/mm/init.c6
-rw-r--r--arch/m32r/mm/init.c4
-rw-r--r--arch/m68k/mm/init.c2
-rw-r--r--arch/m68k/mm/memory.c2
-rw-r--r--arch/m68k/mm/motorola.c2
-rw-r--r--arch/m68knommu/mm/init.c4
-rw-r--r--arch/mips/arc/memory.c2
-rw-r--r--arch/mips/dec/prom/memory.c2
-rw-r--r--arch/mips/mips-boards/generic/memory.c2
-rw-r--r--arch/mips/mips-boards/sim/sim_mem.c2
-rw-r--r--arch/mips/mm/init.c6
-rw-r--r--arch/mips/sgi-ip27/ip27-memory.c2
-rw-r--r--arch/parisc/mm/init.c4
-rw-r--r--arch/powerpc/mm/init_32.c4
-rw-r--r--arch/powerpc/mm/init_64.c4
-rw-r--r--arch/powerpc/mm/mem.c4
-rw-r--r--arch/powerpc/platforms/cell/setup.c2
-rw-r--r--arch/ppc/mm/init.c6
-rw-r--r--arch/s390/mm/init.c4
-rw-r--r--arch/sh/mm/init.c4
-rw-r--r--arch/sh64/mm/init.c4
-rw-r--r--arch/sparc/kernel/sun4d_smp.c6
-rw-r--r--arch/sparc/kernel/sun4m_smp.c6
-rw-r--r--arch/sparc/mm/init.c6
-rw-r--r--arch/sparc64/mm/init.c4
-rw-r--r--arch/um/kernel/mem.c4
-rw-r--r--arch/x86_64/mm/init.c6
-rw-r--r--arch/xtensa/mm/init.c2
-rw-r--r--drivers/video/acornfb.c2
-rw-r--r--include/linux/mm.h11
-rw-r--r--mm/hugetlb.c5
-rw-r--r--mm/internal.h13
-rw-r--r--mm/page_alloc.c14
40 files changed, 96 insertions, 79 deletions
diff --git a/arch/alpha/mm/init.c b/arch/alpha/mm/init.c
index 486d7945583d..544ac5dc09eb 100644
--- a/arch/alpha/mm/init.c
+++ b/arch/alpha/mm/init.c
@@ -357,7 +357,7 @@ free_reserved_mem(void *start, void *end)
357 void *__start = start; 357 void *__start = start;
358 for (; __start < end; __start += PAGE_SIZE) { 358 for (; __start < end; __start += PAGE_SIZE) {
359 ClearPageReserved(virt_to_page(__start)); 359 ClearPageReserved(virt_to_page(__start));
360 set_page_count(virt_to_page(__start), 1); 360 init_page_count(virt_to_page(__start));
361 free_page((long)__start); 361 free_page((long)__start);
362 totalram_pages++; 362 totalram_pages++;
363 } 363 }
diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c
index 8b276ee38acf..b0321e943b76 100644
--- a/arch/arm/mm/init.c
+++ b/arch/arm/mm/init.c
@@ -531,7 +531,7 @@ static inline void free_area(unsigned long addr, unsigned long end, char *s)
531 for (; addr < end; addr += PAGE_SIZE) { 531 for (; addr < end; addr += PAGE_SIZE) {
532 struct page *page = virt_to_page(addr); 532 struct page *page = virt_to_page(addr);
533 ClearPageReserved(page); 533 ClearPageReserved(page);
534 set_page_count(page, 1); 534 init_page_count(page);
535 free_page(addr); 535 free_page(addr);
536 totalram_pages++; 536 totalram_pages++;
537 } 537 }
diff --git a/arch/arm26/mm/init.c b/arch/arm26/mm/init.c
index 1f09a9d0fb83..e3ecaa453747 100644
--- a/arch/arm26/mm/init.c
+++ b/arch/arm26/mm/init.c
@@ -324,7 +324,7 @@ static inline void free_area(unsigned long addr, unsigned long end, char *s)
324 for (; addr < end; addr += PAGE_SIZE) { 324 for (; addr < end; addr += PAGE_SIZE) {
325 struct page *page = virt_to_page(addr); 325 struct page *page = virt_to_page(addr);
326 ClearPageReserved(page); 326 ClearPageReserved(page);
327 set_page_count(page, 1); 327 init_page_count(page);
328 free_page(addr); 328 free_page(addr);
329 totalram_pages++; 329 totalram_pages++;
330 } 330 }
diff --git a/arch/cris/mm/init.c b/arch/cris/mm/init.c
index 31a0018b525a..b7842ff213a6 100644
--- a/arch/cris/mm/init.c
+++ b/arch/cris/mm/init.c
@@ -216,7 +216,7 @@ free_initmem(void)
216 addr = (unsigned long)(&__init_begin); 216 addr = (unsigned long)(&__init_begin);
217 for (; addr < (unsigned long)(&__init_end); addr += PAGE_SIZE) { 217 for (; addr < (unsigned long)(&__init_end); addr += PAGE_SIZE) {
218 ClearPageReserved(virt_to_page(addr)); 218 ClearPageReserved(virt_to_page(addr));
219 set_page_count(virt_to_page(addr), 1); 219 init_page_count(virt_to_page(addr));
220 free_page(addr); 220 free_page(addr);
221 totalram_pages++; 221 totalram_pages++;
222 } 222 }
diff --git a/arch/frv/mm/init.c b/arch/frv/mm/init.c
index 765088ea8a50..8899aa1a4f06 100644
--- a/arch/frv/mm/init.c
+++ b/arch/frv/mm/init.c
@@ -169,7 +169,7 @@ void __init mem_init(void)
169 struct page *page = &mem_map[pfn]; 169 struct page *page = &mem_map[pfn];
170 170
171 ClearPageReserved(page); 171 ClearPageReserved(page);
172 set_page_count(page, 1); 172 init_page_count(page);
173 __free_page(page); 173 __free_page(page);
174 totalram_pages++; 174 totalram_pages++;
175 } 175 }
@@ -210,7 +210,7 @@ void __init free_initmem(void)
210 /* next to check that the page we free is not a partial page */ 210 /* next to check that the page we free is not a partial page */
211 for (addr = start; addr < end; addr += PAGE_SIZE) { 211 for (addr = start; addr < end; addr += PAGE_SIZE) {
212 ClearPageReserved(virt_to_page(addr)); 212 ClearPageReserved(virt_to_page(addr));
213 set_page_count(virt_to_page(addr), 1); 213 init_page_count(virt_to_page(addr));
214 free_page(addr); 214 free_page(addr);
215 totalram_pages++; 215 totalram_pages++;
216 } 216 }
@@ -230,7 +230,7 @@ void __init free_initrd_mem(unsigned long start, unsigned long end)
230 int pages = 0; 230 int pages = 0;
231 for (; start < end; start += PAGE_SIZE) { 231 for (; start < end; start += PAGE_SIZE) {
232 ClearPageReserved(virt_to_page(start)); 232 ClearPageReserved(virt_to_page(start));
233 set_page_count(virt_to_page(start), 1); 233 init_page_count(virt_to_page(start));
234 free_page(start); 234 free_page(start);
235 totalram_pages++; 235 totalram_pages++;
236 pages++; 236 pages++;
diff --git a/arch/h8300/mm/init.c b/arch/h8300/mm/init.c
index 1e0929ddc8c4..09efc4b1f038 100644
--- a/arch/h8300/mm/init.c
+++ b/arch/h8300/mm/init.c
@@ -196,7 +196,7 @@ void free_initrd_mem(unsigned long start, unsigned long end)
196 int pages = 0; 196 int pages = 0;
197 for (; start < end; start += PAGE_SIZE) { 197 for (; start < end; start += PAGE_SIZE) {
198 ClearPageReserved(virt_to_page(start)); 198 ClearPageReserved(virt_to_page(start));
199 set_page_count(virt_to_page(start), 1); 199 init_page_count(virt_to_page(start));
200 free_page(start); 200 free_page(start);
201 totalram_pages++; 201 totalram_pages++;
202 pages++; 202 pages++;
@@ -219,7 +219,7 @@ free_initmem()
219 /* next to check that the page we free is not a partial page */ 219 /* next to check that the page we free is not a partial page */
220 for (; addr + PAGE_SIZE < (unsigned long)(&__init_end); addr +=PAGE_SIZE) { 220 for (; addr + PAGE_SIZE < (unsigned long)(&__init_end); addr +=PAGE_SIZE) {
221 ClearPageReserved(virt_to_page(addr)); 221 ClearPageReserved(virt_to_page(addr));
222 set_page_count(virt_to_page(addr), 1); 222 init_page_count(virt_to_page(addr));
223 free_page(addr); 223 free_page(addr);
224 totalram_pages++; 224 totalram_pages++;
225 } 225 }
diff --git a/arch/i386/mm/init.c b/arch/i386/mm/init.c
index 2700f01994ba..7ba55a6e2dbc 100644
--- a/arch/i386/mm/init.c
+++ b/arch/i386/mm/init.c
@@ -270,7 +270,7 @@ static void __init permanent_kmaps_init(pgd_t *pgd_base)
270 270
271static void __meminit free_new_highpage(struct page *page) 271static void __meminit free_new_highpage(struct page *page)
272{ 272{
273 set_page_count(page, 1); 273 init_page_count(page);
274 __free_page(page); 274 __free_page(page);
275 totalhigh_pages++; 275 totalhigh_pages++;
276} 276}
@@ -727,7 +727,7 @@ void free_initmem(void)
727 addr = (unsigned long)(&__init_begin); 727 addr = (unsigned long)(&__init_begin);
728 for (; addr < (unsigned long)(&__init_end); addr += PAGE_SIZE) { 728 for (; addr < (unsigned long)(&__init_end); addr += PAGE_SIZE) {
729 ClearPageReserved(virt_to_page(addr)); 729 ClearPageReserved(virt_to_page(addr));
730 set_page_count(virt_to_page(addr), 1); 730 init_page_count(virt_to_page(addr));
731 memset((void *)addr, 0xcc, PAGE_SIZE); 731 memset((void *)addr, 0xcc, PAGE_SIZE);
732 free_page(addr); 732 free_page(addr);
733 totalram_pages++; 733 totalram_pages++;
@@ -766,7 +766,7 @@ void free_initrd_mem(unsigned long start, unsigned long end)
766 printk (KERN_INFO "Freeing initrd memory: %ldk freed\n", (end - start) >> 10); 766 printk (KERN_INFO "Freeing initrd memory: %ldk freed\n", (end - start) >> 10);
767 for (; start < end; start += PAGE_SIZE) { 767 for (; start < end; start += PAGE_SIZE) {
768 ClearPageReserved(virt_to_page(start)); 768 ClearPageReserved(virt_to_page(start));
769 set_page_count(virt_to_page(start), 1); 769 init_page_count(virt_to_page(start));
770 free_page(start); 770 free_page(start);
771 totalram_pages++; 771 totalram_pages++;
772 } 772 }
diff --git a/arch/ia64/mm/init.c b/arch/ia64/mm/init.c
index b38b6d213c15..08d94e6bfa18 100644
--- a/arch/ia64/mm/init.c
+++ b/arch/ia64/mm/init.c
@@ -197,7 +197,7 @@ free_initmem (void)
197 eaddr = (unsigned long) ia64_imva(__init_end); 197 eaddr = (unsigned long) ia64_imva(__init_end);
198 while (addr < eaddr) { 198 while (addr < eaddr) {
199 ClearPageReserved(virt_to_page(addr)); 199 ClearPageReserved(virt_to_page(addr));
200 set_page_count(virt_to_page(addr), 1); 200 init_page_count(virt_to_page(addr));
201 free_page(addr); 201 free_page(addr);
202 ++totalram_pages; 202 ++totalram_pages;
203 addr += PAGE_SIZE; 203 addr += PAGE_SIZE;
@@ -252,7 +252,7 @@ free_initrd_mem (unsigned long start, unsigned long end)
252 continue; 252 continue;
253 page = virt_to_page(start); 253 page = virt_to_page(start);
254 ClearPageReserved(page); 254 ClearPageReserved(page);
255 set_page_count(page, 1); 255 init_page_count(page);
256 free_page(start); 256 free_page(start);
257 ++totalram_pages; 257 ++totalram_pages;
258 } 258 }
@@ -640,7 +640,7 @@ mem_init (void)
640void online_page(struct page *page) 640void online_page(struct page *page)
641{ 641{
642 ClearPageReserved(page); 642 ClearPageReserved(page);
643 set_page_count(page, 1); 643 init_page_count(page);
644 __free_page(page); 644 __free_page(page);
645 totalram_pages++; 645 totalram_pages++;
646 num_physpages++; 646 num_physpages++;
diff --git a/arch/m32r/mm/init.c b/arch/m32r/mm/init.c
index 6facf15b04f3..c9e7dad860b7 100644
--- a/arch/m32r/mm/init.c
+++ b/arch/m32r/mm/init.c
@@ -226,7 +226,7 @@ void free_initmem(void)
226 addr = (unsigned long)(&__init_begin); 226 addr = (unsigned long)(&__init_begin);
227 for (; addr < (unsigned long)(&__init_end); addr += PAGE_SIZE) { 227 for (; addr < (unsigned long)(&__init_end); addr += PAGE_SIZE) {
228 ClearPageReserved(virt_to_page(addr)); 228 ClearPageReserved(virt_to_page(addr));
229 set_page_count(virt_to_page(addr), 1); 229 init_page_count(virt_to_page(addr));
230 free_page(addr); 230 free_page(addr);
231 totalram_pages++; 231 totalram_pages++;
232 } 232 }
@@ -244,7 +244,7 @@ void free_initrd_mem(unsigned long start, unsigned long end)
244 unsigned long p; 244 unsigned long p;
245 for (p = start; p < end; p += PAGE_SIZE) { 245 for (p = start; p < end; p += PAGE_SIZE) {
246 ClearPageReserved(virt_to_page(p)); 246 ClearPageReserved(virt_to_page(p));
247 set_page_count(virt_to_page(p), 1); 247 init_page_count(virt_to_page(p));
248 free_page(p); 248 free_page(p);
249 totalram_pages++; 249 totalram_pages++;
250 } 250 }
diff --git a/arch/m68k/mm/init.c b/arch/m68k/mm/init.c
index c45beb955943..a190e39c907a 100644
--- a/arch/m68k/mm/init.c
+++ b/arch/m68k/mm/init.c
@@ -137,7 +137,7 @@ void free_initrd_mem(unsigned long start, unsigned long end)
137 int pages = 0; 137 int pages = 0;
138 for (; start < end; start += PAGE_SIZE) { 138 for (; start < end; start += PAGE_SIZE) {
139 ClearPageReserved(virt_to_page(start)); 139 ClearPageReserved(virt_to_page(start));
140 set_page_count(virt_to_page(start), 1); 140 init_page_count(virt_to_page(start));
141 free_page(start); 141 free_page(start);
142 totalram_pages++; 142 totalram_pages++;
143 pages++; 143 pages++;
diff --git a/arch/m68k/mm/memory.c b/arch/m68k/mm/memory.c
index 559942ce0e1e..d6d582a5abb0 100644
--- a/arch/m68k/mm/memory.c
+++ b/arch/m68k/mm/memory.c
@@ -54,7 +54,7 @@ void __init init_pointer_table(unsigned long ptable)
54 54
55 /* unreserve the page so it's possible to free that page */ 55 /* unreserve the page so it's possible to free that page */
56 PD_PAGE(dp)->flags &= ~(1 << PG_reserved); 56 PD_PAGE(dp)->flags &= ~(1 << PG_reserved);
57 set_page_count(PD_PAGE(dp), 1); 57 init_page_count(PD_PAGE(dp));
58 58
59 return; 59 return;
60} 60}
diff --git a/arch/m68k/mm/motorola.c b/arch/m68k/mm/motorola.c
index d855fec26317..afb57eeafdcb 100644
--- a/arch/m68k/mm/motorola.c
+++ b/arch/m68k/mm/motorola.c
@@ -276,7 +276,7 @@ void free_initmem(void)
276 addr = (unsigned long)&__init_begin; 276 addr = (unsigned long)&__init_begin;
277 for (; addr < (unsigned long)&__init_end; addr += PAGE_SIZE) { 277 for (; addr < (unsigned long)&__init_end; addr += PAGE_SIZE) {
278 virt_to_page(addr)->flags &= ~(1 << PG_reserved); 278 virt_to_page(addr)->flags &= ~(1 << PG_reserved);
279 set_page_count(virt_to_page(addr), 1); 279 init_page_count(virt_to_page(addr));
280 free_page(addr); 280 free_page(addr);
281 totalram_pages++; 281 totalram_pages++;
282 } 282 }
diff --git a/arch/m68knommu/mm/init.c b/arch/m68knommu/mm/init.c
index 89f0b554ffb7..d79503fe6e42 100644
--- a/arch/m68knommu/mm/init.c
+++ b/arch/m68knommu/mm/init.c
@@ -195,7 +195,7 @@ void free_initrd_mem(unsigned long start, unsigned long end)
195 int pages = 0; 195 int pages = 0;
196 for (; start < end; start += PAGE_SIZE) { 196 for (; start < end; start += PAGE_SIZE) {
197 ClearPageReserved(virt_to_page(start)); 197 ClearPageReserved(virt_to_page(start));
198 set_page_count(virt_to_page(start), 1); 198 init_page_count(virt_to_page(start));
199 free_page(start); 199 free_page(start);
200 totalram_pages++; 200 totalram_pages++;
201 pages++; 201 pages++;
@@ -218,7 +218,7 @@ free_initmem()
218 /* next to check that the page we free is not a partial page */ 218 /* next to check that the page we free is not a partial page */
219 for (; addr + PAGE_SIZE < (unsigned long)(&__init_end); addr +=PAGE_SIZE) { 219 for (; addr + PAGE_SIZE < (unsigned long)(&__init_end); addr +=PAGE_SIZE) {
220 ClearPageReserved(virt_to_page(addr)); 220 ClearPageReserved(virt_to_page(addr));
221 set_page_count(virt_to_page(addr), 1); 221 init_page_count(virt_to_page(addr));
222 free_page(addr); 222 free_page(addr);
223 totalram_pages++; 223 totalram_pages++;
224 } 224 }
diff --git a/arch/mips/arc/memory.c b/arch/mips/arc/memory.c
index 958d2eb78862..8a9ef58cc399 100644
--- a/arch/mips/arc/memory.c
+++ b/arch/mips/arc/memory.c
@@ -158,7 +158,7 @@ unsigned long __init prom_free_prom_memory(void)
158 while (addr < boot_mem_map.map[i].addr 158 while (addr < boot_mem_map.map[i].addr
159 + boot_mem_map.map[i].size) { 159 + boot_mem_map.map[i].size) {
160 ClearPageReserved(virt_to_page(__va(addr))); 160 ClearPageReserved(virt_to_page(__va(addr)));
161 set_page_count(virt_to_page(__va(addr)), 1); 161 init_page_count(virt_to_page(__va(addr)));
162 free_page((unsigned long)__va(addr)); 162 free_page((unsigned long)__va(addr));
163 addr += PAGE_SIZE; 163 addr += PAGE_SIZE;
164 freed += PAGE_SIZE; 164 freed += PAGE_SIZE;
diff --git a/arch/mips/dec/prom/memory.c b/arch/mips/dec/prom/memory.c
index 81cb5a76cfb7..1edaf3074ee9 100644
--- a/arch/mips/dec/prom/memory.c
+++ b/arch/mips/dec/prom/memory.c
@@ -118,7 +118,7 @@ unsigned long __init prom_free_prom_memory(void)
118 addr = PAGE_SIZE; 118 addr = PAGE_SIZE;
119 while (addr < end) { 119 while (addr < end) {
120 ClearPageReserved(virt_to_page(__va(addr))); 120 ClearPageReserved(virt_to_page(__va(addr)));
121 set_page_count(virt_to_page(__va(addr)), 1); 121 init_page_count(virt_to_page(__va(addr)));
122 free_page((unsigned long)__va(addr)); 122 free_page((unsigned long)__va(addr));
123 addr += PAGE_SIZE; 123 addr += PAGE_SIZE;
124 } 124 }
diff --git a/arch/mips/mips-boards/generic/memory.c b/arch/mips/mips-boards/generic/memory.c
index 2c8afd77a20b..ee5e70c95cf3 100644
--- a/arch/mips/mips-boards/generic/memory.c
+++ b/arch/mips/mips-boards/generic/memory.c
@@ -174,7 +174,7 @@ unsigned long __init prom_free_prom_memory(void)
174 while (addr < boot_mem_map.map[i].addr 174 while (addr < boot_mem_map.map[i].addr
175 + boot_mem_map.map[i].size) { 175 + boot_mem_map.map[i].size) {
176 ClearPageReserved(virt_to_page(__va(addr))); 176 ClearPageReserved(virt_to_page(__va(addr)));
177 set_page_count(virt_to_page(__va(addr)), 1); 177 init_page_count(virt_to_page(__va(addr)));
178 free_page((unsigned long)__va(addr)); 178 free_page((unsigned long)__va(addr));
179 addr += PAGE_SIZE; 179 addr += PAGE_SIZE;
180 freed += PAGE_SIZE; 180 freed += PAGE_SIZE;
diff --git a/arch/mips/mips-boards/sim/sim_mem.c b/arch/mips/mips-boards/sim/sim_mem.c
index 0dbd7435bb2a..1ec4e75656bd 100644
--- a/arch/mips/mips-boards/sim/sim_mem.c
+++ b/arch/mips/mips-boards/sim/sim_mem.c
@@ -117,7 +117,7 @@ unsigned long __init prom_free_prom_memory(void)
117 while (addr < boot_mem_map.map[i].addr 117 while (addr < boot_mem_map.map[i].addr
118 + boot_mem_map.map[i].size) { 118 + boot_mem_map.map[i].size) {
119 ClearPageReserved(virt_to_page(__va(addr))); 119 ClearPageReserved(virt_to_page(__va(addr)));
120 set_page_count(virt_to_page(__va(addr)), 1); 120 init_page_count(virt_to_page(__va(addr)));
121 free_page((unsigned long)__va(addr)); 121 free_page((unsigned long)__va(addr));
122 addr += PAGE_SIZE; 122 addr += PAGE_SIZE;
123 freed += PAGE_SIZE; 123 freed += PAGE_SIZE;
diff --git a/arch/mips/mm/init.c b/arch/mips/mm/init.c
index a140da9732db..52f7d59fe612 100644
--- a/arch/mips/mm/init.c
+++ b/arch/mips/mm/init.c
@@ -245,7 +245,7 @@ void __init mem_init(void)
245#ifdef CONFIG_LIMITED_DMA 245#ifdef CONFIG_LIMITED_DMA
246 set_page_address(page, lowmem_page_address(page)); 246 set_page_address(page, lowmem_page_address(page));
247#endif 247#endif
248 set_page_count(page, 1); 248 init_page_count(page);
249 __free_page(page); 249 __free_page(page);
250 totalhigh_pages++; 250 totalhigh_pages++;
251 } 251 }
@@ -292,7 +292,7 @@ void free_initrd_mem(unsigned long start, unsigned long end)
292 292
293 for (; start < end; start += PAGE_SIZE) { 293 for (; start < end; start += PAGE_SIZE) {
294 ClearPageReserved(virt_to_page(start)); 294 ClearPageReserved(virt_to_page(start));
295 set_page_count(virt_to_page(start), 1); 295 init_page_count(virt_to_page(start));
296 free_page(start); 296 free_page(start);
297 totalram_pages++; 297 totalram_pages++;
298 } 298 }
@@ -315,7 +315,7 @@ void free_initmem(void)
315 page = addr; 315 page = addr;
316#endif 316#endif
317 ClearPageReserved(virt_to_page(page)); 317 ClearPageReserved(virt_to_page(page));
318 set_page_count(virt_to_page(page), 1); 318 init_page_count(virt_to_page(page));
319 free_page(page); 319 free_page(page);
320 totalram_pages++; 320 totalram_pages++;
321 freed += PAGE_SIZE; 321 freed += PAGE_SIZE;
diff --git a/arch/mips/sgi-ip27/ip27-memory.c b/arch/mips/sgi-ip27/ip27-memory.c
index ed93a9792959..e0d095daa5ed 100644
--- a/arch/mips/sgi-ip27/ip27-memory.c
+++ b/arch/mips/sgi-ip27/ip27-memory.c
@@ -559,7 +559,7 @@ void __init mem_init(void)
559 /* if (!page_is_ram(pgnr)) continue; */ 559 /* if (!page_is_ram(pgnr)) continue; */
560 /* commented out until page_is_ram works */ 560 /* commented out until page_is_ram works */
561 ClearPageReserved(p); 561 ClearPageReserved(p);
562 set_page_count(p, 1); 562 init_page_count(p);
563 __free_page(p); 563 __free_page(p);
564 totalram_pages++; 564 totalram_pages++;
565 } 565 }
diff --git a/arch/parisc/mm/init.c b/arch/parisc/mm/init.c
index 7847ca13d6c2..852eda3953dc 100644
--- a/arch/parisc/mm/init.c
+++ b/arch/parisc/mm/init.c
@@ -398,7 +398,7 @@ void free_initmem(void)
398 addr = (unsigned long)(&__init_begin); 398 addr = (unsigned long)(&__init_begin);
399 for (; addr < (unsigned long)(&__init_end); addr += PAGE_SIZE) { 399 for (; addr < (unsigned long)(&__init_end); addr += PAGE_SIZE) {
400 ClearPageReserved(virt_to_page(addr)); 400 ClearPageReserved(virt_to_page(addr));
401 set_page_count(virt_to_page(addr), 1); 401 init_page_count(virt_to_page(addr));
402 free_page(addr); 402 free_page(addr);
403 num_physpages++; 403 num_physpages++;
404 totalram_pages++; 404 totalram_pages++;
@@ -1018,7 +1018,7 @@ void free_initrd_mem(unsigned long start, unsigned long end)
1018 printk(KERN_INFO "Freeing initrd memory: %ldk freed\n", (end - start) >> 10); 1018 printk(KERN_INFO "Freeing initrd memory: %ldk freed\n", (end - start) >> 10);
1019 for (; start < end; start += PAGE_SIZE) { 1019 for (; start < end; start += PAGE_SIZE) {
1020 ClearPageReserved(virt_to_page(start)); 1020 ClearPageReserved(virt_to_page(start));
1021 set_page_count(virt_to_page(start), 1); 1021 init_page_count(virt_to_page(start));
1022 free_page(start); 1022 free_page(start);
1023 num_physpages++; 1023 num_physpages++;
1024 totalram_pages++; 1024 totalram_pages++;
diff --git a/arch/powerpc/mm/init_32.c b/arch/powerpc/mm/init_32.c
index 7d0d75c11848..b57fb3a2b7bb 100644
--- a/arch/powerpc/mm/init_32.c
+++ b/arch/powerpc/mm/init_32.c
@@ -216,7 +216,7 @@ static void free_sec(unsigned long start, unsigned long end, const char *name)
216 216
217 while (start < end) { 217 while (start < end) {
218 ClearPageReserved(virt_to_page(start)); 218 ClearPageReserved(virt_to_page(start));
219 set_page_count(virt_to_page(start), 1); 219 init_page_count(virt_to_page(start));
220 free_page(start); 220 free_page(start);
221 cnt++; 221 cnt++;
222 start += PAGE_SIZE; 222 start += PAGE_SIZE;
@@ -248,7 +248,7 @@ void free_initrd_mem(unsigned long start, unsigned long end)
248 printk ("Freeing initrd memory: %ldk freed\n", (end - start) >> 10); 248 printk ("Freeing initrd memory: %ldk freed\n", (end - start) >> 10);
249 for (; start < end; start += PAGE_SIZE) { 249 for (; start < end; start += PAGE_SIZE) {
250 ClearPageReserved(virt_to_page(start)); 250 ClearPageReserved(virt_to_page(start));
251 set_page_count(virt_to_page(start), 1); 251 init_page_count(virt_to_page(start));
252 free_page(start); 252 free_page(start);
253 totalram_pages++; 253 totalram_pages++;
254 } 254 }
diff --git a/arch/powerpc/mm/init_64.c b/arch/powerpc/mm/init_64.c
index 81cfb0c2ec58..bacb71c89811 100644
--- a/arch/powerpc/mm/init_64.c
+++ b/arch/powerpc/mm/init_64.c
@@ -140,7 +140,7 @@ void free_initmem(void)
140 for (; addr < (unsigned long)__init_end; addr += PAGE_SIZE) { 140 for (; addr < (unsigned long)__init_end; addr += PAGE_SIZE) {
141 memset((void *)addr, 0xcc, PAGE_SIZE); 141 memset((void *)addr, 0xcc, PAGE_SIZE);
142 ClearPageReserved(virt_to_page(addr)); 142 ClearPageReserved(virt_to_page(addr));
143 set_page_count(virt_to_page(addr), 1); 143 init_page_count(virt_to_page(addr));
144 free_page(addr); 144 free_page(addr);
145 totalram_pages++; 145 totalram_pages++;
146 } 146 }
@@ -155,7 +155,7 @@ void free_initrd_mem(unsigned long start, unsigned long end)
155 printk ("Freeing initrd memory: %ldk freed\n", (end - start) >> 10); 155 printk ("Freeing initrd memory: %ldk freed\n", (end - start) >> 10);
156 for (; start < end; start += PAGE_SIZE) { 156 for (; start < end; start += PAGE_SIZE) {
157 ClearPageReserved(virt_to_page(start)); 157 ClearPageReserved(virt_to_page(start));
158 set_page_count(virt_to_page(start), 1); 158 init_page_count(virt_to_page(start));
159 free_page(start); 159 free_page(start);
160 totalram_pages++; 160 totalram_pages++;
161 } 161 }
diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c
index 6ae5c130d0db..454cac01d8cc 100644
--- a/arch/powerpc/mm/mem.c
+++ b/arch/powerpc/mm/mem.c
@@ -108,7 +108,7 @@ EXPORT_SYMBOL(phys_mem_access_prot);
108void online_page(struct page *page) 108void online_page(struct page *page)
109{ 109{
110 ClearPageReserved(page); 110 ClearPageReserved(page);
111 set_page_count(page, 1); 111 init_page_count(page);
112 __free_page(page); 112 __free_page(page);
113 totalram_pages++; 113 totalram_pages++;
114 num_physpages++; 114 num_physpages++;
@@ -376,7 +376,7 @@ void __init mem_init(void)
376 struct page *page = pfn_to_page(pfn); 376 struct page *page = pfn_to_page(pfn);
377 377
378 ClearPageReserved(page); 378 ClearPageReserved(page);
379 set_page_count(page, 1); 379 init_page_count(page);
380 __free_page(page); 380 __free_page(page);
381 totalhigh_pages++; 381 totalhigh_pages++;
382 } 382 }
diff --git a/arch/powerpc/platforms/cell/setup.c b/arch/powerpc/platforms/cell/setup.c
index b33a4443f5a9..fec8e65b36ea 100644
--- a/arch/powerpc/platforms/cell/setup.c
+++ b/arch/powerpc/platforms/cell/setup.c
@@ -115,7 +115,7 @@ static void __init cell_spuprop_present(struct device_node *spe,
115 for (pfn = start_pfn; pfn < end_pfn; pfn++) { 115 for (pfn = start_pfn; pfn < end_pfn; pfn++) {
116 struct page *page = pfn_to_page(pfn); 116 struct page *page = pfn_to_page(pfn);
117 set_page_links(page, ZONE_DMA, node_id, pfn); 117 set_page_links(page, ZONE_DMA, node_id, pfn);
118 set_page_count(page, 1); 118 init_page_count(page);
119 reset_page_mapcount(page); 119 reset_page_mapcount(page);
120 SetPageReserved(page); 120 SetPageReserved(page);
121 INIT_LIST_HEAD(&page->lru); 121 INIT_LIST_HEAD(&page->lru);
diff --git a/arch/ppc/mm/init.c b/arch/ppc/mm/init.c
index 134db5c04203..cb1c294fb932 100644
--- a/arch/ppc/mm/init.c
+++ b/arch/ppc/mm/init.c
@@ -140,7 +140,7 @@ static void free_sec(unsigned long start, unsigned long end, const char *name)
140 140
141 while (start < end) { 141 while (start < end) {
142 ClearPageReserved(virt_to_page(start)); 142 ClearPageReserved(virt_to_page(start));
143 set_page_count(virt_to_page(start), 1); 143 init_page_count(virt_to_page(start));
144 free_page(start); 144 free_page(start);
145 cnt++; 145 cnt++;
146 start += PAGE_SIZE; 146 start += PAGE_SIZE;
@@ -172,7 +172,7 @@ void free_initrd_mem(unsigned long start, unsigned long end)
172 172
173 for (; start < end; start += PAGE_SIZE) { 173 for (; start < end; start += PAGE_SIZE) {
174 ClearPageReserved(virt_to_page(start)); 174 ClearPageReserved(virt_to_page(start));
175 set_page_count(virt_to_page(start), 1); 175 init_page_count(virt_to_page(start));
176 free_page(start); 176 free_page(start);
177 totalram_pages++; 177 totalram_pages++;
178 } 178 }
@@ -441,7 +441,7 @@ void __init mem_init(void)
441 struct page *page = mem_map + pfn; 441 struct page *page = mem_map + pfn;
442 442
443 ClearPageReserved(page); 443 ClearPageReserved(page);
444 set_page_count(page, 1); 444 init_page_count(page);
445 __free_page(page); 445 __free_page(page);
446 totalhigh_pages++; 446 totalhigh_pages++;
447 } 447 }
diff --git a/arch/s390/mm/init.c b/arch/s390/mm/init.c
index df953383724d..a055894f3bd8 100644
--- a/arch/s390/mm/init.c
+++ b/arch/s390/mm/init.c
@@ -292,7 +292,7 @@ void free_initmem(void)
292 addr = (unsigned long)(&__init_begin); 292 addr = (unsigned long)(&__init_begin);
293 for (; addr < (unsigned long)(&__init_end); addr += PAGE_SIZE) { 293 for (; addr < (unsigned long)(&__init_end); addr += PAGE_SIZE) {
294 ClearPageReserved(virt_to_page(addr)); 294 ClearPageReserved(virt_to_page(addr));
295 set_page_count(virt_to_page(addr), 1); 295 init_page_count(virt_to_page(addr));
296 free_page(addr); 296 free_page(addr);
297 totalram_pages++; 297 totalram_pages++;
298 } 298 }
@@ -307,7 +307,7 @@ void free_initrd_mem(unsigned long start, unsigned long end)
307 printk ("Freeing initrd memory: %ldk freed\n", (end - start) >> 10); 307 printk ("Freeing initrd memory: %ldk freed\n", (end - start) >> 10);
308 for (; start < end; start += PAGE_SIZE) { 308 for (; start < end; start += PAGE_SIZE) {
309 ClearPageReserved(virt_to_page(start)); 309 ClearPageReserved(virt_to_page(start));
310 set_page_count(virt_to_page(start), 1); 310 init_page_count(virt_to_page(start));
311 free_page(start); 311 free_page(start);
312 totalram_pages++; 312 totalram_pages++;
313 } 313 }
diff --git a/arch/sh/mm/init.c b/arch/sh/mm/init.c
index e342565f75fb..77b4a838fe10 100644
--- a/arch/sh/mm/init.c
+++ b/arch/sh/mm/init.c
@@ -273,7 +273,7 @@ void free_initmem(void)
273 addr = (unsigned long)(&__init_begin); 273 addr = (unsigned long)(&__init_begin);
274 for (; addr < (unsigned long)(&__init_end); addr += PAGE_SIZE) { 274 for (; addr < (unsigned long)(&__init_end); addr += PAGE_SIZE) {
275 ClearPageReserved(virt_to_page(addr)); 275 ClearPageReserved(virt_to_page(addr));
276 set_page_count(virt_to_page(addr), 1); 276 init_page_count(virt_to_page(addr));
277 free_page(addr); 277 free_page(addr);
278 totalram_pages++; 278 totalram_pages++;
279 } 279 }
@@ -286,7 +286,7 @@ void free_initrd_mem(unsigned long start, unsigned long end)
286 unsigned long p; 286 unsigned long p;
287 for (p = start; p < end; p += PAGE_SIZE) { 287 for (p = start; p < end; p += PAGE_SIZE) {
288 ClearPageReserved(virt_to_page(p)); 288 ClearPageReserved(virt_to_page(p));
289 set_page_count(virt_to_page(p), 1); 289 init_page_count(virt_to_page(p));
290 free_page(p); 290 free_page(p);
291 totalram_pages++; 291 totalram_pages++;
292 } 292 }
diff --git a/arch/sh64/mm/init.c b/arch/sh64/mm/init.c
index a65e8bb2c3cc..1169757fb38b 100644
--- a/arch/sh64/mm/init.c
+++ b/arch/sh64/mm/init.c
@@ -173,7 +173,7 @@ void free_initmem(void)
173 addr = (unsigned long)(&__init_begin); 173 addr = (unsigned long)(&__init_begin);
174 for (; addr < (unsigned long)(&__init_end); addr += PAGE_SIZE) { 174 for (; addr < (unsigned long)(&__init_end); addr += PAGE_SIZE) {
175 ClearPageReserved(virt_to_page(addr)); 175 ClearPageReserved(virt_to_page(addr));
176 set_page_count(virt_to_page(addr), 1); 176 init_page_count(virt_to_page(addr));
177 free_page(addr); 177 free_page(addr);
178 totalram_pages++; 178 totalram_pages++;
179 } 179 }
@@ -186,7 +186,7 @@ void free_initrd_mem(unsigned long start, unsigned long end)
186 unsigned long p; 186 unsigned long p;
187 for (p = start; p < end; p += PAGE_SIZE) { 187 for (p = start; p < end; p += PAGE_SIZE) {
188 ClearPageReserved(virt_to_page(p)); 188 ClearPageReserved(virt_to_page(p));
189 set_page_count(virt_to_page(p), 1); 189 init_page_count(virt_to_page(p));
190 free_page(p); 190 free_page(p);
191 totalram_pages++; 191 totalram_pages++;
192 } 192 }
diff --git a/arch/sparc/kernel/sun4d_smp.c b/arch/sparc/kernel/sun4d_smp.c
index 40d426cce824..4219dd2ce3a2 100644
--- a/arch/sparc/kernel/sun4d_smp.c
+++ b/arch/sparc/kernel/sun4d_smp.c
@@ -266,19 +266,19 @@ void __init smp4d_boot_cpus(void)
266 266
267 /* Free unneeded trap tables */ 267 /* Free unneeded trap tables */
268 ClearPageReserved(virt_to_page(trapbase_cpu1)); 268 ClearPageReserved(virt_to_page(trapbase_cpu1));
269 set_page_count(virt_to_page(trapbase_cpu1), 1); 269 init_page_count(virt_to_page(trapbase_cpu1));
270 free_page((unsigned long)trapbase_cpu1); 270 free_page((unsigned long)trapbase_cpu1);
271 totalram_pages++; 271 totalram_pages++;
272 num_physpages++; 272 num_physpages++;
273 273
274 ClearPageReserved(virt_to_page(trapbase_cpu2)); 274 ClearPageReserved(virt_to_page(trapbase_cpu2));
275 set_page_count(virt_to_page(trapbase_cpu2), 1); 275 init_page_count(virt_to_page(trapbase_cpu2));
276 free_page((unsigned long)trapbase_cpu2); 276 free_page((unsigned long)trapbase_cpu2);
277 totalram_pages++; 277 totalram_pages++;
278 num_physpages++; 278 num_physpages++;
279 279
280 ClearPageReserved(virt_to_page(trapbase_cpu3)); 280 ClearPageReserved(virt_to_page(trapbase_cpu3));
281 set_page_count(virt_to_page(trapbase_cpu3), 1); 281 init_page_count(virt_to_page(trapbase_cpu3));
282 free_page((unsigned long)trapbase_cpu3); 282 free_page((unsigned long)trapbase_cpu3);
283 totalram_pages++; 283 totalram_pages++;
284 num_physpages++; 284 num_physpages++;
diff --git a/arch/sparc/kernel/sun4m_smp.c b/arch/sparc/kernel/sun4m_smp.c
index a21f27d10e55..fbbd8a474c4c 100644
--- a/arch/sparc/kernel/sun4m_smp.c
+++ b/arch/sparc/kernel/sun4m_smp.c
@@ -233,21 +233,21 @@ void __init smp4m_boot_cpus(void)
233 /* Free unneeded trap tables */ 233 /* Free unneeded trap tables */
234 if (!cpu_isset(i, cpu_present_map)) { 234 if (!cpu_isset(i, cpu_present_map)) {
235 ClearPageReserved(virt_to_page(trapbase_cpu1)); 235 ClearPageReserved(virt_to_page(trapbase_cpu1));
236 set_page_count(virt_to_page(trapbase_cpu1), 1); 236 init_page_count(virt_to_page(trapbase_cpu1));
237 free_page((unsigned long)trapbase_cpu1); 237 free_page((unsigned long)trapbase_cpu1);
238 totalram_pages++; 238 totalram_pages++;
239 num_physpages++; 239 num_physpages++;
240 } 240 }
241 if (!cpu_isset(2, cpu_present_map)) { 241 if (!cpu_isset(2, cpu_present_map)) {
242 ClearPageReserved(virt_to_page(trapbase_cpu2)); 242 ClearPageReserved(virt_to_page(trapbase_cpu2));
243 set_page_count(virt_to_page(trapbase_cpu2), 1); 243 init_page_count(virt_to_page(trapbase_cpu2));
244 free_page((unsigned long)trapbase_cpu2); 244 free_page((unsigned long)trapbase_cpu2);
245 totalram_pages++; 245 totalram_pages++;
246 num_physpages++; 246 num_physpages++;
247 } 247 }
248 if (!cpu_isset(3, cpu_present_map)) { 248 if (!cpu_isset(3, cpu_present_map)) {
249 ClearPageReserved(virt_to_page(trapbase_cpu3)); 249 ClearPageReserved(virt_to_page(trapbase_cpu3));
250 set_page_count(virt_to_page(trapbase_cpu3), 1); 250 init_page_count(virt_to_page(trapbase_cpu3));
251 free_page((unsigned long)trapbase_cpu3); 251 free_page((unsigned long)trapbase_cpu3);
252 totalram_pages++; 252 totalram_pages++;
253 num_physpages++; 253 num_physpages++;
diff --git a/arch/sparc/mm/init.c b/arch/sparc/mm/init.c
index c03babaa0498..898669732466 100644
--- a/arch/sparc/mm/init.c
+++ b/arch/sparc/mm/init.c
@@ -383,7 +383,7 @@ void map_high_region(unsigned long start_pfn, unsigned long end_pfn)
383 struct page *page = pfn_to_page(tmp); 383 struct page *page = pfn_to_page(tmp);
384 384
385 ClearPageReserved(page); 385 ClearPageReserved(page);
386 set_page_count(page, 1); 386 init_page_count(page);
387 __free_page(page); 387 __free_page(page);
388 totalhigh_pages++; 388 totalhigh_pages++;
389 } 389 }
@@ -480,7 +480,7 @@ void free_initmem (void)
480 p = virt_to_page(addr); 480 p = virt_to_page(addr);
481 481
482 ClearPageReserved(p); 482 ClearPageReserved(p);
483 set_page_count(p, 1); 483 init_page_count(p);
484 __free_page(p); 484 __free_page(p);
485 totalram_pages++; 485 totalram_pages++;
486 num_physpages++; 486 num_physpages++;
@@ -497,7 +497,7 @@ void free_initrd_mem(unsigned long start, unsigned long end)
497 struct page *p = virt_to_page(start); 497 struct page *p = virt_to_page(start);
498 498
499 ClearPageReserved(p); 499 ClearPageReserved(p);
500 set_page_count(p, 1); 500 init_page_count(p);
501 __free_page(p); 501 __free_page(p);
502 num_physpages++; 502 num_physpages++;
503 } 503 }
diff --git a/arch/sparc64/mm/init.c b/arch/sparc64/mm/init.c
index c2b556106fc1..2ae143ba50d8 100644
--- a/arch/sparc64/mm/init.c
+++ b/arch/sparc64/mm/init.c
@@ -1461,7 +1461,7 @@ void free_initmem(void)
1461 p = virt_to_page(page); 1461 p = virt_to_page(page);
1462 1462
1463 ClearPageReserved(p); 1463 ClearPageReserved(p);
1464 set_page_count(p, 1); 1464 init_page_count(p);
1465 __free_page(p); 1465 __free_page(p);
1466 num_physpages++; 1466 num_physpages++;
1467 totalram_pages++; 1467 totalram_pages++;
@@ -1477,7 +1477,7 @@ void free_initrd_mem(unsigned long start, unsigned long end)
1477 struct page *p = virt_to_page(start); 1477 struct page *p = virt_to_page(start);
1478 1478
1479 ClearPageReserved(p); 1479 ClearPageReserved(p);
1480 set_page_count(p, 1); 1480 init_page_count(p);
1481 __free_page(p); 1481 __free_page(p);
1482 num_physpages++; 1482 num_physpages++;
1483 totalram_pages++; 1483 totalram_pages++;
diff --git a/arch/um/kernel/mem.c b/arch/um/kernel/mem.c
index fa4f915be5c5..92cce96b5e24 100644
--- a/arch/um/kernel/mem.c
+++ b/arch/um/kernel/mem.c
@@ -57,7 +57,7 @@ static void setup_highmem(unsigned long highmem_start,
57 for(i = 0; i < highmem_len >> PAGE_SHIFT; i++){ 57 for(i = 0; i < highmem_len >> PAGE_SHIFT; i++){
58 page = &mem_map[highmem_pfn + i]; 58 page = &mem_map[highmem_pfn + i];
59 ClearPageReserved(page); 59 ClearPageReserved(page);
60 set_page_count(page, 1); 60 init_page_count(page);
61 __free_page(page); 61 __free_page(page);
62 } 62 }
63} 63}
@@ -296,7 +296,7 @@ void free_initrd_mem(unsigned long start, unsigned long end)
296 (end - start) >> 10); 296 (end - start) >> 10);
297 for (; start < end; start += PAGE_SIZE) { 297 for (; start < end; start += PAGE_SIZE) {
298 ClearPageReserved(virt_to_page(start)); 298 ClearPageReserved(virt_to_page(start));
299 set_page_count(virt_to_page(start), 1); 299 init_page_count(virt_to_page(start));
300 free_page(start); 300 free_page(start);
301 totalram_pages++; 301 totalram_pages++;
302 } 302 }
diff --git a/arch/x86_64/mm/init.c b/arch/x86_64/mm/init.c
index 7af1742aa958..40ed13d263cd 100644
--- a/arch/x86_64/mm/init.c
+++ b/arch/x86_64/mm/init.c
@@ -486,7 +486,7 @@ void __init clear_kernel_mapping(unsigned long address, unsigned long size)
486void online_page(struct page *page) 486void online_page(struct page *page)
487{ 487{
488 ClearPageReserved(page); 488 ClearPageReserved(page);
489 set_page_count(page, 1); 489 init_page_count(page);
490 __free_page(page); 490 __free_page(page);
491 totalram_pages++; 491 totalram_pages++;
492 num_physpages++; 492 num_physpages++;
@@ -592,7 +592,7 @@ void free_initmem(void)
592 addr = (unsigned long)(&__init_begin); 592 addr = (unsigned long)(&__init_begin);
593 for (; addr < (unsigned long)(&__init_end); addr += PAGE_SIZE) { 593 for (; addr < (unsigned long)(&__init_end); addr += PAGE_SIZE) {
594 ClearPageReserved(virt_to_page(addr)); 594 ClearPageReserved(virt_to_page(addr));
595 set_page_count(virt_to_page(addr), 1); 595 init_page_count(virt_to_page(addr));
596 memset((void *)(addr & ~(PAGE_SIZE-1)), 0xcc, PAGE_SIZE); 596 memset((void *)(addr & ~(PAGE_SIZE-1)), 0xcc, PAGE_SIZE);
597 free_page(addr); 597 free_page(addr);
598 totalram_pages++; 598 totalram_pages++;
@@ -632,7 +632,7 @@ void free_initrd_mem(unsigned long start, unsigned long end)
632 printk ("Freeing initrd memory: %ldk freed\n", (end - start) >> 10); 632 printk ("Freeing initrd memory: %ldk freed\n", (end - start) >> 10);
633 for (; start < end; start += PAGE_SIZE) { 633 for (; start < end; start += PAGE_SIZE) {
634 ClearPageReserved(virt_to_page(start)); 634 ClearPageReserved(virt_to_page(start));
635 set_page_count(virt_to_page(start), 1); 635 init_page_count(virt_to_page(start));
636 free_page(start); 636 free_page(start);
637 totalram_pages++; 637 totalram_pages++;
638 } 638 }
diff --git a/arch/xtensa/mm/init.c b/arch/xtensa/mm/init.c
index 5a91d6c9e66d..e1be4235f367 100644
--- a/arch/xtensa/mm/init.c
+++ b/arch/xtensa/mm/init.c
@@ -272,7 +272,7 @@ free_reserved_mem(void *start, void *end)
272{ 272{
273 for (; start < end; start += PAGE_SIZE) { 273 for (; start < end; start += PAGE_SIZE) {
274 ClearPageReserved(virt_to_page(start)); 274 ClearPageReserved(virt_to_page(start));
275 set_page_count(virt_to_page(start), 1); 275 init_page_count(virt_to_page(start));
276 free_page((unsigned long)start); 276 free_page((unsigned long)start);
277 totalram_pages++; 277 totalram_pages++;
278 } 278 }
diff --git a/drivers/video/acornfb.c b/drivers/video/acornfb.c
index b058273527bb..76448d6ae896 100644
--- a/drivers/video/acornfb.c
+++ b/drivers/video/acornfb.c
@@ -1269,7 +1269,7 @@ free_unused_pages(unsigned int virtual_start, unsigned int virtual_end)
1269 */ 1269 */
1270 page = virt_to_page(virtual_start); 1270 page = virt_to_page(virtual_start);
1271 ClearPageReserved(page); 1271 ClearPageReserved(page);
1272 set_page_count(page, 1); 1272 init_page_count(page);
1273 free_page(virtual_start); 1273 free_page(virtual_start);
1274 1274
1275 virtual_start += PAGE_SIZE; 1275 virtual_start += PAGE_SIZE;
diff --git a/include/linux/mm.h b/include/linux/mm.h
index 3d84b7a35e0d..7d8c127daad7 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -307,8 +307,6 @@ static inline int get_page_unless_zero(struct page *page)
307 return atomic_inc_not_zero(&page->_count); 307 return atomic_inc_not_zero(&page->_count);
308} 308}
309 309
310#define set_page_count(p,v) atomic_set(&(p)->_count, (v))
311
312extern void FASTCALL(__page_cache_release(struct page *)); 310extern void FASTCALL(__page_cache_release(struct page *));
313 311
314static inline int page_count(struct page *page) 312static inline int page_count(struct page *page)
@@ -325,6 +323,15 @@ static inline void get_page(struct page *page)
325 atomic_inc(&page->_count); 323 atomic_inc(&page->_count);
326} 324}
327 325
326/*
327 * Setup the page count before being freed into the page allocator for
328 * the first time (boot or memory hotplug)
329 */
330static inline void init_page_count(struct page *page)
331{
332 atomic_set(&page->_count, 1);
333}
334
328void put_page(struct page *page); 335void put_page(struct page *page);
329 336
330void split_page(struct page *page, unsigned int order); 337void split_page(struct page *page, unsigned int order);
diff --git a/mm/hugetlb.c b/mm/hugetlb.c
index 39d49ecea8e8..20117a4b8ab6 100644
--- a/mm/hugetlb.c
+++ b/mm/hugetlb.c
@@ -18,6 +18,7 @@
18#include <asm/pgtable.h> 18#include <asm/pgtable.h>
19 19
20#include <linux/hugetlb.h> 20#include <linux/hugetlb.h>
21#include "internal.h"
21 22
22const unsigned long hugetlb_zero = 0, hugetlb_infinity = ~0UL; 23const unsigned long hugetlb_zero = 0, hugetlb_infinity = ~0UL;
23static unsigned long nr_huge_pages, free_huge_pages; 24static unsigned long nr_huge_pages, free_huge_pages;
@@ -106,7 +107,7 @@ struct page *alloc_huge_page(struct vm_area_struct *vma, unsigned long addr)
106 return NULL; 107 return NULL;
107 } 108 }
108 spin_unlock(&hugetlb_lock); 109 spin_unlock(&hugetlb_lock);
109 set_page_count(page, 1); 110 set_page_refcounted(page);
110 for (i = 0; i < (HPAGE_SIZE/PAGE_SIZE); ++i) 111 for (i = 0; i < (HPAGE_SIZE/PAGE_SIZE); ++i)
111 clear_user_highpage(&page[i], addr); 112 clear_user_highpage(&page[i], addr);
112 return page; 113 return page;
@@ -152,7 +153,7 @@ static void update_and_free_page(struct page *page)
152 1 << PG_private | 1<< PG_writeback); 153 1 << PG_private | 1<< PG_writeback);
153 } 154 }
154 page[1].lru.next = NULL; 155 page[1].lru.next = NULL;
155 set_page_count(page, 1); 156 set_page_refcounted(page);
156 __free_pages(page, HUGETLB_PAGE_ORDER); 157 __free_pages(page, HUGETLB_PAGE_ORDER);
157} 158}
158 159
diff --git a/mm/internal.h b/mm/internal.h
index 7bb339779818..d20e3cc4aef0 100644
--- a/mm/internal.h
+++ b/mm/internal.h
@@ -13,8 +13,19 @@
13 13
14#include <linux/mm.h> 14#include <linux/mm.h>
15 15
16static inline void set_page_refs(struct page *page, int order) 16static inline void set_page_count(struct page *page, int v)
17{ 17{
18 atomic_set(&page->_count, v);
19}
20
21/*
22 * Turn a non-refcounted page (->_count == 0) into refcounted with
23 * a count of one.
24 */
25static inline void set_page_refcounted(struct page *page)
26{
27 BUG_ON(PageCompound(page) && page_private(page) != (unsigned long)page);
28 BUG_ON(atomic_read(&page->_count));
18 set_page_count(page, 1); 29 set_page_count(page, 1);
19} 30}
20 31
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index e197818a7cf6..7f65b5a63bb3 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -442,7 +442,7 @@ void fastcall __init __free_pages_bootmem(struct page *page, unsigned int order)
442 if (order == 0) { 442 if (order == 0) {
443 __ClearPageReserved(page); 443 __ClearPageReserved(page);
444 set_page_count(page, 0); 444 set_page_count(page, 0);
445 set_page_refs(page, 0); 445 set_page_refcounted(page);
446 __free_page(page); 446 __free_page(page);
447 } else { 447 } else {
448 int loop; 448 int loop;
@@ -457,7 +457,7 @@ void fastcall __init __free_pages_bootmem(struct page *page, unsigned int order)
457 set_page_count(p, 0); 457 set_page_count(p, 0);
458 } 458 }
459 459
460 set_page_refs(page, order); 460 set_page_refcounted(page);
461 __free_pages(page, order); 461 __free_pages(page, order);
462 } 462 }
463} 463}
@@ -525,7 +525,7 @@ static int prep_new_page(struct page *page, int order)
525 1 << PG_referenced | 1 << PG_arch_1 | 525 1 << PG_referenced | 1 << PG_arch_1 |
526 1 << PG_checked | 1 << PG_mappedtodisk); 526 1 << PG_checked | 1 << PG_mappedtodisk);
527 set_page_private(page, 0); 527 set_page_private(page, 0);
528 set_page_refs(page, order); 528 set_page_refcounted(page);
529 kernel_map_pages(page, 1 << order, 1); 529 kernel_map_pages(page, 1 << order, 1);
530 return 0; 530 return 0;
531} 531}
@@ -755,10 +755,8 @@ void split_page(struct page *page, unsigned int order)
755 755
756 BUG_ON(PageCompound(page)); 756 BUG_ON(PageCompound(page));
757 BUG_ON(!page_count(page)); 757 BUG_ON(!page_count(page));
758 for (i = 1; i < (1 << order); i++) { 758 for (i = 1; i < (1 << order); i++)
759 BUG_ON(page_count(page + i)); 759 set_page_refcounted(page + i);
760 set_page_count(page + i, 1);
761 }
762} 760}
763 761
764/* 762/*
@@ -1771,7 +1769,7 @@ void __meminit memmap_init_zone(unsigned long size, int nid, unsigned long zone,
1771 continue; 1769 continue;
1772 page = pfn_to_page(pfn); 1770 page = pfn_to_page(pfn);
1773 set_page_links(page, zone, nid, pfn); 1771 set_page_links(page, zone, nid, pfn);
1774 set_page_count(page, 1); 1772 init_page_count(page);
1775 reset_page_mapcount(page); 1773 reset_page_mapcount(page);
1776 SetPageReserved(page); 1774 SetPageReserved(page);
1777 INIT_LIST_HEAD(&page->lru); 1775 INIT_LIST_HEAD(&page->lru);