diff --git a/include/linux/mm.h b/include/linux/mm.h index 8b257c43855bbc32c04698a184055bb3be56bd80..dfb7ce05f1e3342eae69aa12fe4fdb31ac79d1ab 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -1260,6 +1260,11 @@ static inline int vma_growsdown(struct vm_area_struct *vma, unsigned long addr) return vma && (vma->vm_end == addr) && (vma->vm_flags & VM_GROWSDOWN); } +static inline bool vma_is_anonymous(struct vm_area_struct *vma) +{ + return !vma->vm_ops; +} + static inline int stack_guard_page_start(struct vm_area_struct *vma, unsigned long addr) { diff --git a/mm/memory.c b/mm/memory.c index bb04d8f2f86c415c24a52dadd71623a2316454d1..882c9d7ae2f5f9696e4ea416d919512b101382de 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -3267,12 +3267,12 @@ static int handle_pte_fault(struct mm_struct *mm, barrier(); if (!pte_present(entry)) { if (pte_none(entry)) { - if (vma->vm_ops) + if (vma_is_anonymous(vma)) + return do_anonymous_page(mm, vma, address, + pte, pmd, flags); + else return do_fault(mm, vma, address, pte, pmd, flags, entry); - - return do_anonymous_page(mm, vma, address, pte, pmd, - flags); } return do_swap_page(mm, vma, address, pte, pmd, flags, entry);