diff --git a/[refs] b/[refs] index 4b41435176ee..79a010bb5e3e 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 9b3c0a07e0fca35e36751680de3e4c76dbff5df3 +refs/heads/master: fb59e9f1e9786635ea12e12bf6adbb132e10f979 diff --git a/trunk/mm/memcontrol.c b/trunk/mm/memcontrol.c index f72067094e05..8b9f6cae938e 100644 --- a/trunk/mm/memcontrol.c +++ b/trunk/mm/memcontrol.c @@ -623,13 +623,13 @@ static int mem_cgroup_charge_common(struct page *page, struct mm_struct *mm, goto retry; } page_assign_page_cgroup(page, pc); - unlock_page_cgroup(page); mz = page_cgroup_zoneinfo(pc); spin_lock_irqsave(&mz->lru_lock, flags); __mem_cgroup_add_list(pc); spin_unlock_irqrestore(&mz->lru_lock, flags); + unlock_page_cgroup(page); done: return 0; out: @@ -677,14 +677,14 @@ void mem_cgroup_uncharge_page(struct page *page) VM_BUG_ON(pc->ref_cnt <= 0); if (--(pc->ref_cnt) == 0) { - page_assign_page_cgroup(page, NULL); - unlock_page_cgroup(page); - mz = page_cgroup_zoneinfo(pc); spin_lock_irqsave(&mz->lru_lock, flags); __mem_cgroup_remove_list(pc); spin_unlock_irqrestore(&mz->lru_lock, flags); + page_assign_page_cgroup(page, NULL); + unlock_page_cgroup(page); + mem = pc->mem_cgroup; res_counter_uncharge(&mem->res, PAGE_SIZE); css_put(&mem->css); @@ -736,23 +736,24 @@ void mem_cgroup_page_migration(struct page *page, struct page *newpage) return; } - page_assign_page_cgroup(page, NULL); - unlock_page_cgroup(page); - mz = page_cgroup_zoneinfo(pc); spin_lock_irqsave(&mz->lru_lock, flags); __mem_cgroup_remove_list(pc); spin_unlock_irqrestore(&mz->lru_lock, flags); + page_assign_page_cgroup(page, NULL); + unlock_page_cgroup(page); + pc->page = newpage; lock_page_cgroup(newpage); page_assign_page_cgroup(newpage, pc); - unlock_page_cgroup(newpage); mz = page_cgroup_zoneinfo(pc); spin_lock_irqsave(&mz->lru_lock, flags); __mem_cgroup_add_list(pc); spin_unlock_irqrestore(&mz->lru_lock, flags); + + unlock_page_cgroup(newpage); } /*