forked from luck/tmp_suning_uos_patched
hugetlb: don't use ERR_PTR with VM_FAULT* values
The current use of VM_FAULT_* codes with ERR_PTR requires us to ensure VM_FAULT_* values will not exceed MAX_ERRNO value. Decouple the VM_FAULT_* values from MAX_ERRNO. Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> Acked-by: Hillf Danton <dhillf@gmail.com> Acked-by: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> Reviewed-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Cc: David Rientjes <rientjes@google.com> Cc: Michal Hocko <mhocko@suse.cz> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
47d38344ab
commit
76dcee75c1
18
mm/hugetlb.c
18
mm/hugetlb.c
|
@ -1123,10 +1123,10 @@ static struct page *alloc_huge_page(struct vm_area_struct *vma,
|
|||
*/
|
||||
chg = vma_needs_reservation(h, vma, addr);
|
||||
if (chg < 0)
|
||||
return ERR_PTR(-VM_FAULT_OOM);
|
||||
return ERR_PTR(-ENOMEM);
|
||||
if (chg)
|
||||
if (hugepage_subpool_get_pages(spool, chg))
|
||||
return ERR_PTR(-VM_FAULT_SIGBUS);
|
||||
return ERR_PTR(-ENOSPC);
|
||||
|
||||
spin_lock(&hugetlb_lock);
|
||||
page = dequeue_huge_page_vma(h, vma, addr, avoid_reserve);
|
||||
|
@ -1136,7 +1136,7 @@ static struct page *alloc_huge_page(struct vm_area_struct *vma,
|
|||
page = alloc_buddy_huge_page(h, NUMA_NO_NODE);
|
||||
if (!page) {
|
||||
hugepage_subpool_put_pages(spool, chg);
|
||||
return ERR_PTR(-VM_FAULT_SIGBUS);
|
||||
return ERR_PTR(-ENOSPC);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2496,6 +2496,7 @@ static int hugetlb_cow(struct mm_struct *mm, struct vm_area_struct *vma,
|
|||
new_page = alloc_huge_page(vma, address, outside_reserve);
|
||||
|
||||
if (IS_ERR(new_page)) {
|
||||
long err = PTR_ERR(new_page);
|
||||
page_cache_release(old_page);
|
||||
|
||||
/*
|
||||
|
@ -2524,7 +2525,10 @@ static int hugetlb_cow(struct mm_struct *mm, struct vm_area_struct *vma,
|
|||
|
||||
/* Caller expects lock to be held */
|
||||
spin_lock(&mm->page_table_lock);
|
||||
return -PTR_ERR(new_page);
|
||||
if (err == -ENOMEM)
|
||||
return VM_FAULT_OOM;
|
||||
else
|
||||
return VM_FAULT_SIGBUS;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -2642,7 +2646,11 @@ static int hugetlb_no_page(struct mm_struct *mm, struct vm_area_struct *vma,
|
|||
goto out;
|
||||
page = alloc_huge_page(vma, address, 0);
|
||||
if (IS_ERR(page)) {
|
||||
ret = -PTR_ERR(page);
|
||||
ret = PTR_ERR(page);
|
||||
if (ret == -ENOMEM)
|
||||
ret = VM_FAULT_OOM;
|
||||
else
|
||||
ret = VM_FAULT_SIGBUS;
|
||||
goto out;
|
||||
}
|
||||
clear_huge_page(page, address, pages_per_huge_page(h));
|
||||
|
|
Loading…
Reference in New Issue
Block a user