mm: introduce page_lru_base_type()
authorJohannes Weiner <hannes@cmpxchg.org>
Tue, 22 Sep 2009 00:02:58 +0000 (17:02 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 22 Sep 2009 14:17:35 +0000 (07:17 -0700)
Instead of abusing page_is_file_cache() for LRU list index arithmetic, add
another helper with a more appropriate name and convert the non-boolean
users of page_is_file_cache() accordingly.

This new helper gives the LRU base type a page is supposed to live on,
inactive anon or inactive file.

[hugh.dickins@tiscali.co.uk: convert del_page_from_lru() also]
Signed-off-by: Johannes Weiner <hannes@cmpxchg.org>
Reviewed-by: Rik van Riel <riel@redhat.com>
Cc: Minchan Kim <minchan.kim@gmail.com>
Reviewed-by: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
include/linux/mm_inline.h
mm/swap.c
mm/vmscan.c

index 7fbb97267556531b0f13a112a5afc7e134234189..99977ff45b83721eeb6de7fe0c6f7098be93f0d7 100644 (file)
@@ -39,21 +39,36 @@ del_page_from_lru_list(struct zone *zone, struct page *page, enum lru_list l)
        mem_cgroup_del_lru_list(page, l);
 }
 
+/**
+ * page_lru_base_type - which LRU list type should a page be on?
+ * @page: the page to test
+ *
+ * Used for LRU list index arithmetic.
+ *
+ * Returns the base LRU type - file or anon - @page should be on.
+ */
+static inline enum lru_list page_lru_base_type(struct page *page)
+{
+       if (page_is_file_cache(page))
+               return LRU_INACTIVE_FILE;
+       return LRU_INACTIVE_ANON;
+}
+
 static inline void
 del_page_from_lru(struct zone *zone, struct page *page)
 {
-       enum lru_list l = LRU_BASE;
+       enum lru_list l;
 
        list_del(&page->lru);
        if (PageUnevictable(page)) {
                __ClearPageUnevictable(page);
                l = LRU_UNEVICTABLE;
        } else {
+               l = page_lru_base_type(page);
                if (PageActive(page)) {
                        __ClearPageActive(page);
                        l += LRU_ACTIVE;
                }
-               l += page_is_file_cache(page);
        }
        __dec_zone_state(zone, NR_LRU_BASE + l);
        mem_cgroup_del_lru_list(page, l);
@@ -68,14 +83,14 @@ del_page_from_lru(struct zone *zone, struct page *page)
  */
 static inline enum lru_list page_lru(struct page *page)
 {
-       enum lru_list lru = LRU_BASE;
+       enum lru_list lru;
 
        if (PageUnevictable(page))
                lru = LRU_UNEVICTABLE;
        else {
+               lru = page_lru_base_type(page);
                if (PageActive(page))
                        lru += LRU_ACTIVE;
-               lru += page_is_file_cache(page);
        }
 
        return lru;
index cb29ae5d33abfce703991cbfebd7bc1956752942..168d53e6e58e6c9605fd678079da426258c8e799 100644 (file)
--- a/mm/swap.c
+++ b/mm/swap.c
@@ -118,7 +118,7 @@ static void pagevec_move_tail(struct pagevec *pvec)
                        spin_lock(&zone->lru_lock);
                }
                if (PageLRU(page) && !PageActive(page) && !PageUnevictable(page)) {
-                       int lru = page_is_file_cache(page);
+                       int lru = page_lru_base_type(page);
                        list_move_tail(&page->lru, &zone->lru[lru].list);
                        pgmoved++;
                }
@@ -181,7 +181,7 @@ void activate_page(struct page *page)
        spin_lock_irq(&zone->lru_lock);
        if (PageLRU(page) && !PageActive(page) && !PageUnevictable(page)) {
                int file = page_is_file_cache(page);
-               int lru = LRU_BASE + file;
+               int lru = page_lru_base_type(page);
                del_page_from_lru_list(zone, page, lru);
 
                SetPageActive(page);
index cad5d528a6f05eef0d751961f85098495bdd2934..30e56ee833f8104526a33d63b51026496b209ce7 100644 (file)
@@ -531,7 +531,7 @@ redo:
                 * unevictable page on [in]active list.
                 * We know how to handle that.
                 */
-               lru = active + page_is_file_cache(page);
+               lru = active + page_lru_base_type(page);
                lru_cache_add_lru(page, lru);
        } else {
                /*
@@ -986,7 +986,7 @@ static unsigned long clear_active_flags(struct list_head *page_list,
        struct page *page;
 
        list_for_each_entry(page, page_list, lru) {
-               lru = page_is_file_cache(page);
+               lru = page_lru_base_type(page);
                if (PageActive(page)) {
                        lru += LRU_ACTIVE;
                        ClearPageActive(page);
@@ -2652,7 +2652,7 @@ static void check_move_unevictable_page(struct page *page, struct zone *zone)
 retry:
        ClearPageUnevictable(page);
        if (page_evictable(page, NULL)) {
-               enum lru_list l = LRU_INACTIVE_ANON + page_is_file_cache(page);
+               enum lru_list l = page_lru_base_type(page);
 
                __dec_zone_state(zone, NR_UNEVICTABLE);
                list_move(&page->lru, &zone->lru[l].list);