diff options
author | Johannes Weiner <hannes@cmpxchg.org> | 2009-09-21 20:02:58 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-09-22 10:17:35 -0400 |
commit | 401a8e1c1670085b8177330ca47d4f7c4ac88761 (patch) | |
tree | 5883daaed42fa2a186e5769bab1c10535dc39a41 /include/linux/mm_inline.h | |
parent | b7c46d151cb82856a429709d1227ba1648028232 (diff) |
mm: introduce page_lru_base_type()
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>
Diffstat (limited to 'include/linux/mm_inline.h')
-rw-r--r-- | include/linux/mm_inline.h | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/include/linux/mm_inline.h b/include/linux/mm_inline.h index 7fbb97267556..99977ff45b83 100644 --- a/include/linux/mm_inline.h +++ b/include/linux/mm_inline.h | |||
@@ -39,21 +39,36 @@ del_page_from_lru_list(struct zone *zone, struct page *page, enum lru_list l) | |||
39 | mem_cgroup_del_lru_list(page, l); | 39 | mem_cgroup_del_lru_list(page, l); |
40 | } | 40 | } |
41 | 41 | ||
42 | /** | ||
43 | * page_lru_base_type - which LRU list type should a page be on? | ||
44 | * @page: the page to test | ||
45 | * | ||
46 | * Used for LRU list index arithmetic. | ||
47 | * | ||
48 | * Returns the base LRU type - file or anon - @page should be on. | ||
49 | */ | ||
50 | static inline enum lru_list page_lru_base_type(struct page *page) | ||
51 | { | ||
52 | if (page_is_file_cache(page)) | ||
53 | return LRU_INACTIVE_FILE; | ||
54 | return LRU_INACTIVE_ANON; | ||
55 | } | ||
56 | |||
42 | static inline void | 57 | static inline void |
43 | del_page_from_lru(struct zone *zone, struct page *page) | 58 | del_page_from_lru(struct zone *zone, struct page *page) |
44 | { | 59 | { |
45 | enum lru_list l = LRU_BASE; | 60 | enum lru_list l; |
46 | 61 | ||
47 | list_del(&page->lru); | 62 | list_del(&page->lru); |
48 | if (PageUnevictable(page)) { | 63 | if (PageUnevictable(page)) { |
49 | __ClearPageUnevictable(page); | 64 | __ClearPageUnevictable(page); |
50 | l = LRU_UNEVICTABLE; | 65 | l = LRU_UNEVICTABLE; |
51 | } else { | 66 | } else { |
67 | l = page_lru_base_type(page); | ||
52 | if (PageActive(page)) { | 68 | if (PageActive(page)) { |
53 | __ClearPageActive(page); | 69 | __ClearPageActive(page); |
54 | l += LRU_ACTIVE; | 70 | l += LRU_ACTIVE; |
55 | } | 71 | } |
56 | l += page_is_file_cache(page); | ||
57 | } | 72 | } |
58 | __dec_zone_state(zone, NR_LRU_BASE + l); | 73 | __dec_zone_state(zone, NR_LRU_BASE + l); |
59 | mem_cgroup_del_lru_list(page, l); | 74 | mem_cgroup_del_lru_list(page, l); |
@@ -68,14 +83,14 @@ del_page_from_lru(struct zone *zone, struct page *page) | |||
68 | */ | 83 | */ |
69 | static inline enum lru_list page_lru(struct page *page) | 84 | static inline enum lru_list page_lru(struct page *page) |
70 | { | 85 | { |
71 | enum lru_list lru = LRU_BASE; | 86 | enum lru_list lru; |
72 | 87 | ||
73 | if (PageUnevictable(page)) | 88 | if (PageUnevictable(page)) |
74 | lru = LRU_UNEVICTABLE; | 89 | lru = LRU_UNEVICTABLE; |
75 | else { | 90 | else { |
91 | lru = page_lru_base_type(page); | ||
76 | if (PageActive(page)) | 92 | if (PageActive(page)) |
77 | lru += LRU_ACTIVE; | 93 | lru += LRU_ACTIVE; |
78 | lru += page_is_file_cache(page); | ||
79 | } | 94 | } |
80 | 95 | ||
81 | return lru; | 96 | return lru; |