diff options
Diffstat (limited to 'mm/page_isolation.c')
| -rw-r--r-- | mm/page_isolation.c | 12 | 
1 files changed, 6 insertions, 6 deletions
| diff --git a/mm/page_isolation.c b/mm/page_isolation.c index abbf42214485..bddf788f45bf 100644 --- a/mm/page_isolation.c +++ b/mm/page_isolation.c @@ -49,7 +49,6 @@ static int set_migratetype_isolate(struct page *page, int migratetype, int isol_  		__mod_zone_freepage_state(zone, -nr_pages, mt);  		spin_unlock_irqrestore(&zone->lock, flags); -		drain_all_pages(zone);  		return 0;  	} @@ -89,7 +88,7 @@ static void unset_migratetype_isolate(struct page *page, unsigned migratetype)  	 */  	if (PageBuddy(page)) {  		order = buddy_order(page); -		if (order >= pageblock_order) { +		if (order >= pageblock_order && order < MAX_ORDER - 1) {  			pfn = page_to_pfn(page);  			buddy_pfn = __find_buddy_pfn(pfn, order);  			buddy = page + (buddy_pfn - pfn); @@ -172,11 +171,12 @@ __first_valid_page(unsigned long pfn, unsigned long nr_pages)   *   * Please note that there is no strong synchronization with the page allocator   * either. Pages might be freed while their page blocks are marked ISOLATED. - * In some cases pages might still end up on pcp lists and that would allow + * A call to drain_all_pages() after isolation can flush most of them. However + * in some cases pages might still end up on pcp lists and that would allow   * for their allocation even when they are in fact isolated already. Depending - * on how strong of a guarantee the caller needs drain_all_pages might be needed - * (e.g. __offline_pages will need to call it after check for isolated range for - * a next retry). + * on how strong of a guarantee the caller needs, zone_pcp_disable/enable() + * might be used to flush and disable pcplist before isolation and enable after + * unisolation.   *   * Return: 0 on success and -EBUSY if any part of range cannot be isolated.   */ | 
