diff options
Diffstat (limited to 'mm/swap.c')
-rw-r--r-- | mm/swap.c | 37 |
1 files changed, 37 insertions, 0 deletions
@@ -479,6 +479,43 @@ void __pagevec_release(struct pagevec *pvec) | |||
479 | 479 | ||
480 | EXPORT_SYMBOL(__pagevec_release); | 480 | EXPORT_SYMBOL(__pagevec_release); |
481 | 481 | ||
482 | /* used by __split_huge_page_refcount() */ | ||
483 | void lru_add_page_tail(struct zone* zone, | ||
484 | struct page *page, struct page *page_tail) | ||
485 | { | ||
486 | int active; | ||
487 | enum lru_list lru; | ||
488 | const int file = 0; | ||
489 | struct list_head *head; | ||
490 | |||
491 | VM_BUG_ON(!PageHead(page)); | ||
492 | VM_BUG_ON(PageCompound(page_tail)); | ||
493 | VM_BUG_ON(PageLRU(page_tail)); | ||
494 | VM_BUG_ON(!spin_is_locked(&zone->lru_lock)); | ||
495 | |||
496 | SetPageLRU(page_tail); | ||
497 | |||
498 | if (page_evictable(page_tail, NULL)) { | ||
499 | if (PageActive(page)) { | ||
500 | SetPageActive(page_tail); | ||
501 | active = 1; | ||
502 | lru = LRU_ACTIVE_ANON; | ||
503 | } else { | ||
504 | active = 0; | ||
505 | lru = LRU_INACTIVE_ANON; | ||
506 | } | ||
507 | update_page_reclaim_stat(zone, page_tail, file, active); | ||
508 | if (likely(PageLRU(page))) | ||
509 | head = page->lru.prev; | ||
510 | else | ||
511 | head = &zone->lru[lru].list; | ||
512 | __add_page_to_lru_list(zone, page_tail, lru, head); | ||
513 | } else { | ||
514 | SetPageUnevictable(page_tail); | ||
515 | add_page_to_lru_list(zone, page_tail, LRU_UNEVICTABLE); | ||
516 | } | ||
517 | } | ||
518 | |||
482 | /* | 519 | /* |
483 | * Add the passed pages to the LRU, then drop the caller's refcount | 520 | * Add the passed pages to the LRU, then drop the caller's refcount |
484 | * on them. Reinitialises the caller's pagevec. | 521 | * on them. Reinitialises the caller's pagevec. |