diff options
author | Kumar Gala <galak@kernel.crashing.org> | 2006-03-20 17:53:56 +0100 |
---|---|---|
committer | Kumar Gala <galak@kernel.crashing.org> | 2006-03-20 17:53:56 +0100 |
commit | 61c5504a0ed66c8b460f9a006eedaea2ee587e33 (patch) | |
tree | 2cf21d235f17e80d47fdb4ee1248865be8196d4d /mm/vmscan.c | |
parent | Merge branch 'master' of git+ssh://galak@master.kernel.org/pub/scm/linux/kern... (diff) | |
parent | [PATCH] powerpc: Fix bug in bug fix for bug in lmb_alloc() (diff) | |
download | linux-61c5504a0ed66c8b460f9a006eedaea2ee587e33.tar.xz linux-61c5504a0ed66c8b460f9a006eedaea2ee587e33.zip |
Merge branch 'master'
Diffstat (limited to 'mm/vmscan.c')
-rw-r--r-- | mm/vmscan.c | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/mm/vmscan.c b/mm/vmscan.c index b0af7593d01e..4fe7e3aa02e2 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -700,7 +700,7 @@ int migrate_page_remove_references(struct page *newpage, * the page. */ if (!mapping || page_mapcount(page) + nr_refs != page_count(page)) - return 1; + return -EAGAIN; /* * Establish swap ptes for anonymous pages or destroy pte @@ -721,13 +721,15 @@ int migrate_page_remove_references(struct page *newpage, * If the page was not migrated then the PageSwapCache bit * is still set and the operation may continue. */ - try_to_unmap(page, 1); + if (try_to_unmap(page, 1) == SWAP_FAIL) + /* A vma has VM_LOCKED set -> Permanent failure */ + return -EPERM; /* * Give up if we were unable to remove all mappings. */ if (page_mapcount(page)) - return 1; + return -EAGAIN; write_lock_irq(&mapping->tree_lock); @@ -738,7 +740,7 @@ int migrate_page_remove_references(struct page *newpage, if (!page_mapping(page) || page_count(page) != nr_refs || *radix_pointer != page) { write_unlock_irq(&mapping->tree_lock); - return 1; + return -EAGAIN; } /* @@ -813,10 +815,14 @@ EXPORT_SYMBOL(migrate_page_copy); */ int migrate_page(struct page *newpage, struct page *page) { + int rc; + BUG_ON(PageWriteback(page)); /* Writeback must be complete */ - if (migrate_page_remove_references(newpage, page, 2)) - return -EAGAIN; + rc = migrate_page_remove_references(newpage, page, 2); + + if (rc) + return rc; migrate_page_copy(newpage, page); @@ -1883,7 +1889,8 @@ int zone_reclaim(struct zone *zone, gfp_t gfp_mask, unsigned int order) if (!(gfp_mask & __GFP_WAIT) || zone->all_unreclaimable || - atomic_read(&zone->reclaim_in_progress) > 0) + atomic_read(&zone->reclaim_in_progress) > 0 || + (p->flags & PF_MEMALLOC)) return 0; node_id = zone->zone_pgdat->node_id; |