mm: fix pageref leak in do_swap_page()
By the time the memory cgroup code is notified about a swapin we already hold a reference on the fault page. If the cgroup callback fails make sure to unlock AND release the page reference which was taken by lookup_swap_cach(), or we leak the reference. Signed-off-by: Johannes Weiner <hannes@cmpxchg.org> Cc: Balbir Singh <balbir@linux.vnet.ibm.com> Reviewed-by: Minchan Kim <minchan.kim@gmail.com> Acked-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
53951bd57d
commit
bc43f75cd9
|
@ -2458,8 +2458,7 @@ static int do_swap_page(struct mm_struct *mm, struct vm_area_struct *vma,
|
|||
|
||||
if (mem_cgroup_try_charge_swapin(mm, page, GFP_KERNEL, &ptr)) {
|
||||
ret = VM_FAULT_OOM;
|
||||
unlock_page(page);
|
||||
goto out;
|
||||
goto out_page;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -2521,6 +2520,7 @@ out:
|
|||
out_nomap:
|
||||
mem_cgroup_cancel_charge_swapin(ptr);
|
||||
pte_unmap_unlock(page_table, ptl);
|
||||
out_page:
|
||||
unlock_page(page);
|
||||
page_cache_release(page);
|
||||
return ret;
|
||||
|
|
Loading…
Reference in New Issue