Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 16318
b: refs/heads/master
c: 13e7444
h: refs/heads/master
v: v3
  • Loading branch information
Nick Piggin authored and Linus Torvalds committed Jan 6, 2006
1 parent 3e2e2d6 commit 7edeba7
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 9 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 92be2e33b155ee76399f51f41fb061f850d02f08
refs/heads/master: 13e7444b0ec59f96d81a4e8c379d5f38fc5f2cc1
3 changes: 2 additions & 1 deletion trunk/lib/Kconfig.debug
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,8 @@ config DEBUG_VM
bool "Debug VM"
depends on DEBUG_KERNEL
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.

Expand Down
26 changes: 19 additions & 7 deletions trunk/mm/page_alloc.c
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ int min_free_kbytes = 1024;
unsigned long __initdata nr_kernel_pages;
unsigned long __initdata nr_all_pages;

#ifdef CONFIG_DEBUG_VM
static int page_outside_zone_boundaries(struct zone *zone, struct page *page)
{
int ret = 0;
Expand Down Expand Up @@ -122,6 +123,13 @@ static int bad_range(struct zone *zone, struct page *page)
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)
{
printk(KERN_EMERG "Bad page state at %s (in process '%s', page %p)\n",
Expand Down Expand Up @@ -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
* we can do coalesce a page and its buddy if
* (a) the buddy is free &&
* (b) the buddy is on the buddy system &&
* (c) a page and its buddy have the same order.
* (a) the buddy is not in a hole &&
* (b) the buddy is free &&
* (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.
*
*/
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) &&
(page_order(page) == order) &&
page_count(page) == 0)
Expand Down Expand Up @@ -314,17 +328,15 @@ static inline void __free_pages_bulk (struct page *page,
struct free_area *area;
struct page *buddy;

combined_idx = __find_combined_index(page_idx, order);
buddy = __page_find_buddy(page, page_idx, order);

if (bad_range(zone, buddy))
break;
if (!page_is_buddy(buddy, order))
break; /* Move the buddy up one level. */

list_del(&buddy->lru);
area = zone->free_area + order;
area->nr_free--;
rmv_page_order(buddy);
combined_idx = __find_combined_index(page_idx, order);
page = page + (combined_idx - page_idx);
page_idx = combined_idx;
order++;
Expand Down

0 comments on commit 7edeba7

Please sign in to comment.