aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mm/memcontrol.c32
1 files changed, 22 insertions, 10 deletions
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index aa8363ef381c..404a13a09efa 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -488,6 +488,23 @@ static inline bool mem_cgroup_is_root(struct mem_cgroup *memcg)
488 return (memcg == root_mem_cgroup); 488 return (memcg == root_mem_cgroup);
489} 489}
490 490
491static inline unsigned short mem_cgroup_id(struct mem_cgroup *memcg)
492{
493 /*
494 * The ID of the root cgroup is 0, but memcg treat 0 as an
495 * invalid ID, so we return (cgroup_id + 1).
496 */
497 return memcg->css.cgroup->id + 1;
498}
499
500static inline struct mem_cgroup *mem_cgroup_from_id(unsigned short id)
501{
502 struct cgroup_subsys_state *css;
503
504 css = css_from_id(id - 1, &mem_cgroup_subsys);
505 return mem_cgroup_from_css(css);
506}
507
491/* Writing them here to avoid exposing memcg's inner layout */ 508/* Writing them here to avoid exposing memcg's inner layout */
492#if defined(CONFIG_INET) && defined(CONFIG_MEMCG_KMEM) 509#if defined(CONFIG_INET) && defined(CONFIG_MEMCG_KMEM)
493 510
@@ -2709,15 +2726,10 @@ static void __mem_cgroup_cancel_local_charge(struct mem_cgroup *memcg,
2709 */ 2726 */
2710static struct mem_cgroup *mem_cgroup_lookup(unsigned short id) 2727static struct mem_cgroup *mem_cgroup_lookup(unsigned short id)
2711{ 2728{
2712 struct cgroup_subsys_state *css;
2713
2714 /* ID 0 is unused ID */ 2729 /* ID 0 is unused ID */
2715 if (!id) 2730 if (!id)
2716 return NULL; 2731 return NULL;
2717 css = css_lookup(&mem_cgroup_subsys, id); 2732 return mem_cgroup_from_id(id);
2718 if (!css)
2719 return NULL;
2720 return mem_cgroup_from_css(css);
2721} 2733}
2722 2734
2723struct mem_cgroup *try_get_mem_cgroup_from_page(struct page *page) 2735struct mem_cgroup *try_get_mem_cgroup_from_page(struct page *page)
@@ -4232,7 +4244,7 @@ mem_cgroup_uncharge_swapcache(struct page *page, swp_entry_t ent, bool swapout)
4232 * css_get() was called in uncharge(). 4244 * css_get() was called in uncharge().
4233 */ 4245 */
4234 if (do_swap_account && swapout && memcg) 4246 if (do_swap_account && swapout && memcg)
4235 swap_cgroup_record(ent, css_id(&memcg->css)); 4247 swap_cgroup_record(ent, mem_cgroup_id(memcg));
4236} 4248}
4237#endif 4249#endif
4238 4250
@@ -4284,8 +4296,8 @@ static int mem_cgroup_move_swap_account(swp_entry_t entry,
4284{ 4296{
4285 unsigned short old_id, new_id; 4297 unsigned short old_id, new_id;
4286 4298
4287 old_id = css_id(&from->css); 4299 old_id = mem_cgroup_id(from);
4288 new_id = css_id(&to->css); 4300 new_id = mem_cgroup_id(to);
4289 4301
4290 if (swap_cgroup_cmpxchg(entry, old_id, new_id) == old_id) { 4302 if (swap_cgroup_cmpxchg(entry, old_id, new_id) == old_id) {
4291 mem_cgroup_swap_statistics(from, false); 4303 mem_cgroup_swap_statistics(from, false);
@@ -6325,7 +6337,7 @@ static enum mc_target_type get_mctgt_type(struct vm_area_struct *vma,
6325 } 6337 }
6326 /* There is a swap entry and a page doesn't exist or isn't charged */ 6338 /* There is a swap entry and a page doesn't exist or isn't charged */
6327 if (ent.val && !ret && 6339 if (ent.val && !ret &&
6328 css_id(&mc.from->css) == lookup_swap_cgroup_id(ent)) { 6340 mem_cgroup_id(mc.from) == lookup_swap_cgroup_id(ent)) {
6329 ret = MC_TARGET_SWAP; 6341 ret = MC_TARGET_SWAP;
6330 if (target) 6342 if (target)
6331 target->ent = ent; 6343 target->ent = ent;