diff options
Diffstat (limited to 'mm/swap.c')
| -rw-r--r-- | mm/swap.c | 11 | 
1 files changed, 8 insertions, 3 deletions
diff --git a/mm/swap.c b/mm/swap.c index 8a529a01e8f..acd40bfffa8 100644 --- a/mm/swap.c +++ b/mm/swap.c @@ -737,7 +737,7 @@ EXPORT_SYMBOL(__pagevec_release);  #ifdef CONFIG_TRANSPARENT_HUGEPAGE  /* used by __split_huge_page_refcount() */  void lru_add_page_tail(struct page *page, struct page *page_tail, -		       struct lruvec *lruvec) +		       struct lruvec *lruvec, struct list_head *list)  {  	int uninitialized_var(active);  	enum lru_list lru; @@ -749,7 +749,8 @@ void lru_add_page_tail(struct page *page, struct page *page_tail,  	VM_BUG_ON(NR_CPUS != 1 &&  		  !spin_is_locked(&lruvec_zone(lruvec)->lru_lock)); -	SetPageLRU(page_tail); +	if (!list) +		SetPageLRU(page_tail);  	if (page_evictable(page_tail)) {  		if (PageActive(page)) { @@ -767,7 +768,11 @@ void lru_add_page_tail(struct page *page, struct page *page_tail,  	if (likely(PageLRU(page)))  		list_add_tail(&page_tail->lru, &page->lru); -	else { +	else if (list) { +		/* page reclaim is reclaiming a huge page */ +		get_page(page_tail); +		list_add_tail(&page_tail->lru, list); +	} else {  		struct list_head *list_head;  		/*  		 * Head page has not yet been counted, as an hpage,  |