• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef LINUX_MM_INLINE_H
2 #define LINUX_MM_INLINE_H
3 
4 /**
5  * page_is_file_cache - should the page be on a file LRU or anon LRU?
6  * @page: the page to test
7  *
8  * Returns LRU_FILE if @page is page cache page backed by a regular filesystem,
9  * or 0 if @page is anonymous, tmpfs or otherwise ram or swap backed.
10  * Used by functions that manipulate the LRU lists, to sort a page
11  * onto the right LRU list.
12  *
13  * We would like to get this info without a page flag, but the state
14  * needs to survive until the page is last deleted from the LRU, which
15  * could be as far down as __page_cache_release.
16  */
page_is_file_cache(struct page * page)17 static inline int page_is_file_cache(struct page *page)
18 {
19 	if (PageSwapBacked(page))
20 		return 0;
21 
22 	/* The page is page cache backed by a normal filesystem. */
23 	return LRU_FILE;
24 }
25 
26 static inline void
add_page_to_lru_list(struct zone * zone,struct page * page,enum lru_list l)27 add_page_to_lru_list(struct zone *zone, struct page *page, enum lru_list l)
28 {
29 	list_add(&page->lru, &zone->lru[l].list);
30 	__inc_zone_state(zone, NR_LRU_BASE + l);
31 	mem_cgroup_add_lru_list(page, l);
32 }
33 
34 static inline void
del_page_from_lru_list(struct zone * zone,struct page * page,enum lru_list l)35 del_page_from_lru_list(struct zone *zone, struct page *page, enum lru_list l)
36 {
37 	list_del(&page->lru);
38 	__dec_zone_state(zone, NR_LRU_BASE + l);
39 	mem_cgroup_del_lru_list(page, l);
40 }
41 
42 static inline void
del_page_from_lru(struct zone * zone,struct page * page)43 del_page_from_lru(struct zone *zone, struct page *page)
44 {
45 	enum lru_list l = LRU_BASE;
46 
47 	list_del(&page->lru);
48 	if (PageUnevictable(page)) {
49 		__ClearPageUnevictable(page);
50 		l = LRU_UNEVICTABLE;
51 	} else {
52 		if (PageActive(page)) {
53 			__ClearPageActive(page);
54 			l += LRU_ACTIVE;
55 		}
56 		l += page_is_file_cache(page);
57 	}
58 	__dec_zone_state(zone, NR_LRU_BASE + l);
59 	mem_cgroup_del_lru_list(page, l);
60 }
61 
62 /**
63  * page_lru - which LRU list should a page be on?
64  * @page: the page to test
65  *
66  * Returns the LRU list a page should be on, as an index
67  * into the array of LRU lists.
68  */
page_lru(struct page * page)69 static inline enum lru_list page_lru(struct page *page)
70 {
71 	enum lru_list lru = LRU_BASE;
72 
73 	if (PageUnevictable(page))
74 		lru = LRU_UNEVICTABLE;
75 	else {
76 		if (PageActive(page))
77 			lru += LRU_ACTIVE;
78 		lru += page_is_file_cache(page);
79 	}
80 
81 	return lru;
82 }
83 
84 #endif
85