diff options
Diffstat (limited to 'mm/memcontrol.c')
| -rw-r--r-- | mm/memcontrol.c | 13 | 
1 files changed, 10 insertions, 3 deletions
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 19622328e4b5..13f559af1ab6 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -5669,7 +5669,6 @@ static void __mem_cgroup_clear_mc(void)  		if (!mem_cgroup_is_root(mc.to))  			page_counter_uncharge(&mc.to->memory, mc.moved_swap); -		mem_cgroup_id_get_many(mc.to, mc.moved_swap);  		css_put_many(&mc.to->css, mc.moved_swap);  		mc.moved_swap = 0; @@ -5860,7 +5859,8 @@ put:			/* get_mctgt_type() gets the page */  			ent = target.ent;  			if (!mem_cgroup_move_swap_account(ent, mc.from, mc.to)) {  				mc.precharge--; -				/* we fixup refcnts and charges later. */ +				mem_cgroup_id_get_many(mc.to, 1); +				/* we fixup other refcnts and charges later. */  				mc.moved_swap++;  			}  			break; @@ -7186,6 +7186,13 @@ static struct cftype memsw_files[] = {  	{ },	/* terminate */  }; +/* + * If mem_cgroup_swap_init() is implemented as a subsys_initcall() + * instead of a core_initcall(), this could mean cgroup_memory_noswap still + * remains set to false even when memcg is disabled via "cgroup_disable=memory" + * boot parameter. This may result in premature OOPS inside + * mem_cgroup_get_nr_swap_pages() function in corner cases. + */  static int __init mem_cgroup_swap_init(void)  {  	/* No memory control -> no swap control */ @@ -7200,6 +7207,6 @@ static int __init mem_cgroup_swap_init(void)  	return 0;  } -subsys_initcall(mem_cgroup_swap_init); +core_initcall(mem_cgroup_swap_init);  #endif /* CONFIG_MEMCG_SWAP */  | 
