at cba767175becadc5c4016cceb7bfdd2c7fe722f4 108 lines 2.8 kB view raw
1#ifndef __LINUX_PAGE_CGROUP_H 2#define __LINUX_PAGE_CGROUP_H 3 4#ifdef CONFIG_CGROUP_MEM_RES_CTLR 5#include <linux/bit_spinlock.h> 6/* 7 * Page Cgroup can be considered as an extended mem_map. 8 * A page_cgroup page is associated with every page descriptor. The 9 * page_cgroup helps us identify information about the cgroup 10 * All page cgroups are allocated at boot or memory hotplug event, 11 * then the page cgroup for pfn always exists. 12 */ 13struct page_cgroup { 14 unsigned long flags; 15 struct mem_cgroup *mem_cgroup; 16 struct page *page; 17 struct list_head lru; /* per cgroup LRU list */ 18}; 19 20void __meminit pgdat_page_cgroup_init(struct pglist_data *pgdat); 21void __init page_cgroup_init(void); 22struct page_cgroup *lookup_page_cgroup(struct page *page); 23 24enum { 25 /* flags for mem_cgroup */ 26 PCG_LOCK, /* page cgroup is locked */ 27 PCG_CACHE, /* charged as cache */ 28 PCG_USED, /* this object is in use. */ 29 /* flags for LRU placement */ 30 PCG_ACTIVE, /* page is active in this cgroup */ 31 PCG_FILE, /* page is file system backed */ 32 PCG_UNEVICTABLE, /* page is unevictableable */ 33}; 34 35#define TESTPCGFLAG(uname, lname) \ 36static inline int PageCgroup##uname(struct page_cgroup *pc) \ 37 { return test_bit(PCG_##lname, &pc->flags); } 38 39#define SETPCGFLAG(uname, lname) \ 40static inline void SetPageCgroup##uname(struct page_cgroup *pc)\ 41 { set_bit(PCG_##lname, &pc->flags); } 42 43#define CLEARPCGFLAG(uname, lname) \ 44static inline void ClearPageCgroup##uname(struct page_cgroup *pc) \ 45 { clear_bit(PCG_##lname, &pc->flags); } 46 47/* Cache flag is set only once (at allocation) */ 48TESTPCGFLAG(Cache, CACHE) 49 50TESTPCGFLAG(Used, USED) 51CLEARPCGFLAG(Used, USED) 52 53/* LRU management flags (from global-lru definition) */ 54TESTPCGFLAG(File, FILE) 55SETPCGFLAG(File, FILE) 56CLEARPCGFLAG(File, FILE) 57 58TESTPCGFLAG(Active, ACTIVE) 59SETPCGFLAG(Active, ACTIVE) 60CLEARPCGFLAG(Active, ACTIVE) 61 62TESTPCGFLAG(Unevictable, UNEVICTABLE) 63SETPCGFLAG(Unevictable, UNEVICTABLE) 64CLEARPCGFLAG(Unevictable, UNEVICTABLE) 65 66static inline int page_cgroup_nid(struct page_cgroup *pc) 67{ 68 return page_to_nid(pc->page); 69} 70 71static inline enum zone_type page_cgroup_zid(struct page_cgroup *pc) 72{ 73 return page_zonenum(pc->page); 74} 75 76static inline void lock_page_cgroup(struct page_cgroup *pc) 77{ 78 bit_spin_lock(PCG_LOCK, &pc->flags); 79} 80 81static inline int trylock_page_cgroup(struct page_cgroup *pc) 82{ 83 return bit_spin_trylock(PCG_LOCK, &pc->flags); 84} 85 86static inline void unlock_page_cgroup(struct page_cgroup *pc) 87{ 88 bit_spin_unlock(PCG_LOCK, &pc->flags); 89} 90 91#else /* CONFIG_CGROUP_MEM_RES_CTLR */ 92struct page_cgroup; 93 94static inline void __meminit pgdat_page_cgroup_init(struct pglist_data *pgdat) 95{ 96} 97 98static inline struct page_cgroup *lookup_page_cgroup(struct page *page) 99{ 100 return NULL; 101} 102 103static inline void page_cgroup_init(void) 104{ 105} 106 107#endif 108#endif