Commit e42d9d5d47961fb5db0be65b56dd52fe7b2421f1
Committed by
Andi Kleen
1 parent
478c5ffc0b
Exists in
master
and in
4 other branches
memcg: rename and export try_get_mem_cgroup_from_page()
So that the hwpoison injector can get mem_cgroup for arbitrary page and thus know whether it is owned by some mem_cgroup task(s). [AK: Merged with latest git tree] CC: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> CC: Hugh Dickins <hugh.dickins@tiscali.co.uk> CC: Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp> CC: Balbir Singh <balbir@linux.vnet.ibm.com> Acked-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Signed-off-by: Wu Fengguang <fengguang.wu@intel.com> Signed-off-by: Andi Kleen <ak@linux.intel.com>
Showing 2 changed files with 10 additions and 7 deletions Side-by-side Diff
include/linux/memcontrol.h
... | ... | @@ -68,6 +68,7 @@ |
68 | 68 | extern void mem_cgroup_out_of_memory(struct mem_cgroup *mem, gfp_t gfp_mask); |
69 | 69 | int task_in_mem_cgroup(struct task_struct *task, const struct mem_cgroup *mem); |
70 | 70 | |
71 | +extern struct mem_cgroup *try_get_mem_cgroup_from_page(struct page *page); | |
71 | 72 | extern struct mem_cgroup *mem_cgroup_from_task(struct task_struct *p); |
72 | 73 | |
73 | 74 | static inline |
... | ... | @@ -187,6 +188,11 @@ |
187 | 188 | static inline void |
188 | 189 | mem_cgroup_move_lists(struct page *page, enum lru_list from, enum lru_list to) |
189 | 190 | { |
191 | +} | |
192 | + | |
193 | +static inline struct mem_cgroup *try_get_mem_cgroup_from_page(struct page *page) | |
194 | +{ | |
195 | + return NULL; | |
190 | 196 | } |
191 | 197 | |
192 | 198 | static inline int mm_match_cgroup(struct mm_struct *mm, struct mem_cgroup *mem) |
mm/memcontrol.c
... | ... | @@ -1379,25 +1379,22 @@ |
1379 | 1379 | return container_of(css, struct mem_cgroup, css); |
1380 | 1380 | } |
1381 | 1381 | |
1382 | -static struct mem_cgroup *try_get_mem_cgroup_from_swapcache(struct page *page) | |
1382 | +struct 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 | 1385 | struct page_cgroup *pc; |
1386 | 1386 | unsigned short id; |
1387 | 1387 | swp_entry_t ent; |
1388 | 1388 | |
1389 | 1389 | VM_BUG_ON(!PageLocked(page)); |
1390 | 1390 | |
1391 | - if (!PageSwapCache(page)) | |
1392 | - return NULL; | |
1393 | - | |
1394 | 1391 | pc = lookup_page_cgroup(page); |
1395 | 1392 | lock_page_cgroup(pc); |
1396 | 1393 | if (PageCgroupUsed(pc)) { |
1397 | 1394 | mem = pc->mem_cgroup; |
1398 | 1395 | if (mem && !css_tryget(&mem->css)) |
1399 | 1396 | mem = NULL; |
1400 | - } else { | |
1397 | + } else if (PageSwapCache(page)) { | |
1401 | 1398 | ent.val = page_private(page); |
1402 | 1399 | id = lookup_swap_cgroup(ent); |
1403 | 1400 | rcu_read_lock(); |
... | ... | @@ -1743,7 +1740,7 @@ |
1743 | 1740 | */ |
1744 | 1741 | if (!PageSwapCache(page)) |
1745 | 1742 | goto charge_cur_mm; |
1746 | - mem = try_get_mem_cgroup_from_swapcache(page); | |
1743 | + mem = try_get_mem_cgroup_from_page(page); | |
1747 | 1744 | if (!mem) |
1748 | 1745 | goto charge_cur_mm; |
1749 | 1746 | *ptr = mem; |