diff options
| author | Steve French <sfrench@us.ibm.com> | 2006-03-20 16:58:09 +0000 | 
|---|---|---|
| committer | Steve French <sfrench@us.ibm.com> | 2006-03-20 16:58:09 +0000 | 
| commit | fd4a0b92db6a57cba8d03efbe1cebf91f9124ce0 (patch) | |
| tree | 5886a08bfa1132058b06074f4666a36dc5ddd2a1 /mm/vmscan.c | |
| parent | 88274815f7477dc7550439413ab87c5ce4c5a623 (diff) | |
| parent | 7705a8792b0fc82fd7d4dd923724606bbfd9fb20 (diff) | |
Merge with /pub/scm/linux/kernel/git/torvalds/linux-2.6.git
Signed-off-by: Steve French <sfrench@us.ibm.com>
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 b0af7593d01..4fe7e3aa02e 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; | 
