diff options
Diffstat (limited to 'mm/memcontrol.c')
| -rw-r--r-- | mm/memcontrol.c | 26 | 
1 files changed, 7 insertions, 19 deletions
| diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 930de9437271..ebd1e86bef1c 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -1841,29 +1841,23 @@ static int mem_cgroup_hierarchical_reclaim(struct mem_cgroup *root_mem,   */  static bool mem_cgroup_oom_lock(struct mem_cgroup *mem)  { -	int lock_count = -1;  	struct mem_cgroup *iter, *failed = NULL;  	bool cond = true;  	for_each_mem_cgroup_tree_cond(iter, mem, cond) { -		bool locked = iter->oom_lock; - -		iter->oom_lock = true; -		if (lock_count == -1) -			lock_count = iter->oom_lock; -		else if (lock_count != locked) { +		if (iter->oom_lock) {  			/*  			 * this subtree of our hierarchy is already locked  			 * so we cannot give a lock.  			 */ -			lock_count = 0;  			failed = iter;  			cond = false; -		} +		} else +			iter->oom_lock = true;  	}  	if (!failed) -		goto done; +		return true;  	/*  	 * OK, we failed to lock the whole subtree so we have to clean up @@ -1877,8 +1871,7 @@ static bool mem_cgroup_oom_lock(struct mem_cgroup *mem)  		}  		iter->oom_lock = false;  	} -done: -	return lock_count; +	return false;  }  /* @@ -2169,13 +2162,7 @@ static void drain_all_stock(struct mem_cgroup *root_mem, bool sync)  	/* Notify other cpus that system-wide "drain" is running */  	get_online_cpus(); -	/* -	 * Get a hint for avoiding draining charges on the current cpu, -	 * which must be exhausted by our charging.  It is not required that -	 * this be a precise check, so we use raw_smp_processor_id() instead of -	 * getcpu()/putcpu(). -	 */ -	curcpu = raw_smp_processor_id(); +	curcpu = get_cpu();  	for_each_online_cpu(cpu) {  		struct memcg_stock_pcp *stock = &per_cpu(memcg_stock, cpu);  		struct mem_cgroup *mem; @@ -2192,6 +2179,7 @@ static void drain_all_stock(struct mem_cgroup *root_mem, bool sync)  				schedule_work_on(cpu, &stock->work);  		}  	} +	put_cpu();  	if (!sync)  		goto out; | 
