mm: introduce FAULT_FLAG_DEFAULT
authorPeter Xu <peterx@redhat.com>
Thu, 2 Apr 2020 04:08:37 +0000 (21:08 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 2 Apr 2020 16:35:29 +0000 (09:35 -0700)
Although there're tons of arch-specific page fault handlers, most of them
are still sharing the same initial value of the page fault flags.  Say,
merely all of the page fault handlers would allow the fault to be retried,
and they also allow the fault to respond to SIGKILL.

Let's define a default value for the fault flags to replace those initial
page fault flags that were copied over.  With this, it'll be far easier to
introduce new fault flag that can be used by all the architectures instead
of touching all the archs.

Signed-off-by: Peter Xu <peterx@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Tested-by: Brian Geffon <bgeffon@google.com>
Reviewed-by: David Hildenbrand <david@redhat.com>
Cc: Andrea Arcangeli <aarcange@redhat.com>
Cc: Bobby Powers <bobbypowers@gmail.com>
Cc: Denis Plotnikov <dplotnikov@virtuozzo.com>
Cc: "Dr . David Alan Gilbert" <dgilbert@redhat.com>
Cc: Hugh Dickins <hughd@google.com>
Cc: Jerome Glisse <jglisse@redhat.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: "Kirill A . Shutemov" <kirill@shutemov.name>
Cc: Martin Cracauer <cracauer@cons.org>
Cc: Marty McFadden <mcfadden8@llnl.gov>
Cc: Matthew Wilcox <willy@infradead.org>
Cc: Maya Gokhale <gokhale2@llnl.gov>
Cc: Mel Gorman <mgorman@suse.de>
Cc: Mike Kravetz <mike.kravetz@oracle.com>
Cc: Mike Rapoport <rppt@linux.vnet.ibm.com>
Cc: Pavel Emelyanov <xemul@openvz.org>
Link: http://lkml.kernel.org/r/20200220160238.9694-1-peterx@redhat.com
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
24 files changed:
arch/alpha/mm/fault.c
arch/arc/mm/fault.c
arch/arm/mm/fault.c
arch/arm64/mm/fault.c
arch/hexagon/mm/vm_fault.c
arch/ia64/mm/fault.c
arch/m68k/mm/fault.c
arch/microblaze/mm/fault.c
arch/mips/mm/fault.c
arch/nds32/mm/fault.c
arch/nios2/mm/fault.c
arch/openrisc/mm/fault.c
arch/parisc/mm/fault.c
arch/powerpc/mm/fault.c
arch/riscv/mm/fault.c
arch/s390/mm/fault.c
arch/sh/mm/fault.c
arch/sparc/mm/fault_32.c
arch/sparc/mm/fault_64.c
arch/um/kernel/trap.c
arch/unicore32/mm/fault.c
arch/x86/mm/fault.c
arch/xtensa/mm/fault.c
include/linux/mm.h

index aea33b5..fcfa229 100644 (file)
@@ -89,7 +89,7 @@ do_page_fault(unsigned long address, unsigned long mmcsr,
        const struct exception_table_entry *fixup;
        int si_code = SEGV_MAPERR;
        vm_fault_t fault;
-       unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
+       unsigned int flags = FAULT_FLAG_DEFAULT;
 
        /* As of EV6, a load into $31/$f31 is a prefetch, and never faults
           (or is suppressed by the PALcode).  Support that for older CPUs
index 6eb821a..643fad7 100644 (file)
@@ -100,7 +100,7 @@ void do_page_fault(unsigned long address, struct pt_regs *regs)
                 (regs->ecr_cause == ECR_C_PROTV_INST_FETCH))
                exec = 1;
 
-       flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
+       flags = FAULT_FLAG_DEFAULT;
        if (user_mode(regs))
                flags |= FAULT_FLAG_USER;
        if (write)
index 937b81f..18ef0b1 100644 (file)
@@ -241,7 +241,7 @@ do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
        struct mm_struct *mm;
        int sig, code;
        vm_fault_t fault;
-       unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
+       unsigned int flags = FAULT_FLAG_DEFAULT;
 
        if (kprobe_page_fault(regs, fsr))
                return 0;
index 6f4b69d..cbb29a4 100644 (file)
@@ -446,7 +446,7 @@ static int __kprobes do_page_fault(unsigned long addr, unsigned int esr,
        struct mm_struct *mm = current->mm;
        vm_fault_t fault, major = 0;
        unsigned long vm_flags = VM_READ | VM_WRITE | VM_EXEC;
-       unsigned int mm_flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
+       unsigned int mm_flags = FAULT_FLAG_DEFAULT;
 
        if (kprobe_page_fault(regs, esr))
                return 0;
index d19beaf..d9e15d9 100644 (file)
@@ -41,7 +41,7 @@ void do_page_fault(unsigned long address, long cause, struct pt_regs *regs)
        int si_code = SEGV_MAPERR;
        vm_fault_t fault;
        const struct exception_table_entry *fixup;
-       unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
+       unsigned int flags = FAULT_FLAG_DEFAULT;
 
        /*
         * If we're in an interrupt or have no user context,
index 211b4f4..b5aa4e8 100644 (file)
@@ -65,7 +65,7 @@ ia64_do_page_fault (unsigned long address, unsigned long isr, struct pt_regs *re
        struct mm_struct *mm = current->mm;
        unsigned long mask;
        vm_fault_t fault;
-       unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
+       unsigned int flags = FAULT_FLAG_DEFAULT;
 
        mask = ((((isr >> IA64_ISR_X_BIT) & 1UL) << VM_EXEC_BIT)
                | (((isr >> IA64_ISR_W_BIT) & 1UL) << VM_WRITE_BIT));
index a455e20..182799f 100644 (file)
@@ -71,7 +71,7 @@ int do_page_fault(struct pt_regs *regs, unsigned long address,
        struct mm_struct *mm = current->mm;
        struct vm_area_struct * vma;
        vm_fault_t fault;
-       unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
+       unsigned int flags = FAULT_FLAG_DEFAULT;
 
        pr_debug("do page fault:\nregs->sr=%#x, regs->pc=%#lx, address=%#lx, %ld, %p\n",
                regs->sr, regs->pc, address, error_code, mm ? mm->pgd : NULL);
index cdde01d..32da027 100644 (file)
@@ -91,7 +91,7 @@ void do_page_fault(struct pt_regs *regs, unsigned long address,
        int code = SEGV_MAPERR;
        int is_write = error_code & ESR_S;
        vm_fault_t fault;
-       unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
+       unsigned int flags = FAULT_FLAG_DEFAULT;
 
        regs->ear = address;
        regs->esr = error_code;
index 4b52f3d..ec464da 100644 (file)
@@ -44,7 +44,7 @@ static void __kprobes __do_page_fault(struct pt_regs *regs, unsigned long write,
        const int field = sizeof(unsigned long) * 2;
        int si_code;
        vm_fault_t fault;
-       unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
+       unsigned int flags = FAULT_FLAG_DEFAULT;
 
        static DEFINE_RATELIMIT_STATE(ratelimit_state, 5 * HZ, 10);
 
index 0e63f81..2810a4e 100644 (file)
@@ -80,7 +80,7 @@ void do_page_fault(unsigned long entry, unsigned long addr,
        int si_code;
        vm_fault_t fault;
        unsigned int mask = VM_READ | VM_WRITE | VM_EXEC;
-       unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
+       unsigned int flags = FAULT_FLAG_DEFAULT;
 
        error_code = error_code & (ITYPE_mskINST | ITYPE_mskETYPE);
        tsk = current;
index 704ace8..c38bea4 100644 (file)
@@ -47,7 +47,7 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long cause,
        struct mm_struct *mm = tsk->mm;
        int code = SEGV_MAPERR;
        vm_fault_t fault;
-       unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
+       unsigned int flags = FAULT_FLAG_DEFAULT;
 
        cause >>= 2;
 
index 85c7eb0..30d5c51 100644 (file)
@@ -50,7 +50,7 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long address,
        struct vm_area_struct *vma;
        int si_code;
        vm_fault_t fault;
-       unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
+       unsigned int flags = FAULT_FLAG_DEFAULT;
 
        tsk = current;
 
index f9be1d1..8e88e5c 100644 (file)
@@ -274,7 +274,7 @@ void do_page_fault(struct pt_regs *regs, unsigned long code,
        if (!mm)
                goto no_context;
 
-       flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
+       flags = FAULT_FLAG_DEFAULT;
        if (user_mode(regs))
                flags |= FAULT_FLAG_USER;
 
index 0868172..d7e1f8d 100644 (file)
@@ -434,7 +434,7 @@ static int __do_page_fault(struct pt_regs *regs, unsigned long address,
 {
        struct vm_area_struct * vma;
        struct mm_struct *mm = current->mm;
-       unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
+       unsigned int flags = FAULT_FLAG_DEFAULT;
        int is_exec = TRAP(regs) == 0x400;
        int is_user = user_mode(regs);
        int is_write = page_fault_is_write(error_code);
index 1d3869e..a252d9e 100644 (file)
@@ -30,7 +30,7 @@ asmlinkage void do_page_fault(struct pt_regs *regs)
        struct vm_area_struct *vma;
        struct mm_struct *mm;
        unsigned long addr, cause;
-       unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
+       unsigned int flags = FAULT_FLAG_DEFAULT;
        int code = SEGV_MAPERR;
        vm_fault_t fault;
 
index 179cf92..551ac31 100644 (file)
@@ -429,7 +429,7 @@ static inline vm_fault_t do_exception(struct pt_regs *regs, int access)
 
        address = trans_exc_code & __FAIL_ADDR_MASK;
        perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, address);
-       flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
+       flags = FAULT_FLAG_DEFAULT;
        if (user_mode(regs))
                flags |= FAULT_FLAG_USER;
        if (access == VM_WRITE || (trans_exc_code & store_indication) == 0x400)
index eb4048a..d9c8f2d 100644 (file)
@@ -380,7 +380,7 @@ asmlinkage void __kprobes do_page_fault(struct pt_regs *regs,
        struct mm_struct *mm;
        struct vm_area_struct * vma;
        vm_fault_t fault;
-       unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
+       unsigned int flags = FAULT_FLAG_DEFAULT;
 
        tsk = current;
        mm = tsk->mm;
index 6efbeb2..a91b0c2 100644 (file)
@@ -168,7 +168,7 @@ asmlinkage void do_sparc_fault(struct pt_regs *regs, int text_fault, int write,
        int from_user = !(regs->psr & PSR_PS);
        int code;
        vm_fault_t fault;
-       unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
+       unsigned int flags = FAULT_FLAG_DEFAULT;
 
        if (text_fault)
                address = regs->pc;
index dd1ed65..3065341 100644 (file)
@@ -271,7 +271,7 @@ asmlinkage void __kprobes do_sparc64_fault(struct pt_regs *regs)
        int si_code, fault_code;
        vm_fault_t fault;
        unsigned long address, mm_rss;
-       unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
+       unsigned int flags = FAULT_FLAG_DEFAULT;
 
        fault_code = get_thread_fault_code();
 
index 8185530..c59ad37 100644 (file)
@@ -33,7 +33,7 @@ int handle_page_fault(unsigned long address, unsigned long ip,
        pmd_t *pmd;
        pte_t *pte;
        int err = -EFAULT;
-       unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
+       unsigned int flags = FAULT_FLAG_DEFAULT;
 
        *code_out = SEGV_MAPERR;
 
index 59d0e6e..34a9045 100644 (file)
@@ -202,7 +202,7 @@ static int do_pf(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
        struct mm_struct *mm;
        int sig, code;
        vm_fault_t fault;
-       unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
+       unsigned int flags = FAULT_FLAG_DEFAULT;
 
        tsk = current;
        mm = tsk->mm;
index 552770b..f70a08e 100644 (file)
@@ -1310,7 +1310,7 @@ void do_user_addr_fault(struct pt_regs *regs,
        struct task_struct *tsk;
        struct mm_struct *mm;
        vm_fault_t fault, major = 0;
-       unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
+       unsigned int flags = FAULT_FLAG_DEFAULT;
 
        tsk = current;
        mm = tsk->mm;
index 5951590..7d196dc 100644 (file)
@@ -43,7 +43,7 @@ void do_page_fault(struct pt_regs *regs)
 
        int is_write, is_exec;
        vm_fault_t fault;
-       unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
+       unsigned int flags = FAULT_FLAG_DEFAULT;
 
        code = SEGV_MAPERR;
 
index 12d194e..60f1192 100644 (file)
@@ -391,6 +391,13 @@ extern pgprot_t protection_map[16];
 #define FAULT_FLAG_REMOTE      0x80    /* faulting for non current tsk/mm */
 #define FAULT_FLAG_INSTRUCTION  0x100  /* The fault was during an instruction fetch */
 
+/*
+ * The default fault flags that should be used by most of the
+ * arch-specific page fault handlers.
+ */
+#define FAULT_FLAG_DEFAULT  (FAULT_FLAG_ALLOW_RETRY | \
+                            FAULT_FLAG_KILLABLE)
+
 #define FAULT_FLAG_TRACE \
        { FAULT_FLAG_WRITE,             "WRITE" }, \
        { FAULT_FLAG_MKWRITE,           "MKWRITE" }, \