diff options
| author | Nick Piggin <npiggin@suse.de> | 2006-10-11 04:21:30 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-10-11 14:14:19 -0400 |
| commit | dafb13673c463bc2aade4a4819704dde0f5fa37f (patch) | |
| tree | 4944daaa4ca8e9d988e4357ae902fda6ea531d28 /mm | |
| parent | 699397499742d1245ea5d677a08fa265df666d2d (diff) | |
[PATCH] mm: arch_free_page fix
After the PG_reserved check was added, arch_free_page was being called in the
wrong place (it could be called for a page we don't actually want to free).
Fix that.
Signed-off-by: Nick Piggin <npiggin@suse.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'mm')
| -rw-r--r-- | mm/page_alloc.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 8246e834b2f0..c5caac2c3c5a 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
| @@ -495,7 +495,6 @@ static void __free_pages_ok(struct page *page, unsigned int order) | |||
| 495 | int i; | 495 | int i; |
| 496 | int reserved = 0; | 496 | int reserved = 0; |
| 497 | 497 | ||
| 498 | arch_free_page(page, order); | ||
| 499 | if (!PageHighMem(page)) | 498 | if (!PageHighMem(page)) |
| 500 | debug_check_no_locks_freed(page_address(page), | 499 | debug_check_no_locks_freed(page_address(page), |
| 501 | PAGE_SIZE<<order); | 500 | PAGE_SIZE<<order); |
| @@ -505,7 +504,9 @@ static void __free_pages_ok(struct page *page, unsigned int order) | |||
| 505 | if (reserved) | 504 | if (reserved) |
| 506 | return; | 505 | return; |
| 507 | 506 | ||
| 507 | arch_free_page(page, order); | ||
| 508 | kernel_map_pages(page, 1 << order, 0); | 508 | kernel_map_pages(page, 1 << order, 0); |
| 509 | |||
| 509 | local_irq_save(flags); | 510 | local_irq_save(flags); |
| 510 | __count_vm_events(PGFREE, 1 << order); | 511 | __count_vm_events(PGFREE, 1 << order); |
| 511 | free_one_page(page_zone(page), page, order); | 512 | free_one_page(page_zone(page), page, order); |
| @@ -781,13 +782,12 @@ static void fastcall free_hot_cold_page(struct page *page, int cold) | |||
| 781 | struct per_cpu_pages *pcp; | 782 | struct per_cpu_pages *pcp; |
| 782 | unsigned long flags; | 783 | unsigned long flags; |
| 783 | 784 | ||
| 784 | arch_free_page(page, 0); | ||
| 785 | |||
| 786 | if (PageAnon(page)) | 785 | if (PageAnon(page)) |
| 787 | page->mapping = NULL; | 786 | page->mapping = NULL; |
| 788 | if (free_pages_check(page)) | 787 | if (free_pages_check(page)) |
| 789 | return; | 788 | return; |
| 790 | 789 | ||
| 790 | arch_free_page(page, 0); | ||
| 791 | kernel_map_pages(page, 1, 0); | 791 | kernel_map_pages(page, 1, 0); |
| 792 | 792 | ||
| 793 | pcp = &zone_pcp(zone, get_cpu())->pcp[cold]; | 793 | pcp = &zone_pcp(zone, get_cpu())->pcp[cold]; |
