diff options
Diffstat (limited to 'mm/memcontrol.c')
-rw-r--r-- | mm/memcontrol.c | 12 |
1 files changed, 2 insertions, 10 deletions
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 79f23a189941..5f84d2351ddb 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
@@ -2092,7 +2092,6 @@ struct memcg_stock_pcp { | |||
2092 | #define FLUSHING_CACHED_CHARGE (0) | 2092 | #define FLUSHING_CACHED_CHARGE (0) |
2093 | }; | 2093 | }; |
2094 | static DEFINE_PER_CPU(struct memcg_stock_pcp, memcg_stock); | 2094 | static DEFINE_PER_CPU(struct memcg_stock_pcp, memcg_stock); |
2095 | static DEFINE_MUTEX(percpu_charge_mutex); | ||
2096 | 2095 | ||
2097 | /* | 2096 | /* |
2098 | * Try to consume stocked charge on this cpu. If success, one page is consumed | 2097 | * Try to consume stocked charge on this cpu. If success, one page is consumed |
@@ -2199,7 +2198,8 @@ static void drain_all_stock(struct mem_cgroup *root_mem, bool sync) | |||
2199 | 2198 | ||
2200 | for_each_online_cpu(cpu) { | 2199 | for_each_online_cpu(cpu) { |
2201 | struct memcg_stock_pcp *stock = &per_cpu(memcg_stock, cpu); | 2200 | struct memcg_stock_pcp *stock = &per_cpu(memcg_stock, cpu); |
2202 | if (test_bit(FLUSHING_CACHED_CHARGE, &stock->flags)) | 2201 | if (mem_cgroup_same_or_subtree(root_mem, stock->cached) && |
2202 | test_bit(FLUSHING_CACHED_CHARGE, &stock->flags)) | ||
2203 | flush_work(&stock->work); | 2203 | flush_work(&stock->work); |
2204 | } | 2204 | } |
2205 | out: | 2205 | out: |
@@ -2214,22 +2214,14 @@ out: | |||
2214 | */ | 2214 | */ |
2215 | static void drain_all_stock_async(struct mem_cgroup *root_mem) | 2215 | static void drain_all_stock_async(struct mem_cgroup *root_mem) |
2216 | { | 2216 | { |
2217 | /* | ||
2218 | * If someone calls draining, avoid adding more kworker runs. | ||
2219 | */ | ||
2220 | if (!mutex_trylock(&percpu_charge_mutex)) | ||
2221 | return; | ||
2222 | drain_all_stock(root_mem, false); | 2217 | drain_all_stock(root_mem, false); |
2223 | mutex_unlock(&percpu_charge_mutex); | ||
2224 | } | 2218 | } |
2225 | 2219 | ||
2226 | /* This is a synchronous drain interface. */ | 2220 | /* This is a synchronous drain interface. */ |
2227 | static void drain_all_stock_sync(struct mem_cgroup *root_mem) | 2221 | static void drain_all_stock_sync(struct mem_cgroup *root_mem) |
2228 | { | 2222 | { |
2229 | /* called when force_empty is called */ | 2223 | /* called when force_empty is called */ |
2230 | mutex_lock(&percpu_charge_mutex); | ||
2231 | drain_all_stock(root_mem, true); | 2224 | drain_all_stock(root_mem, true); |
2232 | mutex_unlock(&percpu_charge_mutex); | ||
2233 | } | 2225 | } |
2234 | 2226 | ||
2235 | /* | 2227 | /* |