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); 21 22#ifdef CONFIG_SPARSEMEM 23static inline void __init page_cgroup_init_flatmem(void) 24{ 25} 26extern void __init page_cgroup_init(void); 27#else 28void __init page_cgroup_init_flatmem(void); 29static inline void __init page_cgroup_init(void) 30{ 31} 32#endif 33 34struct page_cgroup *lookup_page_cgroup(struct page *page); 35 36enum { 37 /* flags for mem_cgroup */ 38 PCG_LOCK, /* page cgroup is locked */ 39 PCG_CACHE, /* charged as cache */ 40 PCG_USED, /* this object is in use. */ 41 PCG_ACCT_LRU, /* page has been accounted for */ 42 PCG_FILE_MAPPED, /* page is accounted as "mapped" */ 43 PCG_MIGRATION, /* under page migration */ 44}; 45 46#define TESTPCGFLAG(uname, lname) \ 47static inline int PageCgroup##uname(struct page_cgroup *pc) \ 48 { return test_bit(PCG_##lname, &pc->flags); } 49 50#define SETPCGFLAG(uname, lname) \ 51static inline void SetPageCgroup##uname(struct page_cgroup *pc)\ 52 { set_bit(PCG_##lname, &pc->flags); } 53 54#define CLEARPCGFLAG(uname, lname) \ 55static inline void ClearPageCgroup##uname(struct page_cgroup *pc) \ 56 { clear_bit(PCG_##lname, &pc->flags); } 57 58#define TESTCLEARPCGFLAG(uname, lname) \ 59static inline int TestClearPageCgroup##uname(struct page_cgroup *pc) \ 60 { return test_and_clear_bit(PCG_##lname, &pc->flags); } 61 62TESTPCGFLAG(Locked, LOCK) 63 64/* Cache flag is set only once (at allocation) */ 65TESTPCGFLAG(Cache, CACHE) 66CLEARPCGFLAG(Cache, CACHE) 67SETPCGFLAG(Cache, CACHE) 68 69TESTPCGFLAG(Used, USED) 70CLEARPCGFLAG(Used, USED) 71SETPCGFLAG(Used, USED) 72 73SETPCGFLAG(AcctLRU, ACCT_LRU) 74CLEARPCGFLAG(AcctLRU, ACCT_LRU) 75TESTPCGFLAG(AcctLRU, ACCT_LRU) 76TESTCLEARPCGFLAG(AcctLRU, ACCT_LRU) 77 78 79SETPCGFLAG(FileMapped, FILE_MAPPED) 80CLEARPCGFLAG(FileMapped, FILE_MAPPED) 81TESTPCGFLAG(FileMapped, FILE_MAPPED) 82 83SETPCGFLAG(Migration, MIGRATION) 84CLEARPCGFLAG(Migration, MIGRATION) 85TESTPCGFLAG(Migration, MIGRATION) 86 87static inline int page_cgroup_nid(struct page_cgroup *pc) 88{ 89 return page_to_nid(pc->page); 90} 91 92static inline enum zone_type page_cgroup_zid(struct page_cgroup *pc) 93{ 94 return page_zonenum(pc->page); 95} 96 97static inline void lock_page_cgroup(struct page_cgroup *pc) 98{ 99 bit_spin_lock(PCG_LOCK, &pc->flags); 100} 101 102static inline void unlock_page_cgroup(struct page_cgroup *pc) 103{ 104 bit_spin_unlock(PCG_LOCK, &pc->flags); 105} 106 107#else /* CONFIG_CGROUP_MEM_RES_CTLR */ 108struct page_cgroup; 109 110static inline void __meminit pgdat_page_cgroup_init(struct pglist_data *pgdat) 111{ 112} 113 114static inline struct page_cgroup *lookup_page_cgroup(struct page *page) 115{ 116 return NULL; 117} 118 119static inline void page_cgroup_init(void) 120{ 121} 122 123static inline void __init page_cgroup_init_flatmem(void) 124{ 125} 126 127#endif 128 129#include <linux/swap.h> 130 131#ifdef CONFIG_CGROUP_MEM_RES_CTLR_SWAP 132extern unsigned short swap_cgroup_cmpxchg(swp_entry_t ent, 133 unsigned short old, unsigned short new); 134extern unsigned short swap_cgroup_record(swp_entry_t ent, unsigned short id); 135extern unsigned short lookup_swap_cgroup(swp_entry_t ent); 136extern int swap_cgroup_swapon(int type, unsigned long max_pages); 137extern void swap_cgroup_swapoff(int type); 138#else 139 140static inline 141unsigned short swap_cgroup_record(swp_entry_t ent, unsigned short id) 142{ 143 return 0; 144} 145 146static inline 147unsigned short lookup_swap_cgroup(swp_entry_t ent) 148{ 149 return 0; 150} 151 152static inline int 153swap_cgroup_swapon(int type, unsigned long max_pages) 154{ 155 return 0; 156} 157 158static inline void swap_cgroup_swapoff(int type) 159{ 160 return; 161} 162 163#endif 164#endif 165