aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux
diff options
context:
space:
mode:
Diffstat (limited to 'include/linux')
-rw-r--r--include/linux/memcontrol.h49
-rw-r--r--include/linux/page_cgroup.h43
-rw-r--r--include/linux/swap.h12
3 files changed, 28 insertions, 76 deletions
diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h
index 1a9a096858e0..806b8fa15c5f 100644
--- a/include/linux/memcontrol.h
+++ b/include/linux/memcontrol.h
@@ -60,15 +60,17 @@ void mem_cgroup_commit_charge(struct page *page, struct mem_cgroup *memcg,
60 bool lrucare); 60 bool lrucare);
61void mem_cgroup_cancel_charge(struct page *page, struct mem_cgroup *memcg); 61void mem_cgroup_cancel_charge(struct page *page, struct mem_cgroup *memcg);
62 62
63struct lruvec *mem_cgroup_zone_lruvec(struct zone *, struct mem_cgroup *); 63void mem_cgroup_uncharge(struct page *page);
64struct lruvec *mem_cgroup_page_lruvec(struct page *, struct zone *); 64
65/* Batched uncharging */
66void mem_cgroup_uncharge_start(void);
67void mem_cgroup_uncharge_end(void);
65 68
66/* For coalescing uncharge for reducing memcg' overhead*/ 69void mem_cgroup_migrate(struct page *oldpage, struct page *newpage,
67extern void mem_cgroup_uncharge_start(void); 70 bool lrucare);
68extern void mem_cgroup_uncharge_end(void);
69 71
70extern void mem_cgroup_uncharge_page(struct page *page); 72struct lruvec *mem_cgroup_zone_lruvec(struct zone *, struct mem_cgroup *);
71extern void mem_cgroup_uncharge_cache_page(struct page *page); 73struct lruvec *mem_cgroup_page_lruvec(struct page *, struct zone *);
72 74
73bool __mem_cgroup_same_or_subtree(const struct mem_cgroup *root_memcg, 75bool __mem_cgroup_same_or_subtree(const struct mem_cgroup *root_memcg,
74 struct mem_cgroup *memcg); 76 struct mem_cgroup *memcg);
@@ -96,12 +98,6 @@ bool mm_match_cgroup(const struct mm_struct *mm, const struct mem_cgroup *memcg)
96 98
97extern struct cgroup_subsys_state *mem_cgroup_css(struct mem_cgroup *memcg); 99extern struct cgroup_subsys_state *mem_cgroup_css(struct mem_cgroup *memcg);
98 100
99extern void
100mem_cgroup_prepare_migration(struct page *page, struct page *newpage,
101 struct mem_cgroup **memcgp);
102extern void mem_cgroup_end_migration(struct mem_cgroup *memcg,
103 struct page *oldpage, struct page *newpage, bool migration_ok);
104
105struct mem_cgroup *mem_cgroup_iter(struct mem_cgroup *, 101struct mem_cgroup *mem_cgroup_iter(struct mem_cgroup *,
106 struct mem_cgroup *, 102 struct mem_cgroup *,
107 struct mem_cgroup_reclaim_cookie *); 103 struct mem_cgroup_reclaim_cookie *);
@@ -116,8 +112,6 @@ unsigned long mem_cgroup_get_lru_size(struct lruvec *lruvec, enum lru_list);
116void mem_cgroup_update_lru_size(struct lruvec *, enum lru_list, int); 112void mem_cgroup_update_lru_size(struct lruvec *, enum lru_list, int);
117extern void mem_cgroup_print_oom_info(struct mem_cgroup *memcg, 113extern void mem_cgroup_print_oom_info(struct mem_cgroup *memcg,
118 struct task_struct *p); 114 struct task_struct *p);
119extern void mem_cgroup_replace_page_cache(struct page *oldpage,
120 struct page *newpage);
121 115
122static inline void mem_cgroup_oom_enable(void) 116static inline void mem_cgroup_oom_enable(void)
123{ 117{
@@ -235,19 +229,21 @@ static inline void mem_cgroup_cancel_charge(struct page *page,
235{ 229{
236} 230}
237 231
238static inline void mem_cgroup_uncharge_start(void) 232static inline void mem_cgroup_uncharge(struct page *page)
239{ 233{
240} 234}
241 235
242static inline void mem_cgroup_uncharge_end(void) 236static inline void mem_cgroup_uncharge_start(void)
243{ 237{
244} 238}
245 239
246static inline void mem_cgroup_uncharge_page(struct page *page) 240static inline void mem_cgroup_uncharge_end(void)
247{ 241{
248} 242}
249 243
250static inline void mem_cgroup_uncharge_cache_page(struct page *page) 244static inline void mem_cgroup_migrate(struct page *oldpage,
245 struct page *newpage,
246 bool lrucare)
251{ 247{
252} 248}
253 249
@@ -286,17 +282,6 @@ static inline struct cgroup_subsys_state
286 return NULL; 282 return NULL;
287} 283}
288 284
289static inline void
290mem_cgroup_prepare_migration(struct page *page, struct page *newpage,
291 struct mem_cgroup **memcgp)
292{
293}
294
295static inline void mem_cgroup_end_migration(struct mem_cgroup *memcg,
296 struct page *oldpage, struct page *newpage, bool migration_ok)
297{
298}
299
300static inline struct mem_cgroup * 285static inline struct mem_cgroup *
301mem_cgroup_iter(struct mem_cgroup *root, 286mem_cgroup_iter(struct mem_cgroup *root,
302 struct mem_cgroup *prev, 287 struct mem_cgroup *prev,
@@ -392,10 +377,6 @@ static inline
392void mem_cgroup_count_vm_event(struct mm_struct *mm, enum vm_event_item idx) 377void mem_cgroup_count_vm_event(struct mm_struct *mm, enum vm_event_item idx)
393{ 378{
394} 379}
395static inline void mem_cgroup_replace_page_cache(struct page *oldpage,
396 struct page *newpage)
397{
398}
399#endif /* CONFIG_MEMCG */ 380#endif /* CONFIG_MEMCG */
400 381
401#if !defined(CONFIG_MEMCG) || !defined(CONFIG_DEBUG_VM) 382#if !defined(CONFIG_MEMCG) || !defined(CONFIG_DEBUG_VM)
diff --git a/include/linux/page_cgroup.h b/include/linux/page_cgroup.h
index 777a524716db..9bfb8e68a595 100644
--- a/include/linux/page_cgroup.h
+++ b/include/linux/page_cgroup.h
@@ -3,9 +3,9 @@
3 3
4enum { 4enum {
5 /* flags for mem_cgroup */ 5 /* flags for mem_cgroup */
6 PCG_LOCK, /* Lock for pc->mem_cgroup and following bits. */ 6 PCG_USED = 0x01, /* This page is charged to a memcg */
7 PCG_USED, /* this object is in use. */ 7 PCG_MEM = 0x02, /* This page holds a memory charge */
8 PCG_MIGRATION, /* under page migration */ 8 PCG_MEMSW = 0x04, /* This page holds a memory+swap charge */
9 __NR_PCG_FLAGS, 9 __NR_PCG_FLAGS,
10}; 10};
11 11
@@ -44,42 +44,9 @@ static inline void __init page_cgroup_init(void)
44struct page_cgroup *lookup_page_cgroup(struct page *page); 44struct page_cgroup *lookup_page_cgroup(struct page *page);
45struct page *lookup_cgroup_page(struct page_cgroup *pc); 45struct page *lookup_cgroup_page(struct page_cgroup *pc);
46 46
47#define TESTPCGFLAG(uname, lname) \ 47static inline int PageCgroupUsed(struct page_cgroup *pc)
48static inline int PageCgroup##uname(struct page_cgroup *pc) \
49 { return test_bit(PCG_##lname, &pc->flags); }
50
51#define SETPCGFLAG(uname, lname) \
52static inline void SetPageCgroup##uname(struct page_cgroup *pc)\
53 { set_bit(PCG_##lname, &pc->flags); }
54
55#define CLEARPCGFLAG(uname, lname) \
56static inline void ClearPageCgroup##uname(struct page_cgroup *pc) \
57 { clear_bit(PCG_##lname, &pc->flags); }
58
59#define TESTCLEARPCGFLAG(uname, lname) \
60static inline int TestClearPageCgroup##uname(struct page_cgroup *pc) \
61 { return test_and_clear_bit(PCG_##lname, &pc->flags); }
62
63TESTPCGFLAG(Used, USED)
64CLEARPCGFLAG(Used, USED)
65SETPCGFLAG(Used, USED)
66
67SETPCGFLAG(Migration, MIGRATION)
68CLEARPCGFLAG(Migration, MIGRATION)
69TESTPCGFLAG(Migration, MIGRATION)
70
71static inline void lock_page_cgroup(struct page_cgroup *pc)
72{
73 /*
74 * Don't take this lock in IRQ context.
75 * This lock is for pc->mem_cgroup, USED, MIGRATION
76 */
77 bit_spin_lock(PCG_LOCK, &pc->flags);
78}
79
80static inline void unlock_page_cgroup(struct page_cgroup *pc)
81{ 48{
82 bit_spin_unlock(PCG_LOCK, &pc->flags); 49 return !!(pc->flags & PCG_USED);
83} 50}
84 51
85#else /* CONFIG_MEMCG */ 52#else /* CONFIG_MEMCG */
diff --git a/include/linux/swap.h b/include/linux/swap.h
index 46a649e4e8cd..1b72060f093a 100644
--- a/include/linux/swap.h
+++ b/include/linux/swap.h
@@ -381,9 +381,13 @@ static inline int mem_cgroup_swappiness(struct mem_cgroup *mem)
381} 381}
382#endif 382#endif
383#ifdef CONFIG_MEMCG_SWAP 383#ifdef CONFIG_MEMCG_SWAP
384extern void mem_cgroup_uncharge_swap(swp_entry_t ent); 384extern void mem_cgroup_swapout(struct page *page, swp_entry_t entry);
385extern void mem_cgroup_uncharge_swap(swp_entry_t entry);
385#else 386#else
386static inline void mem_cgroup_uncharge_swap(swp_entry_t ent) 387static inline void mem_cgroup_swapout(struct page *page, swp_entry_t entry)
388{
389}
390static inline void mem_cgroup_uncharge_swap(swp_entry_t entry)
387{ 391{
388} 392}
389#endif 393#endif
@@ -443,7 +447,7 @@ extern void swap_shmem_alloc(swp_entry_t);
443extern int swap_duplicate(swp_entry_t); 447extern int swap_duplicate(swp_entry_t);
444extern int swapcache_prepare(swp_entry_t); 448extern int swapcache_prepare(swp_entry_t);
445extern void swap_free(swp_entry_t); 449extern void swap_free(swp_entry_t);
446extern void swapcache_free(swp_entry_t, struct page *page); 450extern void swapcache_free(swp_entry_t);
447extern int free_swap_and_cache(swp_entry_t); 451extern int free_swap_and_cache(swp_entry_t);
448extern int swap_type_of(dev_t, sector_t, struct block_device **); 452extern int swap_type_of(dev_t, sector_t, struct block_device **);
449extern unsigned int count_swap_pages(int, int); 453extern unsigned int count_swap_pages(int, int);
@@ -507,7 +511,7 @@ static inline void swap_free(swp_entry_t swp)
507{ 511{
508} 512}
509 513
510static inline void swapcache_free(swp_entry_t swp, struct page *page) 514static inline void swapcache_free(swp_entry_t swp)
511{ 515{
512} 516}
513 517