diff options
Diffstat (limited to 'mm')
-rw-r--r-- | mm/memcontrol.c | 11 |
1 files changed, 4 insertions, 7 deletions
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 488b644e0e8e..954032b80bed 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
@@ -2586,7 +2586,7 @@ static int mem_cgroup_force_empty(struct mem_cgroup *mem, bool free_all) | |||
2586 | if (free_all) | 2586 | if (free_all) |
2587 | goto try_to_free; | 2587 | goto try_to_free; |
2588 | move_account: | 2588 | move_account: |
2589 | while (mem->res.usage > 0) { | 2589 | do { |
2590 | ret = -EBUSY; | 2590 | ret = -EBUSY; |
2591 | if (cgroup_task_count(cgrp) || !list_empty(&cgrp->children)) | 2591 | if (cgroup_task_count(cgrp) || !list_empty(&cgrp->children)) |
2592 | goto out; | 2592 | goto out; |
@@ -2614,8 +2614,8 @@ move_account: | |||
2614 | if (ret == -ENOMEM) | 2614 | if (ret == -ENOMEM) |
2615 | goto try_to_free; | 2615 | goto try_to_free; |
2616 | cond_resched(); | 2616 | cond_resched(); |
2617 | } | 2617 | /* "ret" should also be checked to ensure all lists are empty. */ |
2618 | ret = 0; | 2618 | } while (mem->res.usage > 0 || ret); |
2619 | out: | 2619 | out: |
2620 | css_put(&mem->css); | 2620 | css_put(&mem->css); |
2621 | return ret; | 2621 | return ret; |
@@ -2648,10 +2648,7 @@ try_to_free: | |||
2648 | } | 2648 | } |
2649 | lru_add_drain(); | 2649 | lru_add_drain(); |
2650 | /* try move_account...there may be some *locked* pages. */ | 2650 | /* try move_account...there may be some *locked* pages. */ |
2651 | if (mem->res.usage) | 2651 | goto move_account; |
2652 | goto move_account; | ||
2653 | ret = 0; | ||
2654 | goto out; | ||
2655 | } | 2652 | } |
2656 | 2653 | ||
2657 | int mem_cgroup_force_empty_write(struct cgroup *cont, unsigned int event) | 2654 | int mem_cgroup_force_empty_write(struct cgroup *cont, unsigned int event) |