at v4.10 3.2 kB view raw
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 */ 20static inline int page_is_file_cache(struct page *page) 21{ 22 return !PageSwapBacked(page); 23} 24 25static __always_inline void __update_lru_size(struct lruvec *lruvec, 26 enum lru_list lru, enum zone_type zid, 27 int nr_pages) 28{ 29 struct pglist_data *pgdat = lruvec_pgdat(lruvec); 30 31 __mod_node_page_state(pgdat, NR_LRU_BASE + lru, nr_pages); 32 __mod_zone_page_state(&pgdat->node_zones[zid], 33 NR_ZONE_LRU_BASE + lru, nr_pages); 34} 35 36static __always_inline void update_lru_size(struct lruvec *lruvec, 37 enum lru_list lru, enum zone_type zid, 38 int nr_pages) 39{ 40 __update_lru_size(lruvec, lru, zid, nr_pages); 41#ifdef CONFIG_MEMCG 42 mem_cgroup_update_lru_size(lruvec, lru, zid, nr_pages); 43#endif 44} 45 46static __always_inline void add_page_to_lru_list(struct page *page, 47 struct lruvec *lruvec, enum lru_list lru) 48{ 49 update_lru_size(lruvec, lru, page_zonenum(page), hpage_nr_pages(page)); 50 list_add(&page->lru, &lruvec->lists[lru]); 51} 52 53static __always_inline void del_page_from_lru_list(struct page *page, 54 struct lruvec *lruvec, enum lru_list lru) 55{ 56 list_del(&page->lru); 57 update_lru_size(lruvec, lru, page_zonenum(page), -hpage_nr_pages(page)); 58} 59 60/** 61 * page_lru_base_type - which LRU list type should a page be on? 62 * @page: the page to test 63 * 64 * Used for LRU list index arithmetic. 65 * 66 * Returns the base LRU type - file or anon - @page should be on. 67 */ 68static inline enum lru_list page_lru_base_type(struct page *page) 69{ 70 if (page_is_file_cache(page)) 71 return LRU_INACTIVE_FILE; 72 return LRU_INACTIVE_ANON; 73} 74 75/** 76 * page_off_lru - which LRU list was page on? clearing its lru flags. 77 * @page: the page to test 78 * 79 * Returns the LRU list a page was on, as an index into the array of LRU 80 * lists; and clears its Unevictable or Active flags, ready for freeing. 81 */ 82static __always_inline enum lru_list page_off_lru(struct page *page) 83{ 84 enum lru_list lru; 85 86 if (PageUnevictable(page)) { 87 __ClearPageUnevictable(page); 88 lru = LRU_UNEVICTABLE; 89 } else { 90 lru = page_lru_base_type(page); 91 if (PageActive(page)) { 92 __ClearPageActive(page); 93 lru += LRU_ACTIVE; 94 } 95 } 96 return lru; 97} 98 99/** 100 * page_lru - which LRU list should a page be on? 101 * @page: the page to test 102 * 103 * Returns the LRU list a page should be on, as an index 104 * into the array of LRU lists. 105 */ 106static __always_inline enum lru_list page_lru(struct page *page) 107{ 108 enum lru_list lru; 109 110 if (PageUnevictable(page)) 111 lru = LRU_UNEVICTABLE; 112 else { 113 lru = page_lru_base_type(page); 114 if (PageActive(page)) 115 lru += LRU_ACTIVE; 116 } 117 return lru; 118} 119 120#define lru_to_page(head) (list_entry((head)->prev, struct page, lru)) 121 122#endif