Message ID | 20180604171727.GA20279@jordon-HP-15-Notebook-PC (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Mon, Jun 4, 2018 at 10:47 PM, Souptick Joarder <jrdr.linux@gmail.com> wrote: > Use new return type vm_fault_t for fault handler. For > now, this is just documenting that the function returns > a VM_FAULT value rather than an errno. Once all instances > are converted, vm_fault_t will become a distinct type. > > Ref-> commit 1c8f422059ae ("mm: change return type to vm_fault_t") > > The aim is to change the return type of finish_fault() > and handle_mm_fault() to vm_fault_t type. As part of > that clean up return type of all other recursively called > functions have been changed to vm_fault_t type. > > The places from where handle_mm_fault() is getting invoked > will be change to vm_fault_t type but in a separate patch. > > vmf_error() is the newly introduce inline function > in 4.17-rc6. > > Signed-off-by: Souptick Joarder <jrdr.linux@gmail.com> > Reviewed-by: Matthew Wilcox <mawilcox@microsoft.com> > --- > v2: Change patch title and fixed sparse warning. > > v3: Reviewed by Matthew Wilcox > > fs/userfaultfd.c | 6 +-- > include/linux/huge_mm.h | 10 +++-- > include/linux/hugetlb.h | 2 +- > include/linux/mm.h | 14 +++---- > include/linux/oom.h | 2 +- > include/linux/swapops.h | 5 ++- > include/linux/userfaultfd_k.h | 5 ++- > kernel/memremap.c | 2 +- > mm/gup.c | 4 +- > mm/huge_memory.c | 25 ++++++------ > mm/hugetlb.c | 29 +++++++------- > mm/internal.h | 2 +- > mm/khugepaged.c | 3 +- > mm/memory.c | 90 ++++++++++++++++++++++--------------------- > mm/shmem.c | 17 ++++---- > 15 files changed, 110 insertions(+), 106 deletions(-) > > diff --git a/fs/userfaultfd.c b/fs/userfaultfd.c > index cec550c..bf60c6a 100644 > --- a/fs/userfaultfd.c > +++ b/fs/userfaultfd.c > @@ -336,17 +336,15 @@ static inline bool userfaultfd_must_wait(struct userfaultfd_ctx *ctx, > * fatal_signal_pending()s, and the mmap_sem must be released before > * returning it. > */ > -int handle_userfault(struct vm_fault *vmf, unsigned long reason) > +vm_fault_t handle_userfault(struct vm_fault *vmf, unsigned long reason) > { > struct mm_struct *mm = vmf->vma->vm_mm; > struct userfaultfd_ctx *ctx; > struct userfaultfd_wait_queue uwq; > - int ret; > + vm_fault_t ret = VM_FAULT_SIGBUS; > bool must_wait, return_to_userland; > long blocking_state; > > - ret = VM_FAULT_SIGBUS; > - > /* > * We don't do userfault handling for the final child pid update. > * > diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h > index a8a1262..8c4f0a6 100644 > --- a/include/linux/huge_mm.h > +++ b/include/linux/huge_mm.h > @@ -3,10 +3,11 @@ > #define _LINUX_HUGE_MM_H > > #include <linux/sched/coredump.h> > +#include <linux/mm_types.h> > > #include <linux/fs.h> /* only for vma_is_dax() */ > > -extern int do_huge_pmd_anonymous_page(struct vm_fault *vmf); > +extern vm_fault_t do_huge_pmd_anonymous_page(struct vm_fault *vmf); > extern int copy_huge_pmd(struct mm_struct *dst_mm, struct mm_struct *src_mm, > pmd_t *dst_pmd, pmd_t *src_pmd, unsigned long addr, > struct vm_area_struct *vma); > @@ -23,7 +24,7 @@ static inline void huge_pud_set_accessed(struct vm_fault *vmf, pud_t orig_pud) > } > #endif > > -extern int do_huge_pmd_wp_page(struct vm_fault *vmf, pmd_t orig_pmd); > +extern vm_fault_t do_huge_pmd_wp_page(struct vm_fault *vmf, pmd_t orig_pmd); > extern struct page *follow_trans_huge_pmd(struct vm_area_struct *vma, > unsigned long addr, > pmd_t *pmd, > @@ -216,7 +217,7 @@ struct page *follow_devmap_pmd(struct vm_area_struct *vma, unsigned long addr, > struct page *follow_devmap_pud(struct vm_area_struct *vma, unsigned long addr, > pud_t *pud, int flags); > > -extern int do_huge_pmd_numa_page(struct vm_fault *vmf, pmd_t orig_pmd); > +extern vm_fault_t do_huge_pmd_numa_page(struct vm_fault *vmf, pmd_t orig_pmd); > > extern struct page *huge_zero_page; > > @@ -321,7 +322,8 @@ static inline spinlock_t *pud_trans_huge_lock(pud_t *pud, > return NULL; > } > > -static inline int do_huge_pmd_numa_page(struct vm_fault *vmf, pmd_t orig_pmd) > +static inline vm_fault_t do_huge_pmd_numa_page(struct vm_fault *vmf, > + pmd_t orig_pmd) > { > return 0; > } > diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h > index 36fa6a2..c779b2f 100644 > --- a/include/linux/hugetlb.h > +++ b/include/linux/hugetlb.h > @@ -105,7 +105,7 @@ void __unmap_hugepage_range(struct mmu_gather *tlb, struct vm_area_struct *vma, > int hugetlb_report_node_meminfo(int, char *); > void hugetlb_show_meminfo(void); > unsigned long hugetlb_total_pages(void); > -int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma, > +vm_fault_t hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma, > unsigned long address, unsigned int flags); > int hugetlb_mcopy_atomic_pte(struct mm_struct *dst_mm, pte_t *dst_pte, > struct vm_area_struct *dst_vma, > diff --git a/include/linux/mm.h b/include/linux/mm.h > index 02a616e..2971bff 100644 > --- a/include/linux/mm.h > +++ b/include/linux/mm.h > @@ -694,10 +694,10 @@ static inline pte_t maybe_mkwrite(pte_t pte, struct vm_area_struct *vma) > return pte; > } > > -int alloc_set_pte(struct vm_fault *vmf, struct mem_cgroup *memcg, > +vm_fault_t alloc_set_pte(struct vm_fault *vmf, struct mem_cgroup *memcg, > struct page *page); > -int finish_fault(struct vm_fault *vmf); > -int finish_mkwrite_fault(struct vm_fault *vmf); > +vm_fault_t finish_fault(struct vm_fault *vmf); > +vm_fault_t finish_mkwrite_fault(struct vm_fault *vmf); > #endif > > /* > @@ -1343,8 +1343,8 @@ int generic_access_phys(struct vm_area_struct *vma, unsigned long addr, > int invalidate_inode_page(struct page *page); > > #ifdef CONFIG_MMU > -extern int handle_mm_fault(struct vm_area_struct *vma, unsigned long address, > - unsigned int flags); > +extern vm_fault_t handle_mm_fault(struct vm_area_struct *vma, > + unsigned long address, unsigned int flags); > extern int fixup_user_fault(struct task_struct *tsk, struct mm_struct *mm, > unsigned long address, unsigned int fault_flags, > bool *unlocked); > @@ -1353,7 +1353,7 @@ void unmap_mapping_pages(struct address_space *mapping, > void unmap_mapping_range(struct address_space *mapping, > loff_t const holebegin, loff_t const holelen, int even_cows); > #else > -static inline int handle_mm_fault(struct vm_area_struct *vma, > +static inline vm_fault_t handle_mm_fault(struct vm_area_struct *vma, > unsigned long address, unsigned int flags) > { > /* should never happen if there's no MMU */ > @@ -2501,7 +2501,7 @@ static inline struct page *follow_page(struct vm_area_struct *vma, > #define FOLL_COW 0x4000 /* internal GUP flag */ > #define FOLL_ANON 0x8000 /* don't do file mappings */ > > -static inline int vm_fault_to_errno(int vm_fault, int foll_flags) > +static inline int vm_fault_to_errno(vm_fault_t vm_fault, int foll_flags) > { > if (vm_fault & VM_FAULT_OOM) > return -ENOMEM; > diff --git a/include/linux/oom.h b/include/linux/oom.h > index 6adac11..9d30c15 100644 > --- a/include/linux/oom.h > +++ b/include/linux/oom.h > @@ -88,7 +88,7 @@ static inline bool mm_is_oom_victim(struct mm_struct *mm) > * > * Return 0 when the PF is safe VM_FAULT_SIGBUS otherwise. > */ > -static inline int check_stable_address_space(struct mm_struct *mm) > +static inline vm_fault_t check_stable_address_space(struct mm_struct *mm) > { > if (unlikely(test_bit(MMF_UNSTABLE, &mm->flags))) > return VM_FAULT_SIGBUS; > diff --git a/include/linux/swapops.h b/include/linux/swapops.h > index 1d3877c..9bc8ddb 100644 > --- a/include/linux/swapops.h > +++ b/include/linux/swapops.h > @@ -4,6 +4,7 @@ > > #include <linux/radix-tree.h> > #include <linux/bug.h> > +#include <linux/mm_types.h> > > /* > * swapcache pages are stored in the swapper_space radix tree. We want to > @@ -134,7 +135,7 @@ static inline struct page *device_private_entry_to_page(swp_entry_t entry) > return pfn_to_page(swp_offset(entry)); > } > > -int device_private_entry_fault(struct vm_area_struct *vma, > +vm_fault_t device_private_entry_fault(struct vm_area_struct *vma, > unsigned long addr, > swp_entry_t entry, > unsigned int flags, > @@ -169,7 +170,7 @@ static inline struct page *device_private_entry_to_page(swp_entry_t entry) > return NULL; > } > > -static inline int device_private_entry_fault(struct vm_area_struct *vma, > +static inline vm_fault_t device_private_entry_fault(struct vm_area_struct *vma, > unsigned long addr, > swp_entry_t entry, > unsigned int flags, > diff --git a/include/linux/userfaultfd_k.h b/include/linux/userfaultfd_k.h > index f2f3b68..1f36c80 100644 > --- a/include/linux/userfaultfd_k.h > +++ b/include/linux/userfaultfd_k.h > @@ -28,7 +28,7 @@ > #define UFFD_SHARED_FCNTL_FLAGS (O_CLOEXEC | O_NONBLOCK) > #define UFFD_FLAGS_SET (EFD_SHARED_FCNTL_FLAGS) > > -extern int handle_userfault(struct vm_fault *vmf, unsigned long reason); > +extern vm_fault_t handle_userfault(struct vm_fault *vmf, unsigned long reason); > > extern ssize_t mcopy_atomic(struct mm_struct *dst_mm, unsigned long dst_start, > unsigned long src_start, unsigned long len); > @@ -75,7 +75,8 @@ extern void userfaultfd_unmap_complete(struct mm_struct *mm, > #else /* CONFIG_USERFAULTFD */ > > /* mm helpers */ > -static inline int handle_userfault(struct vm_fault *vmf, unsigned long reason) > +static inline vm_fault_t handle_userfault(struct vm_fault *vmf, > + unsigned long reason) > { > return VM_FAULT_SIGBUS; > } > diff --git a/kernel/memremap.c b/kernel/memremap.c > index 895e6b7..d148d09 100644 > --- a/kernel/memremap.c > +++ b/kernel/memremap.c > @@ -214,7 +214,7 @@ static unsigned long order_at(struct resource *res, unsigned long pgoff) > pgoff += 1UL << order, order = order_at((res), pgoff)) > > #if IS_ENABLED(CONFIG_DEVICE_PRIVATE) > -int device_private_entry_fault(struct vm_area_struct *vma, > +vm_fault_t device_private_entry_fault(struct vm_area_struct *vma, > unsigned long addr, > swp_entry_t entry, > unsigned int flags, > diff --git a/mm/gup.c b/mm/gup.c > index 541904a..e3a957e 100644 > --- a/mm/gup.c > +++ b/mm/gup.c > @@ -481,7 +481,7 @@ static int faultin_page(struct task_struct *tsk, struct vm_area_struct *vma, > unsigned long address, unsigned int *flags, int *nonblocking) > { > unsigned int fault_flags = 0; > - int ret; > + vm_fault_t ret; > > /* mlock all present pages, but do not fault in new pages */ > if ((*flags & (FOLL_POPULATE | FOLL_MLOCK)) == FOLL_MLOCK) > @@ -802,7 +802,7 @@ int fixup_user_fault(struct task_struct *tsk, struct mm_struct *mm, > bool *unlocked) > { > struct vm_area_struct *vma; > - int ret, major = 0; > + vm_fault_t ret, major = 0; > > if (unlocked) > fault_flags |= FAULT_FLAG_ALLOW_RETRY; > diff --git a/mm/huge_memory.c b/mm/huge_memory.c > index a3a1815..82dc477 100644 > --- a/mm/huge_memory.c > +++ b/mm/huge_memory.c > @@ -544,14 +544,14 @@ unsigned long thp_get_unmapped_area(struct file *filp, unsigned long addr, > } > EXPORT_SYMBOL_GPL(thp_get_unmapped_area); > > -static int __do_huge_pmd_anonymous_page(struct vm_fault *vmf, struct page *page, > - gfp_t gfp) > +static vm_fault_t __do_huge_pmd_anonymous_page(struct vm_fault *vmf, > + struct page *page, gfp_t gfp) > { > struct vm_area_struct *vma = vmf->vma; > struct mem_cgroup *memcg; > pgtable_t pgtable; > unsigned long haddr = vmf->address & HPAGE_PMD_MASK; > - int ret = 0; > + vm_fault_t ret = 0; > > VM_BUG_ON_PAGE(!PageCompound(page), page); > > @@ -587,7 +587,7 @@ static int __do_huge_pmd_anonymous_page(struct vm_fault *vmf, struct page *page, > > /* Deliver the page fault to userland */ > if (userfaultfd_missing(vma)) { > - int ret; > + vm_fault_t ret; > > spin_unlock(vmf->ptl); > mem_cgroup_cancel_charge(page, memcg, true); > @@ -666,7 +666,7 @@ static bool set_huge_zero_page(pgtable_t pgtable, struct mm_struct *mm, > return true; > } > > -int do_huge_pmd_anonymous_page(struct vm_fault *vmf) > +vm_fault_t do_huge_pmd_anonymous_page(struct vm_fault *vmf) > { > struct vm_area_struct *vma = vmf->vma; > gfp_t gfp; > @@ -685,7 +685,7 @@ int do_huge_pmd_anonymous_page(struct vm_fault *vmf) > pgtable_t pgtable; > struct page *zero_page; > bool set; > - int ret; > + vm_fault_t ret; > pgtable = pte_alloc_one(vma->vm_mm, haddr); > if (unlikely(!pgtable)) > return VM_FAULT_OOM; > @@ -1121,15 +1121,16 @@ void huge_pmd_set_accessed(struct vm_fault *vmf, pmd_t orig_pmd) > spin_unlock(vmf->ptl); > } > > -static int do_huge_pmd_wp_page_fallback(struct vm_fault *vmf, pmd_t orig_pmd, > - struct page *page) > +static vm_fault_t do_huge_pmd_wp_page_fallback(struct vm_fault *vmf, > + pmd_t orig_pmd, struct page *page) > { > struct vm_area_struct *vma = vmf->vma; > unsigned long haddr = vmf->address & HPAGE_PMD_MASK; > struct mem_cgroup *memcg; > pgtable_t pgtable; > pmd_t _pmd; > - int ret = 0, i; > + int i; > + vm_fault_t ret = 0; > struct page **pages; > unsigned long mmun_start; /* For mmu_notifiers */ > unsigned long mmun_end; /* For mmu_notifiers */ > @@ -1239,7 +1240,7 @@ static int do_huge_pmd_wp_page_fallback(struct vm_fault *vmf, pmd_t orig_pmd, > goto out; > } > > -int do_huge_pmd_wp_page(struct vm_fault *vmf, pmd_t orig_pmd) > +vm_fault_t do_huge_pmd_wp_page(struct vm_fault *vmf, pmd_t orig_pmd) > { > struct vm_area_struct *vma = vmf->vma; > struct page *page = NULL, *new_page; > @@ -1248,7 +1249,7 @@ int do_huge_pmd_wp_page(struct vm_fault *vmf, pmd_t orig_pmd) > unsigned long mmun_start; /* For mmu_notifiers */ > unsigned long mmun_end; /* For mmu_notifiers */ > gfp_t huge_gfp; /* for allocation and charge */ > - int ret = 0; > + vm_fault_t ret = 0; > > vmf->ptl = pmd_lockptr(vma->vm_mm, vmf->pmd); > VM_BUG_ON_VMA(!vma->anon_vma, vma); > @@ -1459,7 +1460,7 @@ struct page *follow_trans_huge_pmd(struct vm_area_struct *vma, > } > > /* NUMA hinting page fault entry point for trans huge pmds */ > -int do_huge_pmd_numa_page(struct vm_fault *vmf, pmd_t pmd) > +vm_fault_t do_huge_pmd_numa_page(struct vm_fault *vmf, pmd_t pmd) > { > struct vm_area_struct *vma = vmf->vma; > struct anon_vma *anon_vma = NULL; > diff --git a/mm/hugetlb.c b/mm/hugetlb.c > index 2186791..d17b186 100644 > --- a/mm/hugetlb.c > +++ b/mm/hugetlb.c > @@ -3499,14 +3499,15 @@ static void unmap_ref_private(struct mm_struct *mm, struct vm_area_struct *vma, > * cannot race with other handlers or page migration. > * Keep the pte_same checks anyway to make transition from the mutex easier. > */ > -static int hugetlb_cow(struct mm_struct *mm, struct vm_area_struct *vma, > +static vm_fault_t hugetlb_cow(struct mm_struct *mm, struct vm_area_struct *vma, > unsigned long address, pte_t *ptep, > struct page *pagecache_page, spinlock_t *ptl) > { > pte_t pte; > struct hstate *h = hstate_vma(vma); > struct page *old_page, *new_page; > - int ret = 0, outside_reserve = 0; > + int outside_reserve = 0; > + vm_fault_t ret = 0; > unsigned long mmun_start; /* For mmu_notifiers */ > unsigned long mmun_end; /* For mmu_notifiers */ > > @@ -3570,8 +3571,7 @@ static int hugetlb_cow(struct mm_struct *mm, struct vm_area_struct *vma, > return 0; > } > > - ret = (PTR_ERR(new_page) == -ENOMEM) ? > - VM_FAULT_OOM : VM_FAULT_SIGBUS; > + ret = vmf_error(PTR_ERR(new_page)); > goto out_release_old; > } > > @@ -3675,12 +3675,13 @@ int huge_add_to_page_cache(struct page *page, struct address_space *mapping, > return 0; > } > > -static int hugetlb_no_page(struct mm_struct *mm, struct vm_area_struct *vma, > - struct address_space *mapping, pgoff_t idx, > - unsigned long address, pte_t *ptep, unsigned int flags) > +static vm_fault_t hugetlb_no_page(struct mm_struct *mm, > + struct vm_area_struct *vma, > + struct address_space *mapping, pgoff_t idx, > + unsigned long address, pte_t *ptep, unsigned int flags) > { > struct hstate *h = hstate_vma(vma); > - int ret = VM_FAULT_SIGBUS; > + vm_fault_t ret = VM_FAULT_SIGBUS; > int anon_rmap = 0; > unsigned long size; > struct page *page; > @@ -3742,11 +3743,7 @@ static int hugetlb_no_page(struct mm_struct *mm, struct vm_area_struct *vma, > > page = alloc_huge_page(vma, address, 0); > if (IS_ERR(page)) { > - ret = PTR_ERR(page); > - if (ret == -ENOMEM) > - ret = VM_FAULT_OOM; > - else > - ret = VM_FAULT_SIGBUS; > + ret = vmf_error(PTR_ERR(page)); > goto out; > } > clear_huge_page(page, address, pages_per_huge_page(h)); > @@ -3870,12 +3867,12 @@ u32 hugetlb_fault_mutex_hash(struct hstate *h, struct mm_struct *mm, > } > #endif > > -int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma, > +vm_fault_t hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma, > unsigned long address, unsigned int flags) > { > pte_t *ptep, entry; > spinlock_t *ptl; > - int ret; > + vm_fault_t ret; > u32 hash; > pgoff_t idx; > struct page *page = NULL; > @@ -4206,7 +4203,7 @@ long follow_hugetlb_page(struct mm_struct *mm, struct vm_area_struct *vma, > if (absent || is_swap_pte(huge_ptep_get(pte)) || > ((flags & FOLL_WRITE) && > !huge_pte_write(huge_ptep_get(pte)))) { > - int ret; > + vm_fault_t ret; > unsigned int fault_flags = 0; > > if (pte) > diff --git a/mm/internal.h b/mm/internal.h > index 502d141..4044456 100644 > --- a/mm/internal.h > +++ b/mm/internal.h > @@ -38,7 +38,7 @@ > > void page_writeback_init(void); > > -int do_swap_page(struct vm_fault *vmf); > +vm_fault_t do_swap_page(struct vm_fault *vmf); > > void free_pgtables(struct mmu_gather *tlb, struct vm_area_struct *start_vma, > unsigned long floor, unsigned long ceiling); > diff --git a/mm/khugepaged.c b/mm/khugepaged.c > index d7b2a4b..778fd40 100644 > --- a/mm/khugepaged.c > +++ b/mm/khugepaged.c > @@ -880,7 +880,8 @@ static bool __collapse_huge_page_swapin(struct mm_struct *mm, > unsigned long address, pmd_t *pmd, > int referenced) > { > - int swapped_in = 0, ret = 0; > + int swapped_in = 0; > + vm_fault_t ret = 0; > struct vm_fault vmf = { > .vma = vma, > .address = address, > diff --git a/mm/memory.c b/mm/memory.c > index 01f5464..cee8245 100644 > --- a/mm/memory.c > +++ b/mm/memory.c > @@ -2360,9 +2360,9 @@ static gfp_t __get_fault_gfp_mask(struct vm_area_struct *vma) > * > * We do this without the lock held, so that it can sleep if it needs to. > */ > -static int do_page_mkwrite(struct vm_fault *vmf) > +static vm_fault_t do_page_mkwrite(struct vm_fault *vmf) > { > - int ret; > + vm_fault_t ret; > struct page *page = vmf->page; > unsigned int old_flags = vmf->flags; > > @@ -2466,7 +2466,7 @@ static inline void wp_page_reuse(struct vm_fault *vmf) > * held to the old page, as well as updating the rmap. > * - In any case, unlock the PTL and drop the reference we took to the old page. > */ > -static int wp_page_copy(struct vm_fault *vmf) > +static vm_fault_t wp_page_copy(struct vm_fault *vmf) > { > struct vm_area_struct *vma = vmf->vma; > struct mm_struct *mm = vma->vm_mm; > @@ -2614,7 +2614,7 @@ static int wp_page_copy(struct vm_fault *vmf) > * The function expects the page to be locked or other protection against > * concurrent faults / writeback (such as DAX radix tree locks). > */ > -int finish_mkwrite_fault(struct vm_fault *vmf) > +vm_fault_t finish_mkwrite_fault(struct vm_fault *vmf) > { > WARN_ON_ONCE(!(vmf->vma->vm_flags & VM_SHARED)); > vmf->pte = pte_offset_map_lock(vmf->vma->vm_mm, vmf->pmd, vmf->address, > @@ -2635,12 +2635,12 @@ int finish_mkwrite_fault(struct vm_fault *vmf) > * Handle write page faults for VM_MIXEDMAP or VM_PFNMAP for a VM_SHARED > * mapping > */ > -static int wp_pfn_shared(struct vm_fault *vmf) > +static vm_fault_t wp_pfn_shared(struct vm_fault *vmf) > { > struct vm_area_struct *vma = vmf->vma; > > if (vma->vm_ops && vma->vm_ops->pfn_mkwrite) { > - int ret; > + vm_fault_t ret; > > pte_unmap_unlock(vmf->pte, vmf->ptl); > vmf->flags |= FAULT_FLAG_MKWRITE; > @@ -2653,7 +2653,7 @@ static int wp_pfn_shared(struct vm_fault *vmf) > return VM_FAULT_WRITE; > } > > -static int wp_page_shared(struct vm_fault *vmf) > +static vm_fault_t wp_page_shared(struct vm_fault *vmf) > __releases(vmf->ptl) > { > struct vm_area_struct *vma = vmf->vma; > @@ -2661,7 +2661,7 @@ static int wp_page_shared(struct vm_fault *vmf) > get_page(vmf->page); > > if (vma->vm_ops && vma->vm_ops->page_mkwrite) { > - int tmp; > + vm_fault_t tmp; > > pte_unmap_unlock(vmf->pte, vmf->ptl); > tmp = do_page_mkwrite(vmf); > @@ -2704,7 +2704,7 @@ static int wp_page_shared(struct vm_fault *vmf) > * but allow concurrent faults), with pte both mapped and locked. > * We return with mmap_sem still held, but pte unmapped and unlocked. > */ > -static int do_wp_page(struct vm_fault *vmf) > +static vm_fault_t do_wp_page(struct vm_fault *vmf) > __releases(vmf->ptl) > { > struct vm_area_struct *vma = vmf->vma; > @@ -2880,7 +2880,7 @@ void unmap_mapping_range(struct address_space *mapping, > * We return with the mmap_sem locked or unlocked in the same cases > * as does filemap_fault(). > */ > -int do_swap_page(struct vm_fault *vmf) > +vm_fault_t do_swap_page(struct vm_fault *vmf) > { > struct vm_area_struct *vma = vmf->vma; > struct page *page = NULL, *swapcache; > @@ -2889,7 +2889,7 @@ int do_swap_page(struct vm_fault *vmf) > pte_t pte; > int locked; > int exclusive = 0; > - int ret = 0; > + vm_fault_t ret = 0; > > if (!pte_unmap_same(vma->vm_mm, vmf->pmd, vmf->pte, vmf->orig_pte)) > goto out; > @@ -3100,12 +3100,12 @@ int do_swap_page(struct vm_fault *vmf) > * but allow concurrent faults), and pte mapped but not yet locked. > * We return with mmap_sem still held, but pte unmapped and unlocked. > */ > -static int do_anonymous_page(struct vm_fault *vmf) > +static vm_fault_t do_anonymous_page(struct vm_fault *vmf) > { > struct vm_area_struct *vma = vmf->vma; > struct mem_cgroup *memcg; > struct page *page; > - int ret = 0; > + vm_fault_t ret = 0; > pte_t entry; > > /* File mapping without ->vm_ops ? */ > @@ -3214,10 +3214,10 @@ static int do_anonymous_page(struct vm_fault *vmf) > * released depending on flags and vma->vm_ops->fault() return value. > * See filemap_fault() and __lock_page_retry(). > */ > -static int __do_fault(struct vm_fault *vmf) > +static vm_fault_t __do_fault(struct vm_fault *vmf) > { > struct vm_area_struct *vma = vmf->vma; > - int ret; > + vm_fault_t ret; > > ret = vma->vm_ops->fault(vmf); > if (unlikely(ret & (VM_FAULT_ERROR | VM_FAULT_NOPAGE | VM_FAULT_RETRY | > @@ -3251,7 +3251,7 @@ static int pmd_devmap_trans_unstable(pmd_t *pmd) > return pmd_devmap(*pmd) || pmd_trans_unstable(pmd); > } > > -static int pte_alloc_one_map(struct vm_fault *vmf) > +static vm_fault_t pte_alloc_one_map(struct vm_fault *vmf) > { > struct vm_area_struct *vma = vmf->vma; > > @@ -3327,13 +3327,14 @@ static void deposit_prealloc_pte(struct vm_fault *vmf) > vmf->prealloc_pte = NULL; > } > > -static int do_set_pmd(struct vm_fault *vmf, struct page *page) > +static vm_fault_t do_set_pmd(struct vm_fault *vmf, struct page *page) > { > struct vm_area_struct *vma = vmf->vma; > bool write = vmf->flags & FAULT_FLAG_WRITE; > unsigned long haddr = vmf->address & HPAGE_PMD_MASK; > pmd_t entry; > - int i, ret; > + int i; > + vm_fault_t ret; > > if (!transhuge_vma_suitable(vma, haddr)) > return VM_FAULT_FALLBACK; > @@ -3383,7 +3384,7 @@ static int do_set_pmd(struct vm_fault *vmf, struct page *page) > return ret; > } > #else > -static int do_set_pmd(struct vm_fault *vmf, struct page *page) > +static vm_fault_t do_set_pmd(struct vm_fault *vmf, struct page *page) > { > BUILD_BUG(); > return 0; > @@ -3404,13 +3405,13 @@ static int do_set_pmd(struct vm_fault *vmf, struct page *page) > * Target users are page handler itself and implementations of > * vm_ops->map_pages. > */ > -int alloc_set_pte(struct vm_fault *vmf, struct mem_cgroup *memcg, > +vm_fault_t alloc_set_pte(struct vm_fault *vmf, struct mem_cgroup *memcg, > struct page *page) > { > struct vm_area_struct *vma = vmf->vma; > bool write = vmf->flags & FAULT_FLAG_WRITE; > pte_t entry; > - int ret; > + vm_fault_t ret; > > if (pmd_none(*vmf->pmd) && PageTransCompound(page) && > IS_ENABLED(CONFIG_TRANSPARENT_HUGE_PAGECACHE)) { > @@ -3469,10 +3470,10 @@ int alloc_set_pte(struct vm_fault *vmf, struct mem_cgroup *memcg, > * The function expects the page to be locked and on success it consumes a > * reference of a page being mapped (for the PTE which maps it). > */ > -int finish_fault(struct vm_fault *vmf) > +vm_fault_t finish_fault(struct vm_fault *vmf) > { > struct page *page; > - int ret = 0; > + vm_fault_t ret = 0; > > /* Did we COW the page? */ > if ((vmf->flags & FAULT_FLAG_WRITE) && > @@ -3558,12 +3559,13 @@ static int __init fault_around_debugfs(void) > * (and therefore to page order). This way it's easier to guarantee > * that we don't cross page table boundaries. > */ > -static int do_fault_around(struct vm_fault *vmf) > +static vm_fault_t do_fault_around(struct vm_fault *vmf) > { > unsigned long address = vmf->address, nr_pages, mask; > pgoff_t start_pgoff = vmf->pgoff; > pgoff_t end_pgoff; > - int off, ret = 0; > + int off; > + vm_fault_t ret = 0; > > nr_pages = READ_ONCE(fault_around_bytes) >> PAGE_SHIFT; > mask = ~(nr_pages * PAGE_SIZE - 1) & PAGE_MASK; > @@ -3613,10 +3615,10 @@ static int do_fault_around(struct vm_fault *vmf) > return ret; > } > > -static int do_read_fault(struct vm_fault *vmf) > +static vm_fault_t do_read_fault(struct vm_fault *vmf) > { > struct vm_area_struct *vma = vmf->vma; > - int ret = 0; > + vm_fault_t ret = 0; > > /* > * Let's call ->map_pages() first and use ->fault() as fallback > @@ -3640,10 +3642,10 @@ static int do_read_fault(struct vm_fault *vmf) > return ret; > } > > -static int do_cow_fault(struct vm_fault *vmf) > +static vm_fault_t do_cow_fault(struct vm_fault *vmf) > { > struct vm_area_struct *vma = vmf->vma; > - int ret; > + vm_fault_t ret; > > if (unlikely(anon_vma_prepare(vma))) > return VM_FAULT_OOM; > @@ -3679,10 +3681,10 @@ static int do_cow_fault(struct vm_fault *vmf) > return ret; > } > > -static int do_shared_fault(struct vm_fault *vmf) > +static vm_fault_t do_shared_fault(struct vm_fault *vmf) > { > struct vm_area_struct *vma = vmf->vma; > - int ret, tmp; > + vm_fault_t ret, tmp; > > ret = __do_fault(vmf); > if (unlikely(ret & (VM_FAULT_ERROR | VM_FAULT_NOPAGE | VM_FAULT_RETRY))) > @@ -3720,10 +3722,10 @@ static int do_shared_fault(struct vm_fault *vmf) > * The mmap_sem may have been released depending on flags and our > * return value. See filemap_fault() and __lock_page_or_retry(). > */ > -static int do_fault(struct vm_fault *vmf) > +static vm_fault_t do_fault(struct vm_fault *vmf) > { > struct vm_area_struct *vma = vmf->vma; > - int ret; > + vm_fault_t ret; > > /* The VMA was not fully populated on mmap() or missing VM_DONTEXPAND */ > if (!vma->vm_ops->fault) > @@ -3758,7 +3760,7 @@ static int numa_migrate_prep(struct page *page, struct vm_area_struct *vma, > return mpol_misplaced(page, vma, addr); > } > > -static int do_numa_page(struct vm_fault *vmf) > +static vm_fault_t do_numa_page(struct vm_fault *vmf) > { > struct vm_area_struct *vma = vmf->vma; > struct page *page = NULL; > @@ -3848,7 +3850,7 @@ static int do_numa_page(struct vm_fault *vmf) > return 0; > } > > -static inline int create_huge_pmd(struct vm_fault *vmf) > +static inline vm_fault_t create_huge_pmd(struct vm_fault *vmf) > { > if (vma_is_anonymous(vmf->vma)) > return do_huge_pmd_anonymous_page(vmf); > @@ -3858,7 +3860,7 @@ static inline int create_huge_pmd(struct vm_fault *vmf) > } > > /* `inline' is required to avoid gcc 4.1.2 build error */ > -static inline int wp_huge_pmd(struct vm_fault *vmf, pmd_t orig_pmd) > +static inline vm_fault_t wp_huge_pmd(struct vm_fault *vmf, pmd_t orig_pmd) > { > if (vma_is_anonymous(vmf->vma)) > return do_huge_pmd_wp_page(vmf, orig_pmd); > @@ -3877,7 +3879,7 @@ static inline bool vma_is_accessible(struct vm_area_struct *vma) > return vma->vm_flags & (VM_READ | VM_EXEC | VM_WRITE); > } > > -static int create_huge_pud(struct vm_fault *vmf) > +static vm_fault_t create_huge_pud(struct vm_fault *vmf) > { > #ifdef CONFIG_TRANSPARENT_HUGEPAGE > /* No support for anonymous transparent PUD pages yet */ > @@ -3889,7 +3891,7 @@ static int create_huge_pud(struct vm_fault *vmf) > return VM_FAULT_FALLBACK; > } > > -static int wp_huge_pud(struct vm_fault *vmf, pud_t orig_pud) > +static vm_fault_t wp_huge_pud(struct vm_fault *vmf, pud_t orig_pud) > { > #ifdef CONFIG_TRANSPARENT_HUGEPAGE > /* No support for anonymous transparent PUD pages yet */ > @@ -3916,7 +3918,7 @@ static int wp_huge_pud(struct vm_fault *vmf, pud_t orig_pud) > * The mmap_sem may have been released depending on flags and our return value. > * See filemap_fault() and __lock_page_or_retry(). > */ > -static int handle_pte_fault(struct vm_fault *vmf) > +static vm_fault_t handle_pte_fault(struct vm_fault *vmf) > { > pte_t entry; > > @@ -4004,8 +4006,8 @@ static int handle_pte_fault(struct vm_fault *vmf) > * The mmap_sem may have been released depending on flags and our > * return value. See filemap_fault() and __lock_page_or_retry(). > */ > -static int __handle_mm_fault(struct vm_area_struct *vma, unsigned long address, > - unsigned int flags) > +static vm_fault_t __handle_mm_fault(struct vm_area_struct *vma, > + unsigned long address, unsigned int flags) > { > struct vm_fault vmf = { > .vma = vma, > @@ -4018,7 +4020,7 @@ static int __handle_mm_fault(struct vm_area_struct *vma, unsigned long address, > struct mm_struct *mm = vma->vm_mm; > pgd_t *pgd; > p4d_t *p4d; > - int ret; > + vm_fault_t ret; > > pgd = pgd_offset(mm, address); > p4d = p4d_alloc(mm, pgd, address); > @@ -4093,10 +4095,10 @@ static int __handle_mm_fault(struct vm_area_struct *vma, unsigned long address, > * The mmap_sem may have been released depending on flags and our > * return value. See filemap_fault() and __lock_page_or_retry(). > */ > -int handle_mm_fault(struct vm_area_struct *vma, unsigned long address, > +vm_fault_t handle_mm_fault(struct vm_area_struct *vma, unsigned long address, > unsigned int flags) > { > - int ret; > + vm_fault_t ret; > > __set_current_state(TASK_RUNNING); > > diff --git a/mm/shmem.c b/mm/shmem.c > index 9d6c7e5..af05c35 100644 > --- a/mm/shmem.c > +++ b/mm/shmem.c > @@ -123,7 +123,7 @@ static int shmem_replace_page(struct page **pagep, gfp_t gfp, > static int shmem_getpage_gfp(struct inode *inode, pgoff_t index, > struct page **pagep, enum sgp_type sgp, > gfp_t gfp, struct vm_area_struct *vma, > - struct vm_fault *vmf, int *fault_type); > + struct vm_fault *vmf, vm_fault_t *fault_type); > > int shmem_getpage(struct inode *inode, pgoff_t index, > struct page **pagep, enum sgp_type sgp) > @@ -1604,7 +1604,8 @@ static int shmem_replace_page(struct page **pagep, gfp_t gfp, > */ > static int shmem_getpage_gfp(struct inode *inode, pgoff_t index, > struct page **pagep, enum sgp_type sgp, gfp_t gfp, > - struct vm_area_struct *vma, struct vm_fault *vmf, int *fault_type) > + struct vm_area_struct *vma, struct vm_fault *vmf, > + vm_fault_t *fault_type) > { > struct address_space *mapping = inode->i_mapping; > struct shmem_inode_info *info = SHMEM_I(inode); > @@ -1931,14 +1932,14 @@ static int synchronous_wake_function(wait_queue_entry_t *wait, unsigned mode, in > return ret; > } > > -static int shmem_fault(struct vm_fault *vmf) > +static vm_fault_t shmem_fault(struct vm_fault *vmf) > { > struct vm_area_struct *vma = vmf->vma; > struct inode *inode = file_inode(vma->vm_file); > gfp_t gfp = mapping_gfp_mask(inode->i_mapping); > enum sgp_type sgp; > - int error; > - int ret = VM_FAULT_LOCKED; > + int err; > + vm_fault_t ret = VM_FAULT_LOCKED; > > /* > * Trinity finds that probing a hole which tmpfs is punching can > @@ -2006,10 +2007,10 @@ static int shmem_fault(struct vm_fault *vmf) > else if (vma->vm_flags & VM_HUGEPAGE) > sgp = SGP_HUGE; > > - error = shmem_getpage_gfp(inode, vmf->pgoff, &vmf->page, sgp, > + err = shmem_getpage_gfp(inode, vmf->pgoff, &vmf->page, sgp, > gfp, vma, vmf, &ret); > - if (error) > - return ((error == -ENOMEM) ? VM_FAULT_OOM : VM_FAULT_SIGBUS); > + if (err) > + ret = vmf_error(err); > return ret; > } > > -- > 1.9.1 > Any further comment on this patch ?
On Tue, Jun 19, 2018 at 10:26 AM, Souptick Joarder <jrdr.linux@gmail.com> wrote: > On Mon, Jun 4, 2018 at 10:47 PM, Souptick Joarder <jrdr.linux@gmail.com> wrote: >> Use new return type vm_fault_t for fault handler. For >> now, this is just documenting that the function returns >> a VM_FAULT value rather than an errno. Once all instances >> are converted, vm_fault_t will become a distinct type. >> >> Ref-> commit 1c8f422059ae ("mm: change return type to vm_fault_t") >> >> The aim is to change the return type of finish_fault() >> and handle_mm_fault() to vm_fault_t type. As part of >> that clean up return type of all other recursively called >> functions have been changed to vm_fault_t type. >> >> The places from where handle_mm_fault() is getting invoked >> will be change to vm_fault_t type but in a separate patch. >> >> vmf_error() is the newly introduce inline function >> in 4.17-rc6. >> >> Signed-off-by: Souptick Joarder <jrdr.linux@gmail.com> >> Reviewed-by: Matthew Wilcox <mawilcox@microsoft.com> >> --- >> v2: Change patch title and fixed sparse warning. >> >> v3: Reviewed by Matthew Wilcox >> >> fs/userfaultfd.c | 6 +-- >> include/linux/huge_mm.h | 10 +++-- >> include/linux/hugetlb.h | 2 +- >> include/linux/mm.h | 14 +++---- >> include/linux/oom.h | 2 +- >> include/linux/swapops.h | 5 ++- >> include/linux/userfaultfd_k.h | 5 ++- >> kernel/memremap.c | 2 +- >> mm/gup.c | 4 +- >> mm/huge_memory.c | 25 ++++++------ >> mm/hugetlb.c | 29 +++++++------- >> mm/internal.h | 2 +- >> mm/khugepaged.c | 3 +- >> mm/memory.c | 90 ++++++++++++++++++++++--------------------- >> mm/shmem.c | 17 ++++---- >> 15 files changed, 110 insertions(+), 106 deletions(-) >> >> diff --git a/fs/userfaultfd.c b/fs/userfaultfd.c >> index cec550c..bf60c6a 100644 >> --- a/fs/userfaultfd.c >> +++ b/fs/userfaultfd.c >> @@ -336,17 +336,15 @@ static inline bool userfaultfd_must_wait(struct userfaultfd_ctx *ctx, >> * fatal_signal_pending()s, and the mmap_sem must be released before >> * returning it. >> */ >> -int handle_userfault(struct vm_fault *vmf, unsigned long reason) >> +vm_fault_t handle_userfault(struct vm_fault *vmf, unsigned long reason) >> { >> struct mm_struct *mm = vmf->vma->vm_mm; >> struct userfaultfd_ctx *ctx; >> struct userfaultfd_wait_queue uwq; >> - int ret; >> + vm_fault_t ret = VM_FAULT_SIGBUS; >> bool must_wait, return_to_userland; >> long blocking_state; >> >> - ret = VM_FAULT_SIGBUS; >> - >> /* >> * We don't do userfault handling for the final child pid update. >> * >> diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h >> index a8a1262..8c4f0a6 100644 >> --- a/include/linux/huge_mm.h >> +++ b/include/linux/huge_mm.h >> @@ -3,10 +3,11 @@ >> #define _LINUX_HUGE_MM_H >> >> #include <linux/sched/coredump.h> >> +#include <linux/mm_types.h> >> >> #include <linux/fs.h> /* only for vma_is_dax() */ >> >> -extern int do_huge_pmd_anonymous_page(struct vm_fault *vmf); >> +extern vm_fault_t do_huge_pmd_anonymous_page(struct vm_fault *vmf); >> extern int copy_huge_pmd(struct mm_struct *dst_mm, struct mm_struct *src_mm, >> pmd_t *dst_pmd, pmd_t *src_pmd, unsigned long addr, >> struct vm_area_struct *vma); >> @@ -23,7 +24,7 @@ static inline void huge_pud_set_accessed(struct vm_fault *vmf, pud_t orig_pud) >> } >> #endif >> >> -extern int do_huge_pmd_wp_page(struct vm_fault *vmf, pmd_t orig_pmd); >> +extern vm_fault_t do_huge_pmd_wp_page(struct vm_fault *vmf, pmd_t orig_pmd); >> extern struct page *follow_trans_huge_pmd(struct vm_area_struct *vma, >> unsigned long addr, >> pmd_t *pmd, >> @@ -216,7 +217,7 @@ struct page *follow_devmap_pmd(struct vm_area_struct *vma, unsigned long addr, >> struct page *follow_devmap_pud(struct vm_area_struct *vma, unsigned long addr, >> pud_t *pud, int flags); >> >> -extern int do_huge_pmd_numa_page(struct vm_fault *vmf, pmd_t orig_pmd); >> +extern vm_fault_t do_huge_pmd_numa_page(struct vm_fault *vmf, pmd_t orig_pmd); >> >> extern struct page *huge_zero_page; >> >> @@ -321,7 +322,8 @@ static inline spinlock_t *pud_trans_huge_lock(pud_t *pud, >> return NULL; >> } >> >> -static inline int do_huge_pmd_numa_page(struct vm_fault *vmf, pmd_t orig_pmd) >> +static inline vm_fault_t do_huge_pmd_numa_page(struct vm_fault *vmf, >> + pmd_t orig_pmd) >> { >> return 0; >> } >> diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h >> index 36fa6a2..c779b2f 100644 >> --- a/include/linux/hugetlb.h >> +++ b/include/linux/hugetlb.h >> @@ -105,7 +105,7 @@ void __unmap_hugepage_range(struct mmu_gather *tlb, struct vm_area_struct *vma, >> int hugetlb_report_node_meminfo(int, char *); >> void hugetlb_show_meminfo(void); >> unsigned long hugetlb_total_pages(void); >> -int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma, >> +vm_fault_t hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma, >> unsigned long address, unsigned int flags); >> int hugetlb_mcopy_atomic_pte(struct mm_struct *dst_mm, pte_t *dst_pte, >> struct vm_area_struct *dst_vma, >> diff --git a/include/linux/mm.h b/include/linux/mm.h >> index 02a616e..2971bff 100644 >> --- a/include/linux/mm.h >> +++ b/include/linux/mm.h >> @@ -694,10 +694,10 @@ static inline pte_t maybe_mkwrite(pte_t pte, struct vm_area_struct *vma) >> return pte; >> } >> >> -int alloc_set_pte(struct vm_fault *vmf, struct mem_cgroup *memcg, >> +vm_fault_t alloc_set_pte(struct vm_fault *vmf, struct mem_cgroup *memcg, >> struct page *page); >> -int finish_fault(struct vm_fault *vmf); >> -int finish_mkwrite_fault(struct vm_fault *vmf); >> +vm_fault_t finish_fault(struct vm_fault *vmf); >> +vm_fault_t finish_mkwrite_fault(struct vm_fault *vmf); >> #endif >> >> /* >> @@ -1343,8 +1343,8 @@ int generic_access_phys(struct vm_area_struct *vma, unsigned long addr, >> int invalidate_inode_page(struct page *page); >> >> #ifdef CONFIG_MMU >> -extern int handle_mm_fault(struct vm_area_struct *vma, unsigned long address, >> - unsigned int flags); >> +extern vm_fault_t handle_mm_fault(struct vm_area_struct *vma, >> + unsigned long address, unsigned int flags); >> extern int fixup_user_fault(struct task_struct *tsk, struct mm_struct *mm, >> unsigned long address, unsigned int fault_flags, >> bool *unlocked); >> @@ -1353,7 +1353,7 @@ void unmap_mapping_pages(struct address_space *mapping, >> void unmap_mapping_range(struct address_space *mapping, >> loff_t const holebegin, loff_t const holelen, int even_cows); >> #else >> -static inline int handle_mm_fault(struct vm_area_struct *vma, >> +static inline vm_fault_t handle_mm_fault(struct vm_area_struct *vma, >> unsigned long address, unsigned int flags) >> { >> /* should never happen if there's no MMU */ >> @@ -2501,7 +2501,7 @@ static inline struct page *follow_page(struct vm_area_struct *vma, >> #define FOLL_COW 0x4000 /* internal GUP flag */ >> #define FOLL_ANON 0x8000 /* don't do file mappings */ >> >> -static inline int vm_fault_to_errno(int vm_fault, int foll_flags) >> +static inline int vm_fault_to_errno(vm_fault_t vm_fault, int foll_flags) >> { >> if (vm_fault & VM_FAULT_OOM) >> return -ENOMEM; >> diff --git a/include/linux/oom.h b/include/linux/oom.h >> index 6adac11..9d30c15 100644 >> --- a/include/linux/oom.h >> +++ b/include/linux/oom.h >> @@ -88,7 +88,7 @@ static inline bool mm_is_oom_victim(struct mm_struct *mm) >> * >> * Return 0 when the PF is safe VM_FAULT_SIGBUS otherwise. >> */ >> -static inline int check_stable_address_space(struct mm_struct *mm) >> +static inline vm_fault_t check_stable_address_space(struct mm_struct *mm) >> { >> if (unlikely(test_bit(MMF_UNSTABLE, &mm->flags))) >> return VM_FAULT_SIGBUS; >> diff --git a/include/linux/swapops.h b/include/linux/swapops.h >> index 1d3877c..9bc8ddb 100644 >> --- a/include/linux/swapops.h >> +++ b/include/linux/swapops.h >> @@ -4,6 +4,7 @@ >> >> #include <linux/radix-tree.h> >> #include <linux/bug.h> >> +#include <linux/mm_types.h> >> >> /* >> * swapcache pages are stored in the swapper_space radix tree. We want to >> @@ -134,7 +135,7 @@ static inline struct page *device_private_entry_to_page(swp_entry_t entry) >> return pfn_to_page(swp_offset(entry)); >> } >> >> -int device_private_entry_fault(struct vm_area_struct *vma, >> +vm_fault_t device_private_entry_fault(struct vm_area_struct *vma, >> unsigned long addr, >> swp_entry_t entry, >> unsigned int flags, >> @@ -169,7 +170,7 @@ static inline struct page *device_private_entry_to_page(swp_entry_t entry) >> return NULL; >> } >> >> -static inline int device_private_entry_fault(struct vm_area_struct *vma, >> +static inline vm_fault_t device_private_entry_fault(struct vm_area_struct *vma, >> unsigned long addr, >> swp_entry_t entry, >> unsigned int flags, >> diff --git a/include/linux/userfaultfd_k.h b/include/linux/userfaultfd_k.h >> index f2f3b68..1f36c80 100644 >> --- a/include/linux/userfaultfd_k.h >> +++ b/include/linux/userfaultfd_k.h >> @@ -28,7 +28,7 @@ >> #define UFFD_SHARED_FCNTL_FLAGS (O_CLOEXEC | O_NONBLOCK) >> #define UFFD_FLAGS_SET (EFD_SHARED_FCNTL_FLAGS) >> >> -extern int handle_userfault(struct vm_fault *vmf, unsigned long reason); >> +extern vm_fault_t handle_userfault(struct vm_fault *vmf, unsigned long reason); >> >> extern ssize_t mcopy_atomic(struct mm_struct *dst_mm, unsigned long dst_start, >> unsigned long src_start, unsigned long len); >> @@ -75,7 +75,8 @@ extern void userfaultfd_unmap_complete(struct mm_struct *mm, >> #else /* CONFIG_USERFAULTFD */ >> >> /* mm helpers */ >> -static inline int handle_userfault(struct vm_fault *vmf, unsigned long reason) >> +static inline vm_fault_t handle_userfault(struct vm_fault *vmf, >> + unsigned long reason) >> { >> return VM_FAULT_SIGBUS; >> } >> diff --git a/kernel/memremap.c b/kernel/memremap.c >> index 895e6b7..d148d09 100644 >> --- a/kernel/memremap.c >> +++ b/kernel/memremap.c >> @@ -214,7 +214,7 @@ static unsigned long order_at(struct resource *res, unsigned long pgoff) >> pgoff += 1UL << order, order = order_at((res), pgoff)) >> >> #if IS_ENABLED(CONFIG_DEVICE_PRIVATE) >> -int device_private_entry_fault(struct vm_area_struct *vma, >> +vm_fault_t device_private_entry_fault(struct vm_area_struct *vma, >> unsigned long addr, >> swp_entry_t entry, >> unsigned int flags, >> diff --git a/mm/gup.c b/mm/gup.c >> index 541904a..e3a957e 100644 >> --- a/mm/gup.c >> +++ b/mm/gup.c >> @@ -481,7 +481,7 @@ static int faultin_page(struct task_struct *tsk, struct vm_area_struct *vma, >> unsigned long address, unsigned int *flags, int *nonblocking) >> { >> unsigned int fault_flags = 0; >> - int ret; >> + vm_fault_t ret; >> >> /* mlock all present pages, but do not fault in new pages */ >> if ((*flags & (FOLL_POPULATE | FOLL_MLOCK)) == FOLL_MLOCK) >> @@ -802,7 +802,7 @@ int fixup_user_fault(struct task_struct *tsk, struct mm_struct *mm, >> bool *unlocked) >> { >> struct vm_area_struct *vma; >> - int ret, major = 0; >> + vm_fault_t ret, major = 0; >> >> if (unlocked) >> fault_flags |= FAULT_FLAG_ALLOW_RETRY; >> diff --git a/mm/huge_memory.c b/mm/huge_memory.c >> index a3a1815..82dc477 100644 >> --- a/mm/huge_memory.c >> +++ b/mm/huge_memory.c >> @@ -544,14 +544,14 @@ unsigned long thp_get_unmapped_area(struct file *filp, unsigned long addr, >> } >> EXPORT_SYMBOL_GPL(thp_get_unmapped_area); >> >> -static int __do_huge_pmd_anonymous_page(struct vm_fault *vmf, struct page *page, >> - gfp_t gfp) >> +static vm_fault_t __do_huge_pmd_anonymous_page(struct vm_fault *vmf, >> + struct page *page, gfp_t gfp) >> { >> struct vm_area_struct *vma = vmf->vma; >> struct mem_cgroup *memcg; >> pgtable_t pgtable; >> unsigned long haddr = vmf->address & HPAGE_PMD_MASK; >> - int ret = 0; >> + vm_fault_t ret = 0; >> >> VM_BUG_ON_PAGE(!PageCompound(page), page); >> >> @@ -587,7 +587,7 @@ static int __do_huge_pmd_anonymous_page(struct vm_fault *vmf, struct page *page, >> >> /* Deliver the page fault to userland */ >> if (userfaultfd_missing(vma)) { >> - int ret; >> + vm_fault_t ret; >> >> spin_unlock(vmf->ptl); >> mem_cgroup_cancel_charge(page, memcg, true); >> @@ -666,7 +666,7 @@ static bool set_huge_zero_page(pgtable_t pgtable, struct mm_struct *mm, >> return true; >> } >> >> -int do_huge_pmd_anonymous_page(struct vm_fault *vmf) >> +vm_fault_t do_huge_pmd_anonymous_page(struct vm_fault *vmf) >> { >> struct vm_area_struct *vma = vmf->vma; >> gfp_t gfp; >> @@ -685,7 +685,7 @@ int do_huge_pmd_anonymous_page(struct vm_fault *vmf) >> pgtable_t pgtable; >> struct page *zero_page; >> bool set; >> - int ret; >> + vm_fault_t ret; >> pgtable = pte_alloc_one(vma->vm_mm, haddr); >> if (unlikely(!pgtable)) >> return VM_FAULT_OOM; >> @@ -1121,15 +1121,16 @@ void huge_pmd_set_accessed(struct vm_fault *vmf, pmd_t orig_pmd) >> spin_unlock(vmf->ptl); >> } >> >> -static int do_huge_pmd_wp_page_fallback(struct vm_fault *vmf, pmd_t orig_pmd, >> - struct page *page) >> +static vm_fault_t do_huge_pmd_wp_page_fallback(struct vm_fault *vmf, >> + pmd_t orig_pmd, struct page *page) >> { >> struct vm_area_struct *vma = vmf->vma; >> unsigned long haddr = vmf->address & HPAGE_PMD_MASK; >> struct mem_cgroup *memcg; >> pgtable_t pgtable; >> pmd_t _pmd; >> - int ret = 0, i; >> + int i; >> + vm_fault_t ret = 0; >> struct page **pages; >> unsigned long mmun_start; /* For mmu_notifiers */ >> unsigned long mmun_end; /* For mmu_notifiers */ >> @@ -1239,7 +1240,7 @@ static int do_huge_pmd_wp_page_fallback(struct vm_fault *vmf, pmd_t orig_pmd, >> goto out; >> } >> >> -int do_huge_pmd_wp_page(struct vm_fault *vmf, pmd_t orig_pmd) >> +vm_fault_t do_huge_pmd_wp_page(struct vm_fault *vmf, pmd_t orig_pmd) >> { >> struct vm_area_struct *vma = vmf->vma; >> struct page *page = NULL, *new_page; >> @@ -1248,7 +1249,7 @@ int do_huge_pmd_wp_page(struct vm_fault *vmf, pmd_t orig_pmd) >> unsigned long mmun_start; /* For mmu_notifiers */ >> unsigned long mmun_end; /* For mmu_notifiers */ >> gfp_t huge_gfp; /* for allocation and charge */ >> - int ret = 0; >> + vm_fault_t ret = 0; >> >> vmf->ptl = pmd_lockptr(vma->vm_mm, vmf->pmd); >> VM_BUG_ON_VMA(!vma->anon_vma, vma); >> @@ -1459,7 +1460,7 @@ struct page *follow_trans_huge_pmd(struct vm_area_struct *vma, >> } >> >> /* NUMA hinting page fault entry point for trans huge pmds */ >> -int do_huge_pmd_numa_page(struct vm_fault *vmf, pmd_t pmd) >> +vm_fault_t do_huge_pmd_numa_page(struct vm_fault *vmf, pmd_t pmd) >> { >> struct vm_area_struct *vma = vmf->vma; >> struct anon_vma *anon_vma = NULL; >> diff --git a/mm/hugetlb.c b/mm/hugetlb.c >> index 2186791..d17b186 100644 >> --- a/mm/hugetlb.c >> +++ b/mm/hugetlb.c >> @@ -3499,14 +3499,15 @@ static void unmap_ref_private(struct mm_struct *mm, struct vm_area_struct *vma, >> * cannot race with other handlers or page migration. >> * Keep the pte_same checks anyway to make transition from the mutex easier. >> */ >> -static int hugetlb_cow(struct mm_struct *mm, struct vm_area_struct *vma, >> +static vm_fault_t hugetlb_cow(struct mm_struct *mm, struct vm_area_struct *vma, >> unsigned long address, pte_t *ptep, >> struct page *pagecache_page, spinlock_t *ptl) >> { >> pte_t pte; >> struct hstate *h = hstate_vma(vma); >> struct page *old_page, *new_page; >> - int ret = 0, outside_reserve = 0; >> + int outside_reserve = 0; >> + vm_fault_t ret = 0; >> unsigned long mmun_start; /* For mmu_notifiers */ >> unsigned long mmun_end; /* For mmu_notifiers */ >> >> @@ -3570,8 +3571,7 @@ static int hugetlb_cow(struct mm_struct *mm, struct vm_area_struct *vma, >> return 0; >> } >> >> - ret = (PTR_ERR(new_page) == -ENOMEM) ? >> - VM_FAULT_OOM : VM_FAULT_SIGBUS; >> + ret = vmf_error(PTR_ERR(new_page)); >> goto out_release_old; >> } >> >> @@ -3675,12 +3675,13 @@ int huge_add_to_page_cache(struct page *page, struct address_space *mapping, >> return 0; >> } >> >> -static int hugetlb_no_page(struct mm_struct *mm, struct vm_area_struct *vma, >> - struct address_space *mapping, pgoff_t idx, >> - unsigned long address, pte_t *ptep, unsigned int flags) >> +static vm_fault_t hugetlb_no_page(struct mm_struct *mm, >> + struct vm_area_struct *vma, >> + struct address_space *mapping, pgoff_t idx, >> + unsigned long address, pte_t *ptep, unsigned int flags) >> { >> struct hstate *h = hstate_vma(vma); >> - int ret = VM_FAULT_SIGBUS; >> + vm_fault_t ret = VM_FAULT_SIGBUS; >> int anon_rmap = 0; >> unsigned long size; >> struct page *page; >> @@ -3742,11 +3743,7 @@ static int hugetlb_no_page(struct mm_struct *mm, struct vm_area_struct *vma, >> >> page = alloc_huge_page(vma, address, 0); >> if (IS_ERR(page)) { >> - ret = PTR_ERR(page); >> - if (ret == -ENOMEM) >> - ret = VM_FAULT_OOM; >> - else >> - ret = VM_FAULT_SIGBUS; >> + ret = vmf_error(PTR_ERR(page)); >> goto out; >> } >> clear_huge_page(page, address, pages_per_huge_page(h)); >> @@ -3870,12 +3867,12 @@ u32 hugetlb_fault_mutex_hash(struct hstate *h, struct mm_struct *mm, >> } >> #endif >> >> -int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma, >> +vm_fault_t hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma, >> unsigned long address, unsigned int flags) >> { >> pte_t *ptep, entry; >> spinlock_t *ptl; >> - int ret; >> + vm_fault_t ret; >> u32 hash; >> pgoff_t idx; >> struct page *page = NULL; >> @@ -4206,7 +4203,7 @@ long follow_hugetlb_page(struct mm_struct *mm, struct vm_area_struct *vma, >> if (absent || is_swap_pte(huge_ptep_get(pte)) || >> ((flags & FOLL_WRITE) && >> !huge_pte_write(huge_ptep_get(pte)))) { >> - int ret; >> + vm_fault_t ret; >> unsigned int fault_flags = 0; >> >> if (pte) >> diff --git a/mm/internal.h b/mm/internal.h >> index 502d141..4044456 100644 >> --- a/mm/internal.h >> +++ b/mm/internal.h >> @@ -38,7 +38,7 @@ >> >> void page_writeback_init(void); >> >> -int do_swap_page(struct vm_fault *vmf); >> +vm_fault_t do_swap_page(struct vm_fault *vmf); >> >> void free_pgtables(struct mmu_gather *tlb, struct vm_area_struct *start_vma, >> unsigned long floor, unsigned long ceiling); >> diff --git a/mm/khugepaged.c b/mm/khugepaged.c >> index d7b2a4b..778fd40 100644 >> --- a/mm/khugepaged.c >> +++ b/mm/khugepaged.c >> @@ -880,7 +880,8 @@ static bool __collapse_huge_page_swapin(struct mm_struct *mm, >> unsigned long address, pmd_t *pmd, >> int referenced) >> { >> - int swapped_in = 0, ret = 0; >> + int swapped_in = 0; >> + vm_fault_t ret = 0; >> struct vm_fault vmf = { >> .vma = vma, >> .address = address, >> diff --git a/mm/memory.c b/mm/memory.c >> index 01f5464..cee8245 100644 >> --- a/mm/memory.c >> +++ b/mm/memory.c >> @@ -2360,9 +2360,9 @@ static gfp_t __get_fault_gfp_mask(struct vm_area_struct *vma) >> * >> * We do this without the lock held, so that it can sleep if it needs to. >> */ >> -static int do_page_mkwrite(struct vm_fault *vmf) >> +static vm_fault_t do_page_mkwrite(struct vm_fault *vmf) >> { >> - int ret; >> + vm_fault_t ret; >> struct page *page = vmf->page; >> unsigned int old_flags = vmf->flags; >> >> @@ -2466,7 +2466,7 @@ static inline void wp_page_reuse(struct vm_fault *vmf) >> * held to the old page, as well as updating the rmap. >> * - In any case, unlock the PTL and drop the reference we took to the old page. >> */ >> -static int wp_page_copy(struct vm_fault *vmf) >> +static vm_fault_t wp_page_copy(struct vm_fault *vmf) >> { >> struct vm_area_struct *vma = vmf->vma; >> struct mm_struct *mm = vma->vm_mm; >> @@ -2614,7 +2614,7 @@ static int wp_page_copy(struct vm_fault *vmf) >> * The function expects the page to be locked or other protection against >> * concurrent faults / writeback (such as DAX radix tree locks). >> */ >> -int finish_mkwrite_fault(struct vm_fault *vmf) >> +vm_fault_t finish_mkwrite_fault(struct vm_fault *vmf) >> { >> WARN_ON_ONCE(!(vmf->vma->vm_flags & VM_SHARED)); >> vmf->pte = pte_offset_map_lock(vmf->vma->vm_mm, vmf->pmd, vmf->address, >> @@ -2635,12 +2635,12 @@ int finish_mkwrite_fault(struct vm_fault *vmf) >> * Handle write page faults for VM_MIXEDMAP or VM_PFNMAP for a VM_SHARED >> * mapping >> */ >> -static int wp_pfn_shared(struct vm_fault *vmf) >> +static vm_fault_t wp_pfn_shared(struct vm_fault *vmf) >> { >> struct vm_area_struct *vma = vmf->vma; >> >> if (vma->vm_ops && vma->vm_ops->pfn_mkwrite) { >> - int ret; >> + vm_fault_t ret; >> >> pte_unmap_unlock(vmf->pte, vmf->ptl); >> vmf->flags |= FAULT_FLAG_MKWRITE; >> @@ -2653,7 +2653,7 @@ static int wp_pfn_shared(struct vm_fault *vmf) >> return VM_FAULT_WRITE; >> } >> >> -static int wp_page_shared(struct vm_fault *vmf) >> +static vm_fault_t wp_page_shared(struct vm_fault *vmf) >> __releases(vmf->ptl) >> { >> struct vm_area_struct *vma = vmf->vma; >> @@ -2661,7 +2661,7 @@ static int wp_page_shared(struct vm_fault *vmf) >> get_page(vmf->page); >> >> if (vma->vm_ops && vma->vm_ops->page_mkwrite) { >> - int tmp; >> + vm_fault_t tmp; >> >> pte_unmap_unlock(vmf->pte, vmf->ptl); >> tmp = do_page_mkwrite(vmf); >> @@ -2704,7 +2704,7 @@ static int wp_page_shared(struct vm_fault *vmf) >> * but allow concurrent faults), with pte both mapped and locked. >> * We return with mmap_sem still held, but pte unmapped and unlocked. >> */ >> -static int do_wp_page(struct vm_fault *vmf) >> +static vm_fault_t do_wp_page(struct vm_fault *vmf) >> __releases(vmf->ptl) >> { >> struct vm_area_struct *vma = vmf->vma; >> @@ -2880,7 +2880,7 @@ void unmap_mapping_range(struct address_space *mapping, >> * We return with the mmap_sem locked or unlocked in the same cases >> * as does filemap_fault(). >> */ >> -int do_swap_page(struct vm_fault *vmf) >> +vm_fault_t do_swap_page(struct vm_fault *vmf) >> { >> struct vm_area_struct *vma = vmf->vma; >> struct page *page = NULL, *swapcache; >> @@ -2889,7 +2889,7 @@ int do_swap_page(struct vm_fault *vmf) >> pte_t pte; >> int locked; >> int exclusive = 0; >> - int ret = 0; >> + vm_fault_t ret = 0; >> >> if (!pte_unmap_same(vma->vm_mm, vmf->pmd, vmf->pte, vmf->orig_pte)) >> goto out; >> @@ -3100,12 +3100,12 @@ int do_swap_page(struct vm_fault *vmf) >> * but allow concurrent faults), and pte mapped but not yet locked. >> * We return with mmap_sem still held, but pte unmapped and unlocked. >> */ >> -static int do_anonymous_page(struct vm_fault *vmf) >> +static vm_fault_t do_anonymous_page(struct vm_fault *vmf) >> { >> struct vm_area_struct *vma = vmf->vma; >> struct mem_cgroup *memcg; >> struct page *page; >> - int ret = 0; >> + vm_fault_t ret = 0; >> pte_t entry; >> >> /* File mapping without ->vm_ops ? */ >> @@ -3214,10 +3214,10 @@ static int do_anonymous_page(struct vm_fault *vmf) >> * released depending on flags and vma->vm_ops->fault() return value. >> * See filemap_fault() and __lock_page_retry(). >> */ >> -static int __do_fault(struct vm_fault *vmf) >> +static vm_fault_t __do_fault(struct vm_fault *vmf) >> { >> struct vm_area_struct *vma = vmf->vma; >> - int ret; >> + vm_fault_t ret; >> >> ret = vma->vm_ops->fault(vmf); >> if (unlikely(ret & (VM_FAULT_ERROR | VM_FAULT_NOPAGE | VM_FAULT_RETRY | >> @@ -3251,7 +3251,7 @@ static int pmd_devmap_trans_unstable(pmd_t *pmd) >> return pmd_devmap(*pmd) || pmd_trans_unstable(pmd); >> } >> >> -static int pte_alloc_one_map(struct vm_fault *vmf) >> +static vm_fault_t pte_alloc_one_map(struct vm_fault *vmf) >> { >> struct vm_area_struct *vma = vmf->vma; >> >> @@ -3327,13 +3327,14 @@ static void deposit_prealloc_pte(struct vm_fault *vmf) >> vmf->prealloc_pte = NULL; >> } >> >> -static int do_set_pmd(struct vm_fault *vmf, struct page *page) >> +static vm_fault_t do_set_pmd(struct vm_fault *vmf, struct page *page) >> { >> struct vm_area_struct *vma = vmf->vma; >> bool write = vmf->flags & FAULT_FLAG_WRITE; >> unsigned long haddr = vmf->address & HPAGE_PMD_MASK; >> pmd_t entry; >> - int i, ret; >> + int i; >> + vm_fault_t ret; >> >> if (!transhuge_vma_suitable(vma, haddr)) >> return VM_FAULT_FALLBACK; >> @@ -3383,7 +3384,7 @@ static int do_set_pmd(struct vm_fault *vmf, struct page *page) >> return ret; >> } >> #else >> -static int do_set_pmd(struct vm_fault *vmf, struct page *page) >> +static vm_fault_t do_set_pmd(struct vm_fault *vmf, struct page *page) >> { >> BUILD_BUG(); >> return 0; >> @@ -3404,13 +3405,13 @@ static int do_set_pmd(struct vm_fault *vmf, struct page *page) >> * Target users are page handler itself and implementations of >> * vm_ops->map_pages. >> */ >> -int alloc_set_pte(struct vm_fault *vmf, struct mem_cgroup *memcg, >> +vm_fault_t alloc_set_pte(struct vm_fault *vmf, struct mem_cgroup *memcg, >> struct page *page) >> { >> struct vm_area_struct *vma = vmf->vma; >> bool write = vmf->flags & FAULT_FLAG_WRITE; >> pte_t entry; >> - int ret; >> + vm_fault_t ret; >> >> if (pmd_none(*vmf->pmd) && PageTransCompound(page) && >> IS_ENABLED(CONFIG_TRANSPARENT_HUGE_PAGECACHE)) { >> @@ -3469,10 +3470,10 @@ int alloc_set_pte(struct vm_fault *vmf, struct mem_cgroup *memcg, >> * The function expects the page to be locked and on success it consumes a >> * reference of a page being mapped (for the PTE which maps it). >> */ >> -int finish_fault(struct vm_fault *vmf) >> +vm_fault_t finish_fault(struct vm_fault *vmf) >> { >> struct page *page; >> - int ret = 0; >> + vm_fault_t ret = 0; >> >> /* Did we COW the page? */ >> if ((vmf->flags & FAULT_FLAG_WRITE) && >> @@ -3558,12 +3559,13 @@ static int __init fault_around_debugfs(void) >> * (and therefore to page order). This way it's easier to guarantee >> * that we don't cross page table boundaries. >> */ >> -static int do_fault_around(struct vm_fault *vmf) >> +static vm_fault_t do_fault_around(struct vm_fault *vmf) >> { >> unsigned long address = vmf->address, nr_pages, mask; >> pgoff_t start_pgoff = vmf->pgoff; >> pgoff_t end_pgoff; >> - int off, ret = 0; >> + int off; >> + vm_fault_t ret = 0; >> >> nr_pages = READ_ONCE(fault_around_bytes) >> PAGE_SHIFT; >> mask = ~(nr_pages * PAGE_SIZE - 1) & PAGE_MASK; >> @@ -3613,10 +3615,10 @@ static int do_fault_around(struct vm_fault *vmf) >> return ret; >> } >> >> -static int do_read_fault(struct vm_fault *vmf) >> +static vm_fault_t do_read_fault(struct vm_fault *vmf) >> { >> struct vm_area_struct *vma = vmf->vma; >> - int ret = 0; >> + vm_fault_t ret = 0; >> >> /* >> * Let's call ->map_pages() first and use ->fault() as fallback >> @@ -3640,10 +3642,10 @@ static int do_read_fault(struct vm_fault *vmf) >> return ret; >> } >> >> -static int do_cow_fault(struct vm_fault *vmf) >> +static vm_fault_t do_cow_fault(struct vm_fault *vmf) >> { >> struct vm_area_struct *vma = vmf->vma; >> - int ret; >> + vm_fault_t ret; >> >> if (unlikely(anon_vma_prepare(vma))) >> return VM_FAULT_OOM; >> @@ -3679,10 +3681,10 @@ static int do_cow_fault(struct vm_fault *vmf) >> return ret; >> } >> >> -static int do_shared_fault(struct vm_fault *vmf) >> +static vm_fault_t do_shared_fault(struct vm_fault *vmf) >> { >> struct vm_area_struct *vma = vmf->vma; >> - int ret, tmp; >> + vm_fault_t ret, tmp; >> >> ret = __do_fault(vmf); >> if (unlikely(ret & (VM_FAULT_ERROR | VM_FAULT_NOPAGE | VM_FAULT_RETRY))) >> @@ -3720,10 +3722,10 @@ static int do_shared_fault(struct vm_fault *vmf) >> * The mmap_sem may have been released depending on flags and our >> * return value. See filemap_fault() and __lock_page_or_retry(). >> */ >> -static int do_fault(struct vm_fault *vmf) >> +static vm_fault_t do_fault(struct vm_fault *vmf) >> { >> struct vm_area_struct *vma = vmf->vma; >> - int ret; >> + vm_fault_t ret; >> >> /* The VMA was not fully populated on mmap() or missing VM_DONTEXPAND */ >> if (!vma->vm_ops->fault) >> @@ -3758,7 +3760,7 @@ static int numa_migrate_prep(struct page *page, struct vm_area_struct *vma, >> return mpol_misplaced(page, vma, addr); >> } >> >> -static int do_numa_page(struct vm_fault *vmf) >> +static vm_fault_t do_numa_page(struct vm_fault *vmf) >> { >> struct vm_area_struct *vma = vmf->vma; >> struct page *page = NULL; >> @@ -3848,7 +3850,7 @@ static int do_numa_page(struct vm_fault *vmf) >> return 0; >> } >> >> -static inline int create_huge_pmd(struct vm_fault *vmf) >> +static inline vm_fault_t create_huge_pmd(struct vm_fault *vmf) >> { >> if (vma_is_anonymous(vmf->vma)) >> return do_huge_pmd_anonymous_page(vmf); >> @@ -3858,7 +3860,7 @@ static inline int create_huge_pmd(struct vm_fault *vmf) >> } >> >> /* `inline' is required to avoid gcc 4.1.2 build error */ >> -static inline int wp_huge_pmd(struct vm_fault *vmf, pmd_t orig_pmd) >> +static inline vm_fault_t wp_huge_pmd(struct vm_fault *vmf, pmd_t orig_pmd) >> { >> if (vma_is_anonymous(vmf->vma)) >> return do_huge_pmd_wp_page(vmf, orig_pmd); >> @@ -3877,7 +3879,7 @@ static inline bool vma_is_accessible(struct vm_area_struct *vma) >> return vma->vm_flags & (VM_READ | VM_EXEC | VM_WRITE); >> } >> >> -static int create_huge_pud(struct vm_fault *vmf) >> +static vm_fault_t create_huge_pud(struct vm_fault *vmf) >> { >> #ifdef CONFIG_TRANSPARENT_HUGEPAGE >> /* No support for anonymous transparent PUD pages yet */ >> @@ -3889,7 +3891,7 @@ static int create_huge_pud(struct vm_fault *vmf) >> return VM_FAULT_FALLBACK; >> } >> >> -static int wp_huge_pud(struct vm_fault *vmf, pud_t orig_pud) >> +static vm_fault_t wp_huge_pud(struct vm_fault *vmf, pud_t orig_pud) >> { >> #ifdef CONFIG_TRANSPARENT_HUGEPAGE >> /* No support for anonymous transparent PUD pages yet */ >> @@ -3916,7 +3918,7 @@ static int wp_huge_pud(struct vm_fault *vmf, pud_t orig_pud) >> * The mmap_sem may have been released depending on flags and our return value. >> * See filemap_fault() and __lock_page_or_retry(). >> */ >> -static int handle_pte_fault(struct vm_fault *vmf) >> +static vm_fault_t handle_pte_fault(struct vm_fault *vmf) >> { >> pte_t entry; >> >> @@ -4004,8 +4006,8 @@ static int handle_pte_fault(struct vm_fault *vmf) >> * The mmap_sem may have been released depending on flags and our >> * return value. See filemap_fault() and __lock_page_or_retry(). >> */ >> -static int __handle_mm_fault(struct vm_area_struct *vma, unsigned long address, >> - unsigned int flags) >> +static vm_fault_t __handle_mm_fault(struct vm_area_struct *vma, >> + unsigned long address, unsigned int flags) >> { >> struct vm_fault vmf = { >> .vma = vma, >> @@ -4018,7 +4020,7 @@ static int __handle_mm_fault(struct vm_area_struct *vma, unsigned long address, >> struct mm_struct *mm = vma->vm_mm; >> pgd_t *pgd; >> p4d_t *p4d; >> - int ret; >> + vm_fault_t ret; >> >> pgd = pgd_offset(mm, address); >> p4d = p4d_alloc(mm, pgd, address); >> @@ -4093,10 +4095,10 @@ static int __handle_mm_fault(struct vm_area_struct *vma, unsigned long address, >> * The mmap_sem may have been released depending on flags and our >> * return value. See filemap_fault() and __lock_page_or_retry(). >> */ >> -int handle_mm_fault(struct vm_area_struct *vma, unsigned long address, >> +vm_fault_t handle_mm_fault(struct vm_area_struct *vma, unsigned long address, >> unsigned int flags) >> { >> - int ret; >> + vm_fault_t ret; >> >> __set_current_state(TASK_RUNNING); >> >> diff --git a/mm/shmem.c b/mm/shmem.c >> index 9d6c7e5..af05c35 100644 >> --- a/mm/shmem.c >> +++ b/mm/shmem.c >> @@ -123,7 +123,7 @@ static int shmem_replace_page(struct page **pagep, gfp_t gfp, >> static int shmem_getpage_gfp(struct inode *inode, pgoff_t index, >> struct page **pagep, enum sgp_type sgp, >> gfp_t gfp, struct vm_area_struct *vma, >> - struct vm_fault *vmf, int *fault_type); >> + struct vm_fault *vmf, vm_fault_t *fault_type); >> >> int shmem_getpage(struct inode *inode, pgoff_t index, >> struct page **pagep, enum sgp_type sgp) >> @@ -1604,7 +1604,8 @@ static int shmem_replace_page(struct page **pagep, gfp_t gfp, >> */ >> static int shmem_getpage_gfp(struct inode *inode, pgoff_t index, >> struct page **pagep, enum sgp_type sgp, gfp_t gfp, >> - struct vm_area_struct *vma, struct vm_fault *vmf, int *fault_type) >> + struct vm_area_struct *vma, struct vm_fault *vmf, >> + vm_fault_t *fault_type) >> { >> struct address_space *mapping = inode->i_mapping; >> struct shmem_inode_info *info = SHMEM_I(inode); >> @@ -1931,14 +1932,14 @@ static int synchronous_wake_function(wait_queue_entry_t *wait, unsigned mode, in >> return ret; >> } >> >> -static int shmem_fault(struct vm_fault *vmf) >> +static vm_fault_t shmem_fault(struct vm_fault *vmf) >> { >> struct vm_area_struct *vma = vmf->vma; >> struct inode *inode = file_inode(vma->vm_file); >> gfp_t gfp = mapping_gfp_mask(inode->i_mapping); >> enum sgp_type sgp; >> - int error; >> - int ret = VM_FAULT_LOCKED; >> + int err; >> + vm_fault_t ret = VM_FAULT_LOCKED; >> >> /* >> * Trinity finds that probing a hole which tmpfs is punching can >> @@ -2006,10 +2007,10 @@ static int shmem_fault(struct vm_fault *vmf) >> else if (vma->vm_flags & VM_HUGEPAGE) >> sgp = SGP_HUGE; >> >> - error = shmem_getpage_gfp(inode, vmf->pgoff, &vmf->page, sgp, >> + err = shmem_getpage_gfp(inode, vmf->pgoff, &vmf->page, sgp, >> gfp, vma, vmf, &ret); >> - if (error) >> - return ((error == -ENOMEM) ? VM_FAULT_OOM : VM_FAULT_SIGBUS); >> + if (err) >> + ret = vmf_error(err); >> return ret; >> } >> >> -- >> 1.9.1 >> > > Any further comment on this patch ? If no further comment, we would like to get this patch in queue for 4.19.
On Mon, 4 Jun 2018 22:47:27 +0530 Souptick Joarder <jrdr.linux@gmail.com> wrote: > Use new return type vm_fault_t for fault handler. For > now, this is just documenting that the function returns > a VM_FAULT value rather than an errno. Once all instances > are converted, vm_fault_t will become a distinct type. > > Ref-> commit 1c8f422059ae ("mm: change return type to vm_fault_t") > > The aim is to change the return type of finish_fault() > and handle_mm_fault() to vm_fault_t type. As part of > that clean up return type of all other recursively called > functions have been changed to vm_fault_t type. > > The places from where handle_mm_fault() is getting invoked > will be change to vm_fault_t type but in a separate patch. > > vmf_error() is the newly introduce inline function > in 4.17-rc6. Looks OK. For some reason the shmem.c changes are already present. One incidental fixup: From: Andrew Morton <akpm@linux-foundation.org> Subject: mm-change-return-type-int-to-vm_fault_t-for-fault-handlers-fix don't shadow outer local `ret' in __do_huge_pmd_anonymous_page() --- a/mm/huge_memory.c~mm-change-return-type-int-to-vm_fault_t-for-fault-handlers-fix +++ a/mm/huge_memory.c @@ -584,15 +584,15 @@ static vm_fault_t __do_huge_pmd_anonymou /* Deliver the page fault to userland */ if (userfaultfd_missing(vma)) { - vm_fault_t ret; + vm_fault_t ret2; spin_unlock(vmf->ptl); mem_cgroup_cancel_charge(page, memcg, true); put_page(page); pte_free(vma->vm_mm, pgtable); - ret = handle_userfault(vmf, VM_UFFD_MISSING); - VM_BUG_ON(ret & VM_FAULT_FALLBACK); - return ret; + ret2 = handle_userfault(vmf, VM_UFFD_MISSING); + VM_BUG_ON(ret2 & VM_FAULT_FALLBACK); + return ret2; } entry = mk_huge_pmd(page, vma->vm_page_prot);
diff --git a/fs/userfaultfd.c b/fs/userfaultfd.c index cec550c..bf60c6a 100644 --- a/fs/userfaultfd.c +++ b/fs/userfaultfd.c @@ -336,17 +336,15 @@ static inline bool userfaultfd_must_wait(struct userfaultfd_ctx *ctx, * fatal_signal_pending()s, and the mmap_sem must be released before * returning it. */ -int handle_userfault(struct vm_fault *vmf, unsigned long reason) +vm_fault_t handle_userfault(struct vm_fault *vmf, unsigned long reason) { struct mm_struct *mm = vmf->vma->vm_mm; struct userfaultfd_ctx *ctx; struct userfaultfd_wait_queue uwq; - int ret; + vm_fault_t ret = VM_FAULT_SIGBUS; bool must_wait, return_to_userland; long blocking_state; - ret = VM_FAULT_SIGBUS; - /* * We don't do userfault handling for the final child pid update. * diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h index a8a1262..8c4f0a6 100644 --- a/include/linux/huge_mm.h +++ b/include/linux/huge_mm.h @@ -3,10 +3,11 @@ #define _LINUX_HUGE_MM_H #include <linux/sched/coredump.h> +#include <linux/mm_types.h> #include <linux/fs.h> /* only for vma_is_dax() */ -extern int do_huge_pmd_anonymous_page(struct vm_fault *vmf); +extern vm_fault_t do_huge_pmd_anonymous_page(struct vm_fault *vmf); extern int copy_huge_pmd(struct mm_struct *dst_mm, struct mm_struct *src_mm, pmd_t *dst_pmd, pmd_t *src_pmd, unsigned long addr, struct vm_area_struct *vma); @@ -23,7 +24,7 @@ static inline void huge_pud_set_accessed(struct vm_fault *vmf, pud_t orig_pud) } #endif -extern int do_huge_pmd_wp_page(struct vm_fault *vmf, pmd_t orig_pmd); +extern vm_fault_t do_huge_pmd_wp_page(struct vm_fault *vmf, pmd_t orig_pmd); extern struct page *follow_trans_huge_pmd(struct vm_area_struct *vma, unsigned long addr, pmd_t *pmd, @@ -216,7 +217,7 @@ struct page *follow_devmap_pmd(struct vm_area_struct *vma, unsigned long addr, struct page *follow_devmap_pud(struct vm_area_struct *vma, unsigned long addr, pud_t *pud, int flags); -extern int do_huge_pmd_numa_page(struct vm_fault *vmf, pmd_t orig_pmd); +extern vm_fault_t do_huge_pmd_numa_page(struct vm_fault *vmf, pmd_t orig_pmd); extern struct page *huge_zero_page; @@ -321,7 +322,8 @@ static inline spinlock_t *pud_trans_huge_lock(pud_t *pud, return NULL; } -static inline int do_huge_pmd_numa_page(struct vm_fault *vmf, pmd_t orig_pmd) +static inline vm_fault_t do_huge_pmd_numa_page(struct vm_fault *vmf, + pmd_t orig_pmd) { return 0; } diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h index 36fa6a2..c779b2f 100644 --- a/include/linux/hugetlb.h +++ b/include/linux/hugetlb.h @@ -105,7 +105,7 @@ void __unmap_hugepage_range(struct mmu_gather *tlb, struct vm_area_struct *vma, int hugetlb_report_node_meminfo(int, char *); void hugetlb_show_meminfo(void); unsigned long hugetlb_total_pages(void); -int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma, +vm_fault_t hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma, unsigned long address, unsigned int flags); int hugetlb_mcopy_atomic_pte(struct mm_struct *dst_mm, pte_t *dst_pte, struct vm_area_struct *dst_vma, diff --git a/include/linux/mm.h b/include/linux/mm.h index 02a616e..2971bff 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -694,10 +694,10 @@ static inline pte_t maybe_mkwrite(pte_t pte, struct vm_area_struct *vma) return pte; } -int alloc_set_pte(struct vm_fault *vmf, struct mem_cgroup *memcg, +vm_fault_t alloc_set_pte(struct vm_fault *vmf, struct mem_cgroup *memcg, struct page *page); -int finish_fault(struct vm_fault *vmf); -int finish_mkwrite_fault(struct vm_fault *vmf); +vm_fault_t finish_fault(struct vm_fault *vmf); +vm_fault_t finish_mkwrite_fault(struct vm_fault *vmf); #endif /* @@ -1343,8 +1343,8 @@ int generic_access_phys(struct vm_area_struct *vma, unsigned long addr, int invalidate_inode_page(struct page *page); #ifdef CONFIG_MMU -extern int handle_mm_fault(struct vm_area_struct *vma, unsigned long address, - unsigned int flags); +extern vm_fault_t handle_mm_fault(struct vm_area_struct *vma, + unsigned long address, unsigned int flags); extern int fixup_user_fault(struct task_struct *tsk, struct mm_struct *mm, unsigned long address, unsigned int fault_flags, bool *unlocked); @@ -1353,7 +1353,7 @@ void unmap_mapping_pages(struct address_space *mapping, void unmap_mapping_range(struct address_space *mapping, loff_t const holebegin, loff_t const holelen, int even_cows); #else -static inline int handle_mm_fault(struct vm_area_struct *vma, +static inline vm_fault_t handle_mm_fault(struct vm_area_struct *vma, unsigned long address, unsigned int flags) { /* should never happen if there's no MMU */ @@ -2501,7 +2501,7 @@ static inline struct page *follow_page(struct vm_area_struct *vma, #define FOLL_COW 0x4000 /* internal GUP flag */ #define FOLL_ANON 0x8000 /* don't do file mappings */ -static inline int vm_fault_to_errno(int vm_fault, int foll_flags) +static inline int vm_fault_to_errno(vm_fault_t vm_fault, int foll_flags) { if (vm_fault & VM_FAULT_OOM) return -ENOMEM; diff --git a/include/linux/oom.h b/include/linux/oom.h index 6adac11..9d30c15 100644 --- a/include/linux/oom.h +++ b/include/linux/oom.h @@ -88,7 +88,7 @@ static inline bool mm_is_oom_victim(struct mm_struct *mm) * * Return 0 when the PF is safe VM_FAULT_SIGBUS otherwise. */ -static inline int check_stable_address_space(struct mm_struct *mm) +static inline vm_fault_t check_stable_address_space(struct mm_struct *mm) { if (unlikely(test_bit(MMF_UNSTABLE, &mm->flags))) return VM_FAULT_SIGBUS; diff --git a/include/linux/swapops.h b/include/linux/swapops.h index 1d3877c..9bc8ddb 100644 --- a/include/linux/swapops.h +++ b/include/linux/swapops.h @@ -4,6 +4,7 @@ #include <linux/radix-tree.h> #include <linux/bug.h> +#include <linux/mm_types.h> /* * swapcache pages are stored in the swapper_space radix tree. We want to @@ -134,7 +135,7 @@ static inline struct page *device_private_entry_to_page(swp_entry_t entry) return pfn_to_page(swp_offset(entry)); } -int device_private_entry_fault(struct vm_area_struct *vma, +vm_fault_t device_private_entry_fault(struct vm_area_struct *vma, unsigned long addr, swp_entry_t entry, unsigned int flags, @@ -169,7 +170,7 @@ static inline struct page *device_private_entry_to_page(swp_entry_t entry) return NULL; } -static inline int device_private_entry_fault(struct vm_area_struct *vma, +static inline vm_fault_t device_private_entry_fault(struct vm_area_struct *vma, unsigned long addr, swp_entry_t entry, unsigned int flags, diff --git a/include/linux/userfaultfd_k.h b/include/linux/userfaultfd_k.h index f2f3b68..1f36c80 100644 --- a/include/linux/userfaultfd_k.h +++ b/include/linux/userfaultfd_k.h @@ -28,7 +28,7 @@ #define UFFD_SHARED_FCNTL_FLAGS (O_CLOEXEC | O_NONBLOCK) #define UFFD_FLAGS_SET (EFD_SHARED_FCNTL_FLAGS) -extern int handle_userfault(struct vm_fault *vmf, unsigned long reason); +extern vm_fault_t handle_userfault(struct vm_fault *vmf, unsigned long reason); extern ssize_t mcopy_atomic(struct mm_struct *dst_mm, unsigned long dst_start, unsigned long src_start, unsigned long len); @@ -75,7 +75,8 @@ extern void userfaultfd_unmap_complete(struct mm_struct *mm, #else /* CONFIG_USERFAULTFD */ /* mm helpers */ -static inline int handle_userfault(struct vm_fault *vmf, unsigned long reason) +static inline vm_fault_t handle_userfault(struct vm_fault *vmf, + unsigned long reason) { return VM_FAULT_SIGBUS; } diff --git a/kernel/memremap.c b/kernel/memremap.c index 895e6b7..d148d09 100644 --- a/kernel/memremap.c +++ b/kernel/memremap.c @@ -214,7 +214,7 @@ static unsigned long order_at(struct resource *res, unsigned long pgoff) pgoff += 1UL << order, order = order_at((res), pgoff)) #if IS_ENABLED(CONFIG_DEVICE_PRIVATE) -int device_private_entry_fault(struct vm_area_struct *vma, +vm_fault_t device_private_entry_fault(struct vm_area_struct *vma, unsigned long addr, swp_entry_t entry, unsigned int flags, diff --git a/mm/gup.c b/mm/gup.c index 541904a..e3a957e 100644 --- a/mm/gup.c +++ b/mm/gup.c @@ -481,7 +481,7 @@ static int faultin_page(struct task_struct *tsk, struct vm_area_struct *vma, unsigned long address, unsigned int *flags, int *nonblocking) { unsigned int fault_flags = 0; - int ret; + vm_fault_t ret; /* mlock all present pages, but do not fault in new pages */ if ((*flags & (FOLL_POPULATE | FOLL_MLOCK)) == FOLL_MLOCK) @@ -802,7 +802,7 @@ int fixup_user_fault(struct task_struct *tsk, struct mm_struct *mm, bool *unlocked) { struct vm_area_struct *vma; - int ret, major = 0; + vm_fault_t ret, major = 0; if (unlocked) fault_flags |= FAULT_FLAG_ALLOW_RETRY; diff --git a/mm/huge_memory.c b/mm/huge_memory.c index a3a1815..82dc477 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -544,14 +544,14 @@ unsigned long thp_get_unmapped_area(struct file *filp, unsigned long addr, } EXPORT_SYMBOL_GPL(thp_get_unmapped_area); -static int __do_huge_pmd_anonymous_page(struct vm_fault *vmf, struct page *page, - gfp_t gfp) +static vm_fault_t __do_huge_pmd_anonymous_page(struct vm_fault *vmf, + struct page *page, gfp_t gfp) { struct vm_area_struct *vma = vmf->vma; struct mem_cgroup *memcg; pgtable_t pgtable; unsigned long haddr = vmf->address & HPAGE_PMD_MASK; - int ret = 0; + vm_fault_t ret = 0; VM_BUG_ON_PAGE(!PageCompound(page), page); @@ -587,7 +587,7 @@ static int __do_huge_pmd_anonymous_page(struct vm_fault *vmf, struct page *page, /* Deliver the page fault to userland */ if (userfaultfd_missing(vma)) { - int ret; + vm_fault_t ret; spin_unlock(vmf->ptl); mem_cgroup_cancel_charge(page, memcg, true); @@ -666,7 +666,7 @@ static bool set_huge_zero_page(pgtable_t pgtable, struct mm_struct *mm, return true; } -int do_huge_pmd_anonymous_page(struct vm_fault *vmf) +vm_fault_t do_huge_pmd_anonymous_page(struct vm_fault *vmf) { struct vm_area_struct *vma = vmf->vma; gfp_t gfp; @@ -685,7 +685,7 @@ int do_huge_pmd_anonymous_page(struct vm_fault *vmf) pgtable_t pgtable; struct page *zero_page; bool set; - int ret; + vm_fault_t ret; pgtable = pte_alloc_one(vma->vm_mm, haddr); if (unlikely(!pgtable)) return VM_FAULT_OOM; @@ -1121,15 +1121,16 @@ void huge_pmd_set_accessed(struct vm_fault *vmf, pmd_t orig_pmd) spin_unlock(vmf->ptl); } -static int do_huge_pmd_wp_page_fallback(struct vm_fault *vmf, pmd_t orig_pmd, - struct page *page) +static vm_fault_t do_huge_pmd_wp_page_fallback(struct vm_fault *vmf, + pmd_t orig_pmd, struct page *page) { struct vm_area_struct *vma = vmf->vma; unsigned long haddr = vmf->address & HPAGE_PMD_MASK; struct mem_cgroup *memcg; pgtable_t pgtable; pmd_t _pmd; - int ret = 0, i; + int i; + vm_fault_t ret = 0; struct page **pages; unsigned long mmun_start; /* For mmu_notifiers */ unsigned long mmun_end; /* For mmu_notifiers */ @@ -1239,7 +1240,7 @@ static int do_huge_pmd_wp_page_fallback(struct vm_fault *vmf, pmd_t orig_pmd, goto out; } -int do_huge_pmd_wp_page(struct vm_fault *vmf, pmd_t orig_pmd) +vm_fault_t do_huge_pmd_wp_page(struct vm_fault *vmf, pmd_t orig_pmd) { struct vm_area_struct *vma = vmf->vma; struct page *page = NULL, *new_page; @@ -1248,7 +1249,7 @@ int do_huge_pmd_wp_page(struct vm_fault *vmf, pmd_t orig_pmd) unsigned long mmun_start; /* For mmu_notifiers */ unsigned long mmun_end; /* For mmu_notifiers */ gfp_t huge_gfp; /* for allocation and charge */ - int ret = 0; + vm_fault_t ret = 0; vmf->ptl = pmd_lockptr(vma->vm_mm, vmf->pmd); VM_BUG_ON_VMA(!vma->anon_vma, vma); @@ -1459,7 +1460,7 @@ struct page *follow_trans_huge_pmd(struct vm_area_struct *vma, } /* NUMA hinting page fault entry point for trans huge pmds */ -int do_huge_pmd_numa_page(struct vm_fault *vmf, pmd_t pmd) +vm_fault_t do_huge_pmd_numa_page(struct vm_fault *vmf, pmd_t pmd) { struct vm_area_struct *vma = vmf->vma; struct anon_vma *anon_vma = NULL; diff --git a/mm/hugetlb.c b/mm/hugetlb.c index 2186791..d17b186 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c @@ -3499,14 +3499,15 @@ static void unmap_ref_private(struct mm_struct *mm, struct vm_area_struct *vma, * cannot race with other handlers or page migration. * Keep the pte_same checks anyway to make transition from the mutex easier. */ -static int hugetlb_cow(struct mm_struct *mm, struct vm_area_struct *vma, +static vm_fault_t hugetlb_cow(struct mm_struct *mm, struct vm_area_struct *vma, unsigned long address, pte_t *ptep, struct page *pagecache_page, spinlock_t *ptl) { pte_t pte; struct hstate *h = hstate_vma(vma); struct page *old_page, *new_page; - int ret = 0, outside_reserve = 0; + int outside_reserve = 0; + vm_fault_t ret = 0; unsigned long mmun_start; /* For mmu_notifiers */ unsigned long mmun_end; /* For mmu_notifiers */ @@ -3570,8 +3571,7 @@ static int hugetlb_cow(struct mm_struct *mm, struct vm_area_struct *vma, return 0; } - ret = (PTR_ERR(new_page) == -ENOMEM) ? - VM_FAULT_OOM : VM_FAULT_SIGBUS; + ret = vmf_error(PTR_ERR(new_page)); goto out_release_old; } @@ -3675,12 +3675,13 @@ int huge_add_to_page_cache(struct page *page, struct address_space *mapping, return 0; } -static int hugetlb_no_page(struct mm_struct *mm, struct vm_area_struct *vma, - struct address_space *mapping, pgoff_t idx, - unsigned long address, pte_t *ptep, unsigned int flags) +static vm_fault_t hugetlb_no_page(struct mm_struct *mm, + struct vm_area_struct *vma, + struct address_space *mapping, pgoff_t idx, + unsigned long address, pte_t *ptep, unsigned int flags) { struct hstate *h = hstate_vma(vma); - int ret = VM_FAULT_SIGBUS; + vm_fault_t ret = VM_FAULT_SIGBUS; int anon_rmap = 0; unsigned long size; struct page *page; @@ -3742,11 +3743,7 @@ static int hugetlb_no_page(struct mm_struct *mm, struct vm_area_struct *vma, page = alloc_huge_page(vma, address, 0); if (IS_ERR(page)) { - ret = PTR_ERR(page); - if (ret == -ENOMEM) - ret = VM_FAULT_OOM; - else - ret = VM_FAULT_SIGBUS; + ret = vmf_error(PTR_ERR(page)); goto out; } clear_huge_page(page, address, pages_per_huge_page(h)); @@ -3870,12 +3867,12 @@ u32 hugetlb_fault_mutex_hash(struct hstate *h, struct mm_struct *mm, } #endif -int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma, +vm_fault_t hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma, unsigned long address, unsigned int flags) { pte_t *ptep, entry; spinlock_t *ptl; - int ret; + vm_fault_t ret; u32 hash; pgoff_t idx; struct page *page = NULL; @@ -4206,7 +4203,7 @@ long follow_hugetlb_page(struct mm_struct *mm, struct vm_area_struct *vma, if (absent || is_swap_pte(huge_ptep_get(pte)) || ((flags & FOLL_WRITE) && !huge_pte_write(huge_ptep_get(pte)))) { - int ret; + vm_fault_t ret; unsigned int fault_flags = 0; if (pte) diff --git a/mm/internal.h b/mm/internal.h index 502d141..4044456 100644 --- a/mm/internal.h +++ b/mm/internal.h @@ -38,7 +38,7 @@ void page_writeback_init(void); -int do_swap_page(struct vm_fault *vmf); +vm_fault_t do_swap_page(struct vm_fault *vmf); void free_pgtables(struct mmu_gather *tlb, struct vm_area_struct *start_vma, unsigned long floor, unsigned long ceiling); diff --git a/mm/khugepaged.c b/mm/khugepaged.c index d7b2a4b..778fd40 100644 --- a/mm/khugepaged.c +++ b/mm/khugepaged.c @@ -880,7 +880,8 @@ static bool __collapse_huge_page_swapin(struct mm_struct *mm, unsigned long address, pmd_t *pmd, int referenced) { - int swapped_in = 0, ret = 0; + int swapped_in = 0; + vm_fault_t ret = 0; struct vm_fault vmf = { .vma = vma, .address = address, diff --git a/mm/memory.c b/mm/memory.c index 01f5464..cee8245 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -2360,9 +2360,9 @@ static gfp_t __get_fault_gfp_mask(struct vm_area_struct *vma) * * We do this without the lock held, so that it can sleep if it needs to. */ -static int do_page_mkwrite(struct vm_fault *vmf) +static vm_fault_t do_page_mkwrite(struct vm_fault *vmf) { - int ret; + vm_fault_t ret; struct page *page = vmf->page; unsigned int old_flags = vmf->flags; @@ -2466,7 +2466,7 @@ static inline void wp_page_reuse(struct vm_fault *vmf) * held to the old page, as well as updating the rmap. * - In any case, unlock the PTL and drop the reference we took to the old page. */ -static int wp_page_copy(struct vm_fault *vmf) +static vm_fault_t wp_page_copy(struct vm_fault *vmf) { struct vm_area_struct *vma = vmf->vma; struct mm_struct *mm = vma->vm_mm; @@ -2614,7 +2614,7 @@ static int wp_page_copy(struct vm_fault *vmf) * The function expects the page to be locked or other protection against * concurrent faults / writeback (such as DAX radix tree locks). */ -int finish_mkwrite_fault(struct vm_fault *vmf) +vm_fault_t finish_mkwrite_fault(struct vm_fault *vmf) { WARN_ON_ONCE(!(vmf->vma->vm_flags & VM_SHARED)); vmf->pte = pte_offset_map_lock(vmf->vma->vm_mm, vmf->pmd, vmf->address, @@ -2635,12 +2635,12 @@ int finish_mkwrite_fault(struct vm_fault *vmf) * Handle write page faults for VM_MIXEDMAP or VM_PFNMAP for a VM_SHARED * mapping */ -static int wp_pfn_shared(struct vm_fault *vmf) +static vm_fault_t wp_pfn_shared(struct vm_fault *vmf) { struct vm_area_struct *vma = vmf->vma; if (vma->vm_ops && vma->vm_ops->pfn_mkwrite) { - int ret; + vm_fault_t ret; pte_unmap_unlock(vmf->pte, vmf->ptl); vmf->flags |= FAULT_FLAG_MKWRITE; @@ -2653,7 +2653,7 @@ static int wp_pfn_shared(struct vm_fault *vmf) return VM_FAULT_WRITE; } -static int wp_page_shared(struct vm_fault *vmf) +static vm_fault_t wp_page_shared(struct vm_fault *vmf) __releases(vmf->ptl) { struct vm_area_struct *vma = vmf->vma; @@ -2661,7 +2661,7 @@ static int wp_page_shared(struct vm_fault *vmf) get_page(vmf->page); if (vma->vm_ops && vma->vm_ops->page_mkwrite) { - int tmp; + vm_fault_t tmp; pte_unmap_unlock(vmf->pte, vmf->ptl); tmp = do_page_mkwrite(vmf); @@ -2704,7 +2704,7 @@ static int wp_page_shared(struct vm_fault *vmf) * but allow concurrent faults), with pte both mapped and locked. * We return with mmap_sem still held, but pte unmapped and unlocked. */ -static int do_wp_page(struct vm_fault *vmf) +static vm_fault_t do_wp_page(struct vm_fault *vmf) __releases(vmf->ptl) { struct vm_area_struct *vma = vmf->vma; @@ -2880,7 +2880,7 @@ void unmap_mapping_range(struct address_space *mapping, * We return with the mmap_sem locked or unlocked in the same cases * as does filemap_fault(). */ -int do_swap_page(struct vm_fault *vmf) +vm_fault_t do_swap_page(struct vm_fault *vmf) { struct vm_area_struct *vma = vmf->vma; struct page *page = NULL, *swapcache; @@ -2889,7 +2889,7 @@ int do_swap_page(struct vm_fault *vmf) pte_t pte; int locked; int exclusive = 0; - int ret = 0; + vm_fault_t ret = 0; if (!pte_unmap_same(vma->vm_mm, vmf->pmd, vmf->pte, vmf->orig_pte)) goto out; @@ -3100,12 +3100,12 @@ int do_swap_page(struct vm_fault *vmf) * but allow concurrent faults), and pte mapped but not yet locked. * We return with mmap_sem still held, but pte unmapped and unlocked. */ -static int do_anonymous_page(struct vm_fault *vmf) +static vm_fault_t do_anonymous_page(struct vm_fault *vmf) { struct vm_area_struct *vma = vmf->vma; struct mem_cgroup *memcg; struct page *page; - int ret = 0; + vm_fault_t ret = 0; pte_t entry; /* File mapping without ->vm_ops ? */ @@ -3214,10 +3214,10 @@ static int do_anonymous_page(struct vm_fault *vmf) * released depending on flags and vma->vm_ops->fault() return value. * See filemap_fault() and __lock_page_retry(). */ -static int __do_fault(struct vm_fault *vmf) +static vm_fault_t __do_fault(struct vm_fault *vmf) { struct vm_area_struct *vma = vmf->vma; - int ret; + vm_fault_t ret; ret = vma->vm_ops->fault(vmf); if (unlikely(ret & (VM_FAULT_ERROR | VM_FAULT_NOPAGE | VM_FAULT_RETRY | @@ -3251,7 +3251,7 @@ static int pmd_devmap_trans_unstable(pmd_t *pmd) return pmd_devmap(*pmd) || pmd_trans_unstable(pmd); } -static int pte_alloc_one_map(struct vm_fault *vmf) +static vm_fault_t pte_alloc_one_map(struct vm_fault *vmf) { struct vm_area_struct *vma = vmf->vma; @@ -3327,13 +3327,14 @@ static void deposit_prealloc_pte(struct vm_fault *vmf) vmf->prealloc_pte = NULL; } -static int do_set_pmd(struct vm_fault *vmf, struct page *page) +static vm_fault_t do_set_pmd(struct vm_fault *vmf, struct page *page) { struct vm_area_struct *vma = vmf->vma; bool write = vmf->flags & FAULT_FLAG_WRITE; unsigned long haddr = vmf->address & HPAGE_PMD_MASK; pmd_t entry; - int i, ret; + int i; + vm_fault_t ret; if (!transhuge_vma_suitable(vma, haddr)) return VM_FAULT_FALLBACK; @@ -3383,7 +3384,7 @@ static int do_set_pmd(struct vm_fault *vmf, struct page *page) return ret; } #else -static int do_set_pmd(struct vm_fault *vmf, struct page *page) +static vm_fault_t do_set_pmd(struct vm_fault *vmf, struct page *page) { BUILD_BUG(); return 0; @@ -3404,13 +3405,13 @@ static int do_set_pmd(struct vm_fault *vmf, struct page *page) * Target users are page handler itself and implementations of * vm_ops->map_pages. */ -int alloc_set_pte(struct vm_fault *vmf, struct mem_cgroup *memcg, +vm_fault_t alloc_set_pte(struct vm_fault *vmf, struct mem_cgroup *memcg, struct page *page) { struct vm_area_struct *vma = vmf->vma; bool write = vmf->flags & FAULT_FLAG_WRITE; pte_t entry; - int ret; + vm_fault_t ret; if (pmd_none(*vmf->pmd) && PageTransCompound(page) && IS_ENABLED(CONFIG_TRANSPARENT_HUGE_PAGECACHE)) { @@ -3469,10 +3470,10 @@ int alloc_set_pte(struct vm_fault *vmf, struct mem_cgroup *memcg, * The function expects the page to be locked and on success it consumes a * reference of a page being mapped (for the PTE which maps it). */ -int finish_fault(struct vm_fault *vmf) +vm_fault_t finish_fault(struct vm_fault *vmf) { struct page *page; - int ret = 0; + vm_fault_t ret = 0; /* Did we COW the page? */ if ((vmf->flags & FAULT_FLAG_WRITE) && @@ -3558,12 +3559,13 @@ static int __init fault_around_debugfs(void) * (and therefore to page order). This way it's easier to guarantee * that we don't cross page table boundaries. */ -static int do_fault_around(struct vm_fault *vmf) +static vm_fault_t do_fault_around(struct vm_fault *vmf) { unsigned long address = vmf->address, nr_pages, mask; pgoff_t start_pgoff = vmf->pgoff; pgoff_t end_pgoff; - int off, ret = 0; + int off; + vm_fault_t ret = 0; nr_pages = READ_ONCE(fault_around_bytes) >> PAGE_SHIFT; mask = ~(nr_pages * PAGE_SIZE - 1) & PAGE_MASK; @@ -3613,10 +3615,10 @@ static int do_fault_around(struct vm_fault *vmf) return ret; } -static int do_read_fault(struct vm_fault *vmf) +static vm_fault_t do_read_fault(struct vm_fault *vmf) { struct vm_area_struct *vma = vmf->vma; - int ret = 0; + vm_fault_t ret = 0; /* * Let's call ->map_pages() first and use ->fault() as fallback @@ -3640,10 +3642,10 @@ static int do_read_fault(struct vm_fault *vmf) return ret; } -static int do_cow_fault(struct vm_fault *vmf) +static vm_fault_t do_cow_fault(struct vm_fault *vmf) { struct vm_area_struct *vma = vmf->vma; - int ret; + vm_fault_t ret; if (unlikely(anon_vma_prepare(vma))) return VM_FAULT_OOM; @@ -3679,10 +3681,10 @@ static int do_cow_fault(struct vm_fault *vmf) return ret; } -static int do_shared_fault(struct vm_fault *vmf) +static vm_fault_t do_shared_fault(struct vm_fault *vmf) { struct vm_area_struct *vma = vmf->vma; - int ret, tmp; + vm_fault_t ret, tmp; ret = __do_fault(vmf); if (unlikely(ret & (VM_FAULT_ERROR | VM_FAULT_NOPAGE | VM_FAULT_RETRY))) @@ -3720,10 +3722,10 @@ static int do_shared_fault(struct vm_fault *vmf) * The mmap_sem may have been released depending on flags and our * return value. See filemap_fault() and __lock_page_or_retry(). */ -static int do_fault(struct vm_fault *vmf) +static vm_fault_t do_fault(struct vm_fault *vmf) { struct vm_area_struct *vma = vmf->vma; - int ret; + vm_fault_t ret; /* The VMA was not fully populated on mmap() or missing VM_DONTEXPAND */ if (!vma->vm_ops->fault) @@ -3758,7 +3760,7 @@ static int numa_migrate_prep(struct page *page, struct vm_area_struct *vma, return mpol_misplaced(page, vma, addr); } -static int do_numa_page(struct vm_fault *vmf) +static vm_fault_t do_numa_page(struct vm_fault *vmf) { struct vm_area_struct *vma = vmf->vma; struct page *page = NULL; @@ -3848,7 +3850,7 @@ static int do_numa_page(struct vm_fault *vmf) return 0; } -static inline int create_huge_pmd(struct vm_fault *vmf) +static inline vm_fault_t create_huge_pmd(struct vm_fault *vmf) { if (vma_is_anonymous(vmf->vma)) return do_huge_pmd_anonymous_page(vmf); @@ -3858,7 +3860,7 @@ static inline int create_huge_pmd(struct vm_fault *vmf) } /* `inline' is required to avoid gcc 4.1.2 build error */ -static inline int wp_huge_pmd(struct vm_fault *vmf, pmd_t orig_pmd) +static inline vm_fault_t wp_huge_pmd(struct vm_fault *vmf, pmd_t orig_pmd) { if (vma_is_anonymous(vmf->vma)) return do_huge_pmd_wp_page(vmf, orig_pmd); @@ -3877,7 +3879,7 @@ static inline bool vma_is_accessible(struct vm_area_struct *vma) return vma->vm_flags & (VM_READ | VM_EXEC | VM_WRITE); } -static int create_huge_pud(struct vm_fault *vmf) +static vm_fault_t create_huge_pud(struct vm_fault *vmf) { #ifdef CONFIG_TRANSPARENT_HUGEPAGE /* No support for anonymous transparent PUD pages yet */ @@ -3889,7 +3891,7 @@ static int create_huge_pud(struct vm_fault *vmf) return VM_FAULT_FALLBACK; } -static int wp_huge_pud(struct vm_fault *vmf, pud_t orig_pud) +static vm_fault_t wp_huge_pud(struct vm_fault *vmf, pud_t orig_pud) { #ifdef CONFIG_TRANSPARENT_HUGEPAGE /* No support for anonymous transparent PUD pages yet */ @@ -3916,7 +3918,7 @@ static int wp_huge_pud(struct vm_fault *vmf, pud_t orig_pud) * The mmap_sem may have been released depending on flags and our return value. * See filemap_fault() and __lock_page_or_retry(). */ -static int handle_pte_fault(struct vm_fault *vmf) +static vm_fault_t handle_pte_fault(struct vm_fault *vmf) { pte_t entry; @@ -4004,8 +4006,8 @@ static int handle_pte_fault(struct vm_fault *vmf) * The mmap_sem may have been released depending on flags and our * return value. See filemap_fault() and __lock_page_or_retry(). */ -static int __handle_mm_fault(struct vm_area_struct *vma, unsigned long address, - unsigned int flags) +static vm_fault_t __handle_mm_fault(struct vm_area_struct *vma, + unsigned long address, unsigned int flags) { struct vm_fault vmf = { .vma = vma, @@ -4018,7 +4020,7 @@ static int __handle_mm_fault(struct vm_area_struct *vma, unsigned long address, struct mm_struct *mm = vma->vm_mm; pgd_t *pgd; p4d_t *p4d; - int ret; + vm_fault_t ret; pgd = pgd_offset(mm, address); p4d = p4d_alloc(mm, pgd, address); @@ -4093,10 +4095,10 @@ static int __handle_mm_fault(struct vm_area_struct *vma, unsigned long address, * The mmap_sem may have been released depending on flags and our * return value. See filemap_fault() and __lock_page_or_retry(). */ -int handle_mm_fault(struct vm_area_struct *vma, unsigned long address, +vm_fault_t handle_mm_fault(struct vm_area_struct *vma, unsigned long address, unsigned int flags) { - int ret; + vm_fault_t ret; __set_current_state(TASK_RUNNING); diff --git a/mm/shmem.c b/mm/shmem.c index 9d6c7e5..af05c35 100644 --- a/mm/shmem.c +++ b/mm/shmem.c @@ -123,7 +123,7 @@ static int shmem_replace_page(struct page **pagep, gfp_t gfp, static int shmem_getpage_gfp(struct inode *inode, pgoff_t index, struct page **pagep, enum sgp_type sgp, gfp_t gfp, struct vm_area_struct *vma, - struct vm_fault *vmf, int *fault_type); + struct vm_fault *vmf, vm_fault_t *fault_type); int shmem_getpage(struct inode *inode, pgoff_t index, struct page **pagep, enum sgp_type sgp) @@ -1604,7 +1604,8 @@ static int shmem_replace_page(struct page **pagep, gfp_t gfp, */ static int shmem_getpage_gfp(struct inode *inode, pgoff_t index, struct page **pagep, enum sgp_type sgp, gfp_t gfp, - struct vm_area_struct *vma, struct vm_fault *vmf, int *fault_type) + struct vm_area_struct *vma, struct vm_fault *vmf, + vm_fault_t *fault_type) { struct address_space *mapping = inode->i_mapping; struct shmem_inode_info *info = SHMEM_I(inode); @@ -1931,14 +1932,14 @@ static int synchronous_wake_function(wait_queue_entry_t *wait, unsigned mode, in return ret; } -static int shmem_fault(struct vm_fault *vmf) +static vm_fault_t shmem_fault(struct vm_fault *vmf) { struct vm_area_struct *vma = vmf->vma; struct inode *inode = file_inode(vma->vm_file); gfp_t gfp = mapping_gfp_mask(inode->i_mapping); enum sgp_type sgp; - int error; - int ret = VM_FAULT_LOCKED; + int err; + vm_fault_t ret = VM_FAULT_LOCKED; /* * Trinity finds that probing a hole which tmpfs is punching can @@ -2006,10 +2007,10 @@ static int shmem_fault(struct vm_fault *vmf) else if (vma->vm_flags & VM_HUGEPAGE) sgp = SGP_HUGE; - error = shmem_getpage_gfp(inode, vmf->pgoff, &vmf->page, sgp, + err = shmem_getpage_gfp(inode, vmf->pgoff, &vmf->page, sgp, gfp, vma, vmf, &ret); - if (error) - return ((error == -ENOMEM) ? VM_FAULT_OOM : VM_FAULT_SIGBUS); + if (err) + ret = vmf_error(err); return ret; }