git://ftp.safe.ca
/
safe
/
jmp
/
linux-2.6
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
[PATCH] reduce MAX_NR_ZONES: page allocator ZONE_HIGHMEM cleanup
[safe/jmp/linux-2.6]
/
mm
/
page_alloc.c
diff --git
a/mm/page_alloc.c
b/mm/page_alloc.c
index
3b5358a
..
13c102b
100644
(file)
--- a/
mm/page_alloc.c
+++ b/
mm/page_alloc.c
@@
-51,7
+51,6
@@
EXPORT_SYMBOL(node_online_map);
nodemask_t node_possible_map __read_mostly = NODE_MASK_ALL;
EXPORT_SYMBOL(node_possible_map);
unsigned long totalram_pages __read_mostly;
nodemask_t node_possible_map __read_mostly = NODE_MASK_ALL;
EXPORT_SYMBOL(node_possible_map);
unsigned long totalram_pages __read_mostly;
-unsigned long totalhigh_pages __read_mostly;
unsigned long totalreserve_pages __read_mostly;
long nr_swap_pages;
int percpu_pagelist_fraction;
unsigned long totalreserve_pages __read_mostly;
long nr_swap_pages;
int percpu_pagelist_fraction;
@@
-127,7
+126,6
@@
static int bad_range(struct zone *zone, struct page *page)
return 0;
}
return 0;
}
-
#else
static inline int bad_range(struct zone *zone, struct page *page)
{
#else
static inline int bad_range(struct zone *zone, struct page *page)
{
@@
-218,12
+216,12
@@
static inline void prep_zero_page(struct page *page, int order, gfp_t gfp_flags)
{
int i;
{
int i;
- BUG_ON((gfp_flags & (__GFP_WAIT | __GFP_HIGHMEM)) == __GFP_HIGHMEM);
+
VM_
BUG_ON((gfp_flags & (__GFP_WAIT | __GFP_HIGHMEM)) == __GFP_HIGHMEM);
/*
* clear_highpage() will use KM_USER0, so it's a bug to use __GFP_ZERO
* and __GFP_HIGHMEM from hard or soft interrupt context.
*/
/*
* clear_highpage() will use KM_USER0, so it's a bug to use __GFP_ZERO
* and __GFP_HIGHMEM from hard or soft interrupt context.
*/
- BUG_ON((gfp_flags & __GFP_HIGHMEM) && in_interrupt());
+
VM_
BUG_ON((gfp_flags & __GFP_HIGHMEM) && in_interrupt());
for (i = 0; i < (1 << order); i++)
clear_highpage(page + i);
}
for (i = 0; i < (1 << order); i++)
clear_highpage(page + i);
}
@@
-347,8
+345,8
@@
static inline void __free_one_page(struct page *page,
page_idx = page_to_pfn(page) & ((1 << MAX_ORDER) - 1);
page_idx = page_to_pfn(page) & ((1 << MAX_ORDER) - 1);
- BUG_ON(page_idx & (order_size - 1));
- BUG_ON(bad_range(zone, page));
+
VM_
BUG_ON(page_idx & (order_size - 1));
+
VM_
BUG_ON(bad_range(zone, page));
zone->free_pages += order_size;
while (order < MAX_ORDER-1) {
zone->free_pages += order_size;
while (order < MAX_ORDER-1) {
@@
-421,7
+419,7
@@
static void free_pages_bulk(struct zone *zone, int count,
while (count--) {
struct page *page;
while (count--) {
struct page *page;
- BUG_ON(list_empty(list));
+
VM_
BUG_ON(list_empty(list));
page = list_entry(list->prev, struct page, lru);
/* have to delete it as __free_one_page list manipulates */
list_del(&page->lru);
page = list_entry(list->prev, struct page, lru);
/* have to delete it as __free_one_page list manipulates */
list_del(&page->lru);
@@
-512,7
+510,7
@@
static inline void expand(struct zone *zone, struct page *page,
area--;
high--;
size >>= 1;
area--;
high--;
size >>= 1;
- BUG_ON(bad_range(zone, &page[size]));
+
VM_
BUG_ON(bad_range(zone, &page[size]));
list_add(&page[size].lru, &area->free_list);
area->nr_free++;
set_page_order(&page[size], high);
list_add(&page[size].lru, &area->free_list);
area->nr_free++;
set_page_order(&page[size], high);
@@
-761,8
+759,8
@@
void split_page(struct page *page, unsigned int order)
{
int i;
{
int i;
- BUG_ON(PageCompound(page));
- BUG_ON(!page_count(page));
+
VM_
BUG_ON(PageCompound(page));
+
VM_
BUG_ON(!page_count(page));
for (i = 1; i < (1 << order); i++)
set_page_refcounted(page + i);
}
for (i = 1; i < (1 << order); i++)
set_page_refcounted(page + i);
}
@@
-809,7
+807,7
@@
again:
local_irq_restore(flags);
put_cpu();
local_irq_restore(flags);
put_cpu();
- BUG_ON(bad_range(zone, page));
+
VM_
BUG_ON(bad_range(zone, page));
if (prep_new_page(page, order, gfp_flags))
goto again;
return page;
if (prep_new_page(page, order, gfp_flags))
goto again;
return page;
@@
-1083,7
+1081,7
@@
fastcall unsigned long get_zeroed_page(gfp_t gfp_mask)
* get_zeroed_page() returns a 32-bit address, which cannot represent
* a highmem page
*/
* get_zeroed_page() returns a 32-bit address, which cannot represent
* a highmem page
*/
- BUG_ON((gfp_mask & __GFP_HIGHMEM) != 0);
+
VM_
BUG_ON((gfp_mask & __GFP_HIGHMEM) != 0);
page = alloc_pages(gfp_mask | __GFP_ZERO, 0);
if (page)
page = alloc_pages(gfp_mask | __GFP_ZERO, 0);
if (page)
@@
-1116,7
+1114,7
@@
EXPORT_SYMBOL(__free_pages);
fastcall void free_pages(unsigned long addr, unsigned int order)
{
if (addr != 0) {
fastcall void free_pages(unsigned long addr, unsigned int order)
{
if (addr != 0) {
- BUG_ON(!virt_addr_valid((void *)addr));
+
VM_
BUG_ON(!virt_addr_valid((void *)addr));
__free_pages(virt_to_page((void *)addr), order);
}
}
__free_pages(virt_to_page((void *)addr), order);
}
}
@@
-1186,20
+1184,6
@@
unsigned int nr_free_pagecache_pages(void)
{
return nr_free_zone_pages(gfp_zone(GFP_HIGHUSER));
}
{
return nr_free_zone_pages(gfp_zone(GFP_HIGHUSER));
}
-
-#ifdef CONFIG_HIGHMEM
-unsigned int nr_free_highpages (void)
-{
- pg_data_t *pgdat;
- unsigned int pages = 0;
-
- for_each_online_pgdat(pgdat)
- pages += pgdat->node_zones[ZONE_HIGHMEM].free_pages;
-
- return pages;
-}
-#endif
-
#ifdef CONFIG_NUMA
static void show_node(struct zone *zone)
{
#ifdef CONFIG_NUMA
static void show_node(struct zone *zone)
{
@@
-1215,13
+1199,8
@@
void si_meminfo(struct sysinfo *val)
val->sharedram = 0;
val->freeram = nr_free_pages();
val->bufferram = nr_blockdev_pages();
val->sharedram = 0;
val->freeram = nr_free_pages();
val->bufferram = nr_blockdev_pages();
-#ifdef CONFIG_HIGHMEM
val->totalhigh = totalhigh_pages;
val->freehigh = nr_free_highpages();
val->totalhigh = totalhigh_pages;
val->freehigh = nr_free_highpages();
-#else
- val->totalhigh = 0;
- val->freehigh = 0;
-#endif
val->mem_unit = PAGE_SIZE;
}
val->mem_unit = PAGE_SIZE;
}
@@
-1234,8
+1213,13
@@
void si_meminfo_node(struct sysinfo *val, int nid)
val->totalram = pgdat->node_present_pages;
val->freeram = nr_free_pages_pgdat(pgdat);
val->totalram = pgdat->node_present_pages;
val->freeram = nr_free_pages_pgdat(pgdat);
+#ifdef CONFIG_HIGHMEM
val->totalhigh = pgdat->node_zones[ZONE_HIGHMEM].present_pages;
val->freehigh = pgdat->node_zones[ZONE_HIGHMEM].free_pages;
val->totalhigh = pgdat->node_zones[ZONE_HIGHMEM].present_pages;
val->freehigh = pgdat->node_zones[ZONE_HIGHMEM].free_pages;
+#else
+ val->totalhigh = 0;
+ val->freehigh = 0;
+#endif
val->mem_unit = PAGE_SIZE;
}
#endif
val->mem_unit = PAGE_SIZE;
}
#endif
@@
-1282,10
+1266,6
@@
void show_free_areas(void)
get_zone_counts(&active, &inactive, &free);
get_zone_counts(&active, &inactive, &free);
- printk("Free pages: %11ukB (%ukB HighMem)\n",
- K(nr_free_pages()),
- K(nr_free_highpages()));
-
printk("Active:%lu inactive:%lu dirty:%lu writeback:%lu "
"unstable:%lu free:%u slab:%lu mapped:%lu pagetables:%lu\n",
active,
printk("Active:%lu inactive:%lu dirty:%lu writeback:%lu "
"unstable:%lu free:%u slab:%lu mapped:%lu pagetables:%lu\n",
active,
@@
-1364,14
+1344,11
@@
static int __meminit build_zonelists_node(pg_data_t *pgdat,
{
struct zone *zone;
{
struct zone *zone;
- BUG_ON(zone_type >
ZONE_HIGHMEM
);
+ BUG_ON(zone_type >
= MAX_NR_ZONES
);
do {
zone = pgdat->node_zones + zone_type;
if (populated_zone(zone)) {
do {
zone = pgdat->node_zones + zone_type;
if (populated_zone(zone)) {
-#ifndef CONFIG_HIGHMEM
- BUG_ON(zone_type > ZONE_NORMAL);
-#endif
zonelist->zones[nr_zones++] = zone;
check_highest_zone(zone_type);
}
zonelist->zones[nr_zones++] = zone;
check_highest_zone(zone_type);
}
@@
-1845,8
+1822,10
@@
static inline void free_zone_pagesets(int cpu)
for_each_zone(zone) {
struct per_cpu_pageset *pset = zone_pcp(zone, cpu);
for_each_zone(zone) {
struct per_cpu_pageset *pset = zone_pcp(zone, cpu);
+ /* Free per_cpu_pageset if it is slab allocated */
+ if (pset != &boot_pageset[cpu])
+ kfree(pset);
zone_pcp(zone, cpu) = NULL;
zone_pcp(zone, cpu) = NULL;
- kfree(pset);
}
}
}
}
@@
-1999,7
+1978,7
@@
static void __meminit free_area_init_core(struct pglist_data *pgdat,
if (zholes_size)
realsize -= zholes_size[j];
if (zholes_size)
realsize -= zholes_size[j];
- if (
j < ZONE_HIGHMEM
)
+ if (
!is_highmem_idx(j)
)
nr_kernel_pages += realsize;
nr_all_pages += realsize;
nr_kernel_pages += realsize;
nr_all_pages += realsize;