diff options
-rw-r--r-- | mm/memcontrol.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 8a4159efa3c0..e0ac636315f8 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
@@ -6401,6 +6401,10 @@ static int mem_cgroup_do_precharge(unsigned long count) | |||
6401 | mc.precharge += count; | 6401 | mc.precharge += count; |
6402 | return ret; | 6402 | return ret; |
6403 | } | 6403 | } |
6404 | if (ret == -EINTR) { | ||
6405 | __mem_cgroup_cancel_charge(root_mem_cgroup, count); | ||
6406 | return ret; | ||
6407 | } | ||
6404 | 6408 | ||
6405 | /* Try charges one by one with reclaim */ | 6409 | /* Try charges one by one with reclaim */ |
6406 | while (count--) { | 6410 | while (count--) { |
@@ -6409,8 +6413,11 @@ static int mem_cgroup_do_precharge(unsigned long count) | |||
6409 | /* | 6413 | /* |
6410 | * In case of failure, any residual charges against | 6414 | * In case of failure, any residual charges against |
6411 | * mc.to will be dropped by mem_cgroup_clear_mc() | 6415 | * mc.to will be dropped by mem_cgroup_clear_mc() |
6412 | * later on. | 6416 | * later on. However, cancel any charges that are |
6417 | * bypassed to root right away or they'll be lost. | ||
6413 | */ | 6418 | */ |
6419 | if (ret == -EINTR) | ||
6420 | __mem_cgroup_cancel_charge(root_mem_cgroup, 1); | ||
6414 | if (ret) | 6421 | if (ret) |
6415 | return ret; | 6422 | return ret; |
6416 | mc.precharge++; | 6423 | mc.precharge++; |