[PATCH] mm: remove bad_range

bad_range is supposed to be a temporary check.  It would be a pity to throw it
out.  Make it depend on CONFIG_DEBUG_VM instead.

CONFIG_HOLES_IN_ZONE systems were relying on this to check pfn_valid in the
page allocator.  Add that to page_is_buddy instead.

Signed-off-by: Nick Piggin <npiggin@suse.de>
Cc: Hugh Dickins <hugh@veritas.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
Nick Piggin 2006-01-06 00:10:58 -08:00 committed by Linus Torvalds
parent 92be2e33b1
commit 13e7444b0e
2 changed files with 21 additions and 8 deletions

View File

@ -172,7 +172,8 @@ config DEBUG_VM
bool "Debug VM" bool "Debug VM"
depends on DEBUG_KERNEL depends on DEBUG_KERNEL
help help
Enable this to debug the virtual-memory system. Enable this to turn on extended checks in the virtual-memory system
that may impact performance.
If unsure, say N. If unsure, say N.

View File

@ -81,6 +81,7 @@ int min_free_kbytes = 1024;
unsigned long __initdata nr_kernel_pages; unsigned long __initdata nr_kernel_pages;
unsigned long __initdata nr_all_pages; unsigned long __initdata nr_all_pages;
#ifdef CONFIG_DEBUG_VM
static int page_outside_zone_boundaries(struct zone *zone, struct page *page) static int page_outside_zone_boundaries(struct zone *zone, struct page *page)
{ {
int ret = 0; int ret = 0;
@ -122,6 +123,13 @@ 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)
{
return 0;
}
#endif
static void bad_page(const char *function, struct page *page) static void bad_page(const char *function, struct page *page)
{ {
printk(KERN_EMERG "Bad page state at %s (in process '%s', page %p)\n", printk(KERN_EMERG "Bad page state at %s (in process '%s', page %p)\n",
@ -255,14 +263,20 @@ __find_combined_index(unsigned long page_idx, unsigned int order)
/* /*
* This function checks whether a page is free && is the buddy * This function checks whether a page is free && is the buddy
* we can do coalesce a page and its buddy if * we can do coalesce a page and its buddy if
* (a) the buddy is free && * (a) the buddy is not in a hole &&
* (b) the buddy is on the buddy system && * (b) the buddy is free &&
* (c) a page and its buddy have the same order. * (c) the buddy is on the buddy system &&
* (d) a page and its buddy have the same order.
* for recording page's order, we use page_private(page) and PG_private. * for recording page's order, we use page_private(page) and PG_private.
* *
*/ */
static inline int page_is_buddy(struct page *page, int order) static inline int page_is_buddy(struct page *page, int order)
{ {
#ifdef CONFIG_HOLES_IN_ZONE
if (!pfn_valid(page_to_pfn(page)))
return 0;
#endif
if (PagePrivate(page) && if (PagePrivate(page) &&
(page_order(page) == order) && (page_order(page) == order) &&
page_count(page) == 0) page_count(page) == 0)
@ -314,17 +328,15 @@ static inline void __free_pages_bulk (struct page *page,
struct free_area *area; struct free_area *area;
struct page *buddy; struct page *buddy;
combined_idx = __find_combined_index(page_idx, order);
buddy = __page_find_buddy(page, page_idx, order); buddy = __page_find_buddy(page, page_idx, order);
if (bad_range(zone, buddy))
break;
if (!page_is_buddy(buddy, order)) if (!page_is_buddy(buddy, order))
break; /* Move the buddy up one level. */ break; /* Move the buddy up one level. */
list_del(&buddy->lru); list_del(&buddy->lru);
area = zone->free_area + order; area = zone->free_area + order;
area->nr_free--; area->nr_free--;
rmv_page_order(buddy); rmv_page_order(buddy);
combined_idx = __find_combined_index(page_idx, order);
page = page + (combined_idx - page_idx); page = page + (combined_idx - page_idx);
page_idx = combined_idx; page_idx = combined_idx;
order++; order++;