mm, vmscan: Update all zone LRU sizes before updating memcg
[deliverable/linux.git] / include / linux / mm_inline.h
CommitLineData
b2e18538
RR
1#ifndef LINUX_MM_INLINE_H
2#define LINUX_MM_INLINE_H
3
2c888cfb 4#include <linux/huge_mm.h>
6e543d57 5#include <linux/swap.h>
2c888cfb 6
bca67592
MG
7#ifdef CONFIG_HIGHMEM
8extern atomic_t highmem_file_pages;
9
10static inline void acct_highmem_file_pages(int zid, enum lru_list lru,
11 int nr_pages)
12{
13 if (is_highmem_idx(zid) && is_file_lru(lru))
14 atomic_add(nr_pages, &highmem_file_pages);
15}
16#else
17static inline void acct_highmem_file_pages(int zid, enum lru_list lru,
18 int nr_pages)
19{
20}
21#endif
22
b2e18538
RR
23/**
24 * page_is_file_cache - should the page be on a file LRU or anon LRU?
25 * @page: the page to test
26 *
6c0b1351 27 * Returns 1 if @page is page cache page backed by a regular filesystem,
b2e18538
RR
28 * or 0 if @page is anonymous, tmpfs or otherwise ram or swap backed.
29 * Used by functions that manipulate the LRU lists, to sort a page
30 * onto the right LRU list.
31 *
32 * We would like to get this info without a page flag, but the state
33 * needs to survive until the page is last deleted from the LRU, which
34 * could be as far down as __page_cache_release.
35 */
36static inline int page_is_file_cache(struct page *page)
37{
6c0b1351 38 return !PageSwapBacked(page);
b2e18538
RR
39}
40
9d5e6a9f 41static __always_inline void __update_lru_size(struct lruvec *lruvec,
599d0c95
MG
42 enum lru_list lru, enum zone_type zid,
43 int nr_pages)
9d5e6a9f 44{
599d0c95
MG
45 struct pglist_data *pgdat = lruvec_pgdat(lruvec);
46
47 __mod_node_page_state(pgdat, NR_LRU_BASE + lru, nr_pages);
bca67592 48 acct_highmem_file_pages(zid, lru, nr_pages);
9d5e6a9f
HD
49}
50
51static __always_inline void update_lru_size(struct lruvec *lruvec,
599d0c95
MG
52 enum lru_list lru, enum zone_type zid,
53 int nr_pages)
9d5e6a9f 54{
599d0c95 55 __update_lru_size(lruvec, lru, zid, nr_pages);
7ee36a14
MG
56#ifdef CONFIG_MEMCG
57 mem_cgroup_update_lru_size(lruvec, lru, nr_pages);
9d5e6a9f
HD
58#endif
59}
60
fa9add64
HD
61static __always_inline void add_page_to_lru_list(struct page *page,
62 struct lruvec *lruvec, enum lru_list lru)
71e3aac0 63{
599d0c95 64 update_lru_size(lruvec, lru, page_zonenum(page), hpage_nr_pages(page));
4111304d 65 list_add(&page->lru, &lruvec->lists[lru]);
71e3aac0
AA
66}
67
fa9add64
HD
68static __always_inline void del_page_from_lru_list(struct page *page,
69 struct lruvec *lruvec, enum lru_list lru)
b69408e8
CL
70{
71 list_del(&page->lru);
599d0c95 72 update_lru_size(lruvec, lru, page_zonenum(page), -hpage_nr_pages(page));
b69408e8
CL
73}
74
401a8e1c
JW
75/**
76 * page_lru_base_type - which LRU list type should a page be on?
77 * @page: the page to test
78 *
79 * Used for LRU list index arithmetic.
80 *
81 * Returns the base LRU type - file or anon - @page should be on.
82 */
83static inline enum lru_list page_lru_base_type(struct page *page)
84{
85 if (page_is_file_cache(page))
86 return LRU_INACTIVE_FILE;
87 return LRU_INACTIVE_ANON;
88}
89
1c1c53d4
HD
90/**
91 * page_off_lru - which LRU list was page on? clearing its lru flags.
92 * @page: the page to test
93 *
94 * Returns the LRU list a page was on, as an index into the array of LRU
95 * lists; and clears its Unevictable or Active flags, ready for freeing.
96 */
014483bc 97static __always_inline enum lru_list page_off_lru(struct page *page)
1da177e4 98{
4111304d 99 enum lru_list lru;
b69408e8 100
894bc310
LS
101 if (PageUnevictable(page)) {
102 __ClearPageUnevictable(page);
4111304d 103 lru = LRU_UNEVICTABLE;
894bc310 104 } else {
4111304d 105 lru = page_lru_base_type(page);
894bc310
LS
106 if (PageActive(page)) {
107 __ClearPageActive(page);
4111304d 108 lru += LRU_ACTIVE;
894bc310 109 }
1da177e4 110 }
1c1c53d4 111 return lru;
1da177e4 112}
21eac81f 113
b69408e8
CL
114/**
115 * page_lru - which LRU list should a page be on?
116 * @page: the page to test
117 *
118 * Returns the LRU list a page should be on, as an index
119 * into the array of LRU lists.
120 */
014483bc 121static __always_inline enum lru_list page_lru(struct page *page)
b69408e8 122{
401a8e1c 123 enum lru_list lru;
b69408e8 124
894bc310
LS
125 if (PageUnevictable(page))
126 lru = LRU_UNEVICTABLE;
127 else {
401a8e1c 128 lru = page_lru_base_type(page);
894bc310
LS
129 if (PageActive(page))
130 lru += LRU_ACTIVE;
894bc310 131 }
b69408e8
CL
132 return lru;
133}
b2e18538 134
d72ee911
GT
135#define lru_to_page(head) (list_entry((head)->prev, struct page, lru))
136
b2e18538 137#endif
This page took 1.262684 seconds and 5 git commands to generate.