mm/hugetlb: fix missing call to restore_reserve_on_error()
When huge_add_to_page_cache() fails, the page is freed directly without calling restore_reserve_on_error() to restore reserve for newly allocated pages not in page cache. Fix this by calling restore_reserve_on_error() when huge_add_to_page_cache fails. [linmiaohe@huawei.com: remove err == -EEXIST check and retry logic] Link: https://lkml.kernel.org/r/20220823030209.57434-4-linmiaohe@huawei.com Link: https://lkml.kernel.org/r/20220816130553.31406-4-linmiaohe@huawei.com Signed-off-by: Miaohe Lin <linmiaohe@huawei.com> Reviewed-by: Mike Kravetz <mike.kravetz@oracle.com> Cc: Muchun Song <songmuchun@bytedance.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
3a6bdda0b5
commit
3a5497a2da
11
mm/hugetlb.c
11
mm/hugetlb.c
@ -5563,7 +5563,6 @@ static vm_fault_t hugetlb_no_page(struct mm_struct *mm,
|
||||
if (idx >= size)
|
||||
goto out;
|
||||
|
||||
retry:
|
||||
new_page = false;
|
||||
page = find_lock_page(mapping, idx);
|
||||
if (!page) {
|
||||
@ -5603,9 +5602,15 @@ retry:
|
||||
if (vma->vm_flags & VM_MAYSHARE) {
|
||||
int err = huge_add_to_page_cache(page, mapping, idx);
|
||||
if (err) {
|
||||
/*
|
||||
* err can't be -EEXIST which implies someone
|
||||
* else consumed the reservation since hugetlb
|
||||
* fault mutex is held when add a hugetlb page
|
||||
* to the page cache. So it's safe to call
|
||||
* restore_reserve_on_error() here.
|
||||
*/
|
||||
restore_reserve_on_error(h, vma, haddr, page);
|
||||
put_page(page);
|
||||
if (err == -EEXIST)
|
||||
goto retry;
|
||||
goto out;
|
||||
}
|
||||
new_pagecache_page = true;
|
||||
|
Loading…
x
Reference in New Issue
Block a user