diff options
Diffstat (limited to 'mm')
-rw-r--r-- | mm/memcontrol.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 23d8cf5a86c3..0eda67376df4 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
@@ -3491,16 +3491,17 @@ static void __mem_cgroup_usage_unregister_event(struct mem_cgroup *memcg, | |||
3491 | swap_buffers: | 3491 | swap_buffers: |
3492 | /* Swap primary and spare array */ | 3492 | /* Swap primary and spare array */ |
3493 | thresholds->spare = thresholds->primary; | 3493 | thresholds->spare = thresholds->primary; |
3494 | /* If all events are unregistered, free the spare array */ | ||
3495 | if (!new) { | ||
3496 | kfree(thresholds->spare); | ||
3497 | thresholds->spare = NULL; | ||
3498 | } | ||
3499 | 3494 | ||
3500 | rcu_assign_pointer(thresholds->primary, new); | 3495 | rcu_assign_pointer(thresholds->primary, new); |
3501 | 3496 | ||
3502 | /* To be sure that nobody uses thresholds */ | 3497 | /* To be sure that nobody uses thresholds */ |
3503 | synchronize_rcu(); | 3498 | synchronize_rcu(); |
3499 | |||
3500 | /* If all events are unregistered, free the spare array */ | ||
3501 | if (!new) { | ||
3502 | kfree(thresholds->spare); | ||
3503 | thresholds->spare = NULL; | ||
3504 | } | ||
3504 | unlock: | 3505 | unlock: |
3505 | mutex_unlock(&memcg->thresholds_lock); | 3506 | mutex_unlock(&memcg->thresholds_lock); |
3506 | } | 3507 | } |