From: YangHui <yanghui.def@xxxxxxxxx> if pte_alloc_one failed alloc a page, do_fault_around will return 0. and it will come into __do_fault(), it also pte_alloc_one a page. in __do_fault and do_fault_around, pte_alloc_one did the same thing, if do_fault_around alloc page filed,we just let it return. there is no need to come into __do_fault to do repetitive pte_alloc_one. Signed-off-by: YangHui <yanghui.def@xxxxxxxxx> --- mm/memory.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mm/memory.c b/mm/memory.c index f703fe8..a2d50a9 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -3799,8 +3799,10 @@ static vm_fault_t do_fault_around(struct vm_fault *vmf) if (pmd_none(*vmf->pmd)) { vmf->prealloc_pte = pte_alloc_one(vmf->vma->vm_mm); - if (!vmf->prealloc_pte) + if (!vmf->prealloc_pte) { + ret = VM_FAULT_OOM; goto out; + } smp_wmb(); /* See comment in __pte_alloc() */ } -- 2.7.4