Branch data Line data Source code
1 : : #ifndef LINUX_MM_INLINE_H
2 : : #define LINUX_MM_INLINE_H
3 : :
4 : : #include <linux/huge_mm.h>
5 : : #include <linux/swap.h>
6 : :
7 : : /**
8 : : * page_is_file_cache - should the page be on a file LRU or anon LRU?
9 : : * @page: the page to test
10 : : *
11 : : * Returns 1 if @page is page cache page backed by a regular filesystem,
12 : : * or 0 if @page is anonymous, tmpfs or otherwise ram or swap backed.
13 : : * Used by functions that manipulate the LRU lists, to sort a page
14 : : * onto the right LRU list.
15 : : *
16 : : * We would like to get this info without a page flag, but the state
17 : : * needs to survive until the page is last deleted from the LRU, which
18 : : * could be as far down as __page_cache_release.
19 : : */
20 : : static inline int page_is_file_cache(struct page *page)
21 : : {
22 : 26431412 : return !PageSwapBacked(page);
23 : : }
24 : :
25 : : static __always_inline void add_page_to_lru_list(struct page *page,
26 : : struct lruvec *lruvec, enum lru_list lru)
27 : : {
28 : : int nr_pages = hpage_nr_pages(page);
29 : : mem_cgroup_update_lru_size(lruvec, lru, nr_pages);
30 : 26467505 : list_add(&page->lru, &lruvec->lists[lru]);
31 : 26475008 : __mod_zone_page_state(lruvec_zone(lruvec), NR_LRU_BASE + lru, nr_pages);
32 : : }
33 : :
34 : : static __always_inline void del_page_from_lru_list(struct page *page,
35 : : struct lruvec *lruvec, enum lru_list lru)
36 : : {
37 : : int nr_pages = hpage_nr_pages(page);
38 : : mem_cgroup_update_lru_size(lruvec, lru, -nr_pages);
39 : : list_del(&page->lru);
40 : 26279402 : __mod_zone_page_state(lruvec_zone(lruvec), NR_LRU_BASE + lru, -nr_pages);
41 : : }
42 : :
43 : : /**
44 : : * page_lru_base_type - which LRU list type should a page be on?
45 : : * @page: the page to test
46 : : *
47 : : * Used for LRU list index arithmetic.
48 : : *
49 : : * Returns the base LRU type - file or anon - @page should be on.
50 : : */
51 : : static inline enum lru_list page_lru_base_type(struct page *page)
52 : : {
53 [ + + ][ + + ]: 51795338 : if (page_is_file_cache(page))
[ + + ][ + + ]
[ - + ][ + + ]
54 : : return LRU_INACTIVE_FILE;
55 : : return LRU_INACTIVE_ANON;
56 : : }
57 : :
58 : : /**
59 : : * page_off_lru - which LRU list was page on? clearing its lru flags.
60 : : * @page: the page to test
61 : : *
62 : : * Returns the LRU list a page was on, as an index into the array of LRU
63 : : * lists; and clears its Unevictable or Active flags, ready for freeing.
64 : : */
65 : : static __always_inline enum lru_list page_off_lru(struct page *page)
66 : : {
67 : : enum lru_list lru;
68 : :
69 [ - + - + ]: 25325816 : if (PageUnevictable(page)) {
70 : : __ClearPageUnevictable(page);
71 : : lru = LRU_UNEVICTABLE;
72 : : } else {
73 : : lru = page_lru_base_type(page);
74 [ + + ][ + + ]: 25325816 : if (PageActive(page)) {
75 : : __ClearPageActive(page);
76 : 24886412 : lru += LRU_ACTIVE;
77 : : }
78 : : }
79 : : return lru;
80 : : }
81 : :
82 : : /**
83 : : * page_lru - which LRU list should a page be on?
84 : : * @page: the page to test
85 : : *
86 : : * Returns the LRU list a page should be on, as an index
87 : : * into the array of LRU lists.
88 : : */
89 : : static __always_inline enum lru_list page_lru(struct page *page)
90 : : {
91 : : enum lru_list lru;
92 : :
93 [ + - ]: 25538905 : if (PageUnevictable(page))
[ + + + + ]
94 : : lru = LRU_UNEVICTABLE;
95 : : else {
96 : : lru = page_lru_base_type(page);
97 [ + + ][ + + ]: 25528865 : if (PageActive(page))
98 : 24045562 : lru += LRU_ACTIVE;
99 : : }
100 : : return lru;
101 : : }
102 : :
103 : : #endif
|