]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
x86: convert vdso to use vm_fault_t
authorMatthew Wilcox <willy@infradead.org>
Fri, 26 Oct 2018 22:04:16 +0000 (15:04 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 26 Oct 2018 23:25:19 +0000 (16:25 -0700)
Return vm_fault_t codes directly from the appropriate mm routines instead
of converting from errnos ourselves.  Fixes a minor bug where we'd return
SIGBUS instead of the correct OOM code if we ran out of memory allocating
page tables.

Link: http://lkml.kernel.org/r/20180828145728.11873-5-willy@infradead.org
Signed-off-by: Matthew Wilcox <willy@infradead.org>
Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Andrew Morton <akpm@linux-foundation.org>
Cc: Nicolas Pitre <nicolas.pitre@linaro.org>
Cc: Souptick Joarder <jrdr.linux@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
arch/x86/entry/vdso/vma.c

index 3f9d43f26f630b29ef9cb53f39d9f2079df84a06..7eb878561910f168b82a84bb4c52efdd5a901595 100644 (file)
@@ -39,7 +39,7 @@ void __init init_vdso_image(const struct vdso_image *image)
 
 struct linux_binprm;
 
-static int vdso_fault(const struct vm_special_mapping *sm,
+static vm_fault_t vdso_fault(const struct vm_special_mapping *sm,
                      struct vm_area_struct *vma, struct vm_fault *vmf)
 {
        const struct vdso_image *image = vma->vm_mm->context.vdso_image;
@@ -84,12 +84,11 @@ static int vdso_mremap(const struct vm_special_mapping *sm,
        return 0;
 }
 
-static int vvar_fault(const struct vm_special_mapping *sm,
+static vm_fault_t vvar_fault(const struct vm_special_mapping *sm,
                      struct vm_area_struct *vma, struct vm_fault *vmf)
 {
        const struct vdso_image *image = vma->vm_mm->context.vdso_image;
        long sym_offset;
-       int ret = -EFAULT;
 
        if (!image)
                return VM_FAULT_SIGBUS;
@@ -108,29 +107,24 @@ static int vvar_fault(const struct vm_special_mapping *sm,
                return VM_FAULT_SIGBUS;
 
        if (sym_offset == image->sym_vvar_page) {
-               ret = vm_insert_pfn(vma, vmf->address,
-                                   __pa_symbol(&__vvar_page) >> PAGE_SHIFT);
+               return vmf_insert_pfn(vma, vmf->address,
+                               __pa_symbol(&__vvar_page) >> PAGE_SHIFT);
        } else if (sym_offset == image->sym_pvclock_page) {
                struct pvclock_vsyscall_time_info *pvti =
                        pvclock_get_pvti_cpu0_va();
                if (pvti && vclock_was_used(VCLOCK_PVCLOCK)) {
-                       ret = vm_insert_pfn_prot(
-                               vma,
-                               vmf->address,
-                               __pa(pvti) >> PAGE_SHIFT,
-                               pgprot_decrypted(vma->vm_page_prot));
+                       return vmf_insert_pfn_prot(vma, vmf->address,
+                                       __pa(pvti) >> PAGE_SHIFT,
+                                       pgprot_decrypted(vma->vm_page_prot));
                }
        } else if (sym_offset == image->sym_hvclock_page) {
                struct ms_hyperv_tsc_page *tsc_pg = hv_get_tsc_page();
 
                if (tsc_pg && vclock_was_used(VCLOCK_HVCLOCK))
-                       ret = vm_insert_pfn(vma, vmf->address,
-                                           vmalloc_to_pfn(tsc_pg));
+                       return vmf_insert_pfn(vma, vmf->address,
+                                       vmalloc_to_pfn(tsc_pg));
        }
 
-       if (ret == 0 || ret == -EBUSY)
-               return VM_FAULT_NOPAGE;
-
        return VM_FAULT_SIGBUS;
 }