[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:
parent
92be2e33b1
commit
13e7444b0e
2 changed files with 21 additions and 8 deletions
|
@ -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.
|
||||||
|
|
||||||
|
|
|
@ -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++;
|
||||||
|
|
Loading…
Reference in a new issue