aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/memcontrol.h6
-rw-r--r--mm/memcontrol.c11
2 files changed, 10 insertions, 7 deletions
diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h
index bf9213b2db8f..fc9bae82ac42 100644
--- a/include/linux/memcontrol.h
+++ b/include/linux/memcontrol.h
@@ -68,6 +68,7 @@ extern unsigned long mem_cgroup_isolate_pages(unsigned long nr_to_scan,
68extern void mem_cgroup_out_of_memory(struct mem_cgroup *mem, gfp_t gfp_mask); 68extern void mem_cgroup_out_of_memory(struct mem_cgroup *mem, gfp_t gfp_mask);
69int task_in_mem_cgroup(struct task_struct *task, const struct mem_cgroup *mem); 69int task_in_mem_cgroup(struct task_struct *task, const struct mem_cgroup *mem);
70 70
71extern struct mem_cgroup *try_get_mem_cgroup_from_page(struct page *page);
71extern struct mem_cgroup *mem_cgroup_from_task(struct task_struct *p); 72extern struct mem_cgroup *mem_cgroup_from_task(struct task_struct *p);
72 73
73static inline 74static inline
@@ -189,6 +190,11 @@ mem_cgroup_move_lists(struct page *page, enum lru_list from, enum lru_list to)
189{ 190{
190} 191}
191 192
193static inline struct mem_cgroup *try_get_mem_cgroup_from_page(struct page *page)
194{
195 return NULL;
196}
197
192static inline int mm_match_cgroup(struct mm_struct *mm, struct mem_cgroup *mem) 198static inline int mm_match_cgroup(struct mm_struct *mm, struct mem_cgroup *mem)
193{ 199{
194 return 1; 200 return 1;
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index e0c2066495e3..b5ac61ce7346 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -1379,25 +1379,22 @@ static struct mem_cgroup *mem_cgroup_lookup(unsigned short id)
1379 return container_of(css, struct mem_cgroup, css); 1379 return container_of(css, struct mem_cgroup, css);
1380} 1380}
1381 1381
1382static struct mem_cgroup *try_get_mem_cgroup_from_swapcache(struct page *page) 1382struct mem_cgroup *try_get_mem_cgroup_from_page(struct page *page)
1383{ 1383{
1384 struct mem_cgroup *mem; 1384 struct mem_cgroup *mem = NULL;
1385 struct page_cgroup *pc; 1385 struct page_cgroup *pc;
1386 unsigned short id; 1386 unsigned short id;
1387 swp_entry_t ent; 1387 swp_entry_t ent;
1388 1388
1389 VM_BUG_ON(!PageLocked(page)); 1389 VM_BUG_ON(!PageLocked(page));
1390 1390
1391 if (!PageSwapCache(page))
1392 return NULL;
1393
1394 pc = lookup_page_cgroup(page); 1391 pc = lookup_page_cgroup(page);
1395 lock_page_cgroup(pc); 1392 lock_page_cgroup(pc);
1396 if (PageCgroupUsed(pc)) { 1393 if (PageCgroupUsed(pc)) {
1397 mem = pc->mem_cgroup; 1394 mem = pc->mem_cgroup;
1398 if (mem && !css_tryget(&mem->css)) 1395 if (mem && !css_tryget(&mem->css))
1399 mem = NULL; 1396 mem = NULL;
1400 } else { 1397 } else if (PageSwapCache(page)) {
1401 ent.val = page_private(page); 1398 ent.val = page_private(page);
1402 id = lookup_swap_cgroup(ent); 1399 id = lookup_swap_cgroup(ent);
1403 rcu_read_lock(); 1400 rcu_read_lock();
@@ -1743,7 +1740,7 @@ int mem_cgroup_try_charge_swapin(struct mm_struct *mm,
1743 */ 1740 */
1744 if (!PageSwapCache(page)) 1741 if (!PageSwapCache(page))
1745 goto charge_cur_mm; 1742 goto charge_cur_mm;
1746 mem = try_get_mem_cgroup_from_swapcache(page); 1743 mem = try_get_mem_cgroup_from_page(page);
1747 if (!mem) 1744 if (!mem)
1748 goto charge_cur_mm; 1745 goto charge_cur_mm;
1749 *ptr = mem; 1746 *ptr = mem;