Blame view

kernel/linux-imx6_3.14.28/include/linux/page_cgroup.h 3.41 KB
6b13f685e   김민수   BSP 최초 추가
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
  #ifndef __LINUX_PAGE_CGROUP_H
  #define __LINUX_PAGE_CGROUP_H
  
  enum {
  	/* flags for mem_cgroup */
  	PCG_LOCK,  /* Lock for pc->mem_cgroup and following bits. */
  	PCG_USED, /* this object is in use. */
  	PCG_MIGRATION, /* under page migration */
  	__NR_PCG_FLAGS,
  };
  
  #ifndef __GENERATING_BOUNDS_H
  #include <generated/bounds.h>
  
  #ifdef CONFIG_MEMCG
  #include <linux/bit_spinlock.h>
  
  /*
   * Page Cgroup can be considered as an extended mem_map.
   * A page_cgroup page is associated with every page descriptor. The
   * page_cgroup helps us identify information about the cgroup
   * All page cgroups are allocated at boot or memory hotplug event,
   * then the page cgroup for pfn always exists.
   */
  struct page_cgroup {
  	unsigned long flags;
  	struct mem_cgroup *mem_cgroup;
  };
  
  void __meminit pgdat_page_cgroup_init(struct pglist_data *pgdat);
  
  #ifdef CONFIG_SPARSEMEM
  static inline void __init page_cgroup_init_flatmem(void)
  {
  }
  extern void __init page_cgroup_init(void);
  #else
  void __init page_cgroup_init_flatmem(void);
  static inline void __init page_cgroup_init(void)
  {
  }
  #endif
  
  struct page_cgroup *lookup_page_cgroup(struct page *page);
  struct page *lookup_cgroup_page(struct page_cgroup *pc);
  
  #define TESTPCGFLAG(uname, lname)			\
  static inline int PageCgroup##uname(struct page_cgroup *pc)	\
  	{ return test_bit(PCG_##lname, &pc->flags); }
  
  #define SETPCGFLAG(uname, lname)			\
  static inline void SetPageCgroup##uname(struct page_cgroup *pc)\
  	{ set_bit(PCG_##lname, &pc->flags);  }
  
  #define CLEARPCGFLAG(uname, lname)			\
  static inline void ClearPageCgroup##uname(struct page_cgroup *pc)	\
  	{ clear_bit(PCG_##lname, &pc->flags);  }
  
  #define TESTCLEARPCGFLAG(uname, lname)			\
  static inline int TestClearPageCgroup##uname(struct page_cgroup *pc)	\
  	{ return test_and_clear_bit(PCG_##lname, &pc->flags);  }
  
  TESTPCGFLAG(Used, USED)
  CLEARPCGFLAG(Used, USED)
  SETPCGFLAG(Used, USED)
  
  SETPCGFLAG(Migration, MIGRATION)
  CLEARPCGFLAG(Migration, MIGRATION)
  TESTPCGFLAG(Migration, MIGRATION)
  
  static inline void lock_page_cgroup(struct page_cgroup *pc)
  {
  	/*
  	 * Don't take this lock in IRQ context.
  	 * This lock is for pc->mem_cgroup, USED, MIGRATION
  	 */
  	bit_spin_lock(PCG_LOCK, &pc->flags);
  }
  
  static inline void unlock_page_cgroup(struct page_cgroup *pc)
  {
  	bit_spin_unlock(PCG_LOCK, &pc->flags);
  }
  
  #else /* CONFIG_MEMCG */
  struct page_cgroup;
  
  static inline void __meminit pgdat_page_cgroup_init(struct pglist_data *pgdat)
  {
  }
  
  static inline struct page_cgroup *lookup_page_cgroup(struct page *page)
  {
  	return NULL;
  }
  
  static inline void page_cgroup_init(void)
  {
  }
  
  static inline void __init page_cgroup_init_flatmem(void)
  {
  }
  
  #endif /* CONFIG_MEMCG */
  
  #include <linux/swap.h>
  
  #ifdef CONFIG_MEMCG_SWAP
  extern unsigned short swap_cgroup_cmpxchg(swp_entry_t ent,
  					unsigned short old, unsigned short new);
  extern unsigned short swap_cgroup_record(swp_entry_t ent, unsigned short id);
  extern unsigned short lookup_swap_cgroup_id(swp_entry_t ent);
  extern int swap_cgroup_swapon(int type, unsigned long max_pages);
  extern void swap_cgroup_swapoff(int type);
  #else
  
  static inline
  unsigned short swap_cgroup_record(swp_entry_t ent, unsigned short id)
  {
  	return 0;
  }
  
  static inline
  unsigned short lookup_swap_cgroup_id(swp_entry_t ent)
  {
  	return 0;
  }
  
  static inline int
  swap_cgroup_swapon(int type, unsigned long max_pages)
  {
  	return 0;
  }
  
  static inline void swap_cgroup_swapoff(int type)
  {
  	return;
  }
  
  #endif /* CONFIG_MEMCG_SWAP */
  
  #endif /* !__GENERATING_BOUNDS_H */
  
  #endif /* __LINUX_PAGE_CGROUP_H */