diff options
-rw-r--r-- | mm/memcontrol.c | 38 |
1 files changed, 18 insertions, 20 deletions
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 0b3efb843a8..2d6b4a912a6 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
@@ -1500,6 +1500,21 @@ nomem: | |||
1500 | } | 1500 | } |
1501 | 1501 | ||
1502 | /* | 1502 | /* |
1503 | * Somemtimes we have to undo a charge we got by try_charge(). | ||
1504 | * This function is for that and do uncharge, put css's refcnt. | ||
1505 | * gotten by try_charge(). | ||
1506 | */ | ||
1507 | static void mem_cgroup_cancel_charge(struct mem_cgroup *mem) | ||
1508 | { | ||
1509 | if (!mem_cgroup_is_root(mem)) { | ||
1510 | res_counter_uncharge(&mem->res, PAGE_SIZE); | ||
1511 | if (do_swap_account) | ||
1512 | res_counter_uncharge(&mem->memsw, PAGE_SIZE); | ||
1513 | } | ||
1514 | css_put(&mem->css); | ||
1515 | } | ||
1516 | |||
1517 | /* | ||
1503 | * A helper function to get mem_cgroup from ID. must be called under | 1518 | * A helper function to get mem_cgroup from ID. must be called under |
1504 | * rcu_read_lock(). The caller must check css_is_removed() or some if | 1519 | * rcu_read_lock(). The caller must check css_is_removed() or some if |
1505 | * it's concern. (dropping refcnt from swap can be called against removed | 1520 | * it's concern. (dropping refcnt from swap can be called against removed |
@@ -1565,12 +1580,7 @@ static void __mem_cgroup_commit_charge(struct mem_cgroup *mem, | |||
1565 | lock_page_cgroup(pc); | 1580 | lock_page_cgroup(pc); |
1566 | if (unlikely(PageCgroupUsed(pc))) { | 1581 | if (unlikely(PageCgroupUsed(pc))) { |
1567 | unlock_page_cgroup(pc); | 1582 | unlock_page_cgroup(pc); |
1568 | if (!mem_cgroup_is_root(mem)) { | 1583 | mem_cgroup_cancel_charge(mem); |
1569 | res_counter_uncharge(&mem->res, PAGE_SIZE); | ||
1570 | if (do_swap_account) | ||
1571 | res_counter_uncharge(&mem->memsw, PAGE_SIZE); | ||
1572 | } | ||
1573 | css_put(&mem->css); | ||
1574 | return; | 1584 | return; |
1575 | } | 1585 | } |
1576 | 1586 | ||
@@ -1734,14 +1744,7 @@ static int mem_cgroup_move_parent(struct page_cgroup *pc, | |||
1734 | cancel: | 1744 | cancel: |
1735 | put_page(page); | 1745 | put_page(page); |
1736 | uncharge: | 1746 | uncharge: |
1737 | /* drop extra refcnt by try_charge() */ | 1747 | mem_cgroup_cancel_charge(parent); |
1738 | css_put(&parent->css); | ||
1739 | /* uncharge if move fails */ | ||
1740 | if (!mem_cgroup_is_root(parent)) { | ||
1741 | res_counter_uncharge(&parent->res, PAGE_SIZE); | ||
1742 | if (do_swap_account) | ||
1743 | res_counter_uncharge(&parent->memsw, PAGE_SIZE); | ||
1744 | } | ||
1745 | return ret; | 1748 | return ret; |
1746 | } | 1749 | } |
1747 | 1750 | ||
@@ -1958,12 +1961,7 @@ void mem_cgroup_cancel_charge_swapin(struct mem_cgroup *mem) | |||
1958 | return; | 1961 | return; |
1959 | if (!mem) | 1962 | if (!mem) |
1960 | return; | 1963 | return; |
1961 | if (!mem_cgroup_is_root(mem)) { | 1964 | mem_cgroup_cancel_charge(mem); |
1962 | res_counter_uncharge(&mem->res, PAGE_SIZE); | ||
1963 | if (do_swap_account) | ||
1964 | res_counter_uncharge(&mem->memsw, PAGE_SIZE); | ||
1965 | } | ||
1966 | css_put(&mem->css); | ||
1967 | } | 1965 | } |
1968 | 1966 | ||
1969 | static void | 1967 | static void |