|
@@ -6401,6 +6401,10 @@ static int mem_cgroup_do_precharge(unsigned long count)
|
|
|
mc.precharge += count;
|
|
|
return ret;
|
|
|
}
|
|
|
+ if (ret == -EINTR) {
|
|
|
+ __mem_cgroup_cancel_charge(root_mem_cgroup, count);
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
|
|
|
/* Try charges one by one with reclaim */
|
|
|
while (count--) {
|
|
@@ -6409,8 +6413,11 @@ static int mem_cgroup_do_precharge(unsigned long count)
|
|
|
/*
|
|
|
* In case of failure, any residual charges against
|
|
|
* mc.to will be dropped by mem_cgroup_clear_mc()
|
|
|
- * later on.
|
|
|
+ * later on. However, cancel any charges that are
|
|
|
+ * bypassed to root right away or they'll be lost.
|
|
|
*/
|
|
|
+ if (ret == -EINTR)
|
|
|
+ __mem_cgroup_cancel_charge(root_mem_cgroup, 1);
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
mc.precharge++;
|