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 aea33b599037c24162ec9d5f688afa26b479b421..fcfa229cc1e7ab2842b20f48ee5ac7aad3b777b0 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 6eb821a59b493defb7cce604a8380395281ca99b..643fad7740717ae8eabcacdcfa05d924566ed29b 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 937b81ff864992cc6f44e7924982fb16dbc93a42..18ef0b143ac2c0c54ff3a14f1074f62a34cdee97 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 6f4b69d712b11ae8078cba12b1145282d4194879..cbb29a43aa7f60e46f255c01d86df9125da9a3fa 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 d19beaf11b4cfad931a3de190213470616c77206..d9e15d941bdbd3a8004cfd4254a0745928b0ab7e 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 211b4f43938464fd9a4e16a40312dbe8b401e990..b5aa4e80c762b4b69e8e4ad9f4283190ab2cb45c 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 a455e202691baff765e1ba1b9a06969b7b5cbd8f..182799fd9987032da22fa59bec4da33bf9d60876 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 cdde01dcdfc3c7004bd6f969c5e517110f302649..32da02778a63c33ed9dbd3e295e932c17a6de95c 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 4b52f3d890ea90366c482c8583402ae9213467ed..ec464da64656a88168ab2d92bd941b2838a03ae0 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 0e63f81eff5bd5aaa20be6dc0a1b27dd23d68886..2810a4e5ab279317c9b349536bd8daf3a679c5a3 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 704ace8ca0eef45da12d018475ebb22034971635..c38bea4220fbd12cb54d56906208d69e5be806d2 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 85c7eb0c01860cac71b19551a2c48096825b1d12..30d5c51e9d40c931a98e51a02e83512c59034e2c 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 f9be1d1cb43f6d9c692d21a0ac8a16457b59addd..8e88e5c5f26a1efa5e59a79bac0dc6dd21b272ec 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 0868172ce4e3a67ea5a687f821e61f4468fbf3ab..d7e1f8dc7e4c4389ad58ce25eaeb17fda7e82520 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 1d3869e9ddeff8a0fbcfbe3d0f59b4433895616d..a252d9e38561a763687096f59691ff4d879b48b0 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 179cf92a56e56277624bf417b28182641b002117..551ac311bd35b11769962807fabc5849de2c6627 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 eb4048ad0b38a48a6995327b02479b02fdf4b93d..d9c8f2d00a541416e5a61b7cbc348af40c963cf6 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 6efbeb22764411e08856ae79e8a6ef740d699cd1..a91b0c2d84f8af7d6b9f32c3cad1429f35fe20a7 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 dd1ed65558318b3088ba940aab4cd630a1f1e47b..30653418a672fdfc83d21fef92bb546224e0ad0e 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 818553064f04127d06b3f0f79c97039d52f1feda..c59ad37eacda23e9a09b0010fce16ed7b8eef493 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 59d0e6ec2cfca6fdb8ddc0519855679328ca02e8..34a90453ca18b2f305ad57540baa6d8a9614cff7 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 552770b6af9a8badafe87f48126bc75a4e0e5454..f70a08e5271f509f83ce96bf3e3f423f383d33fe 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 59515905d4ad39a72470d7a1d40164ff189b8f65..7d196dc951e861d62d56d1cc4018c2375e3cbeb8 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 12d194ec6422cc32eb8927492c12750cf2b6bafa..60f1192ee06e299f9a67f7f8a9ec12d7ed0b1577 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" }, \