OSDN Git Service

powerpc: clean up do_page_fault
authorNicholas Piggin <npiggin@gmail.com>
Tue, 16 Mar 2021 10:42:03 +0000 (20:42 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Wed, 14 Apr 2021 13:04:44 +0000 (23:04 +1000)
search_exception_tables + __bad_page_fault can be substituted with
bad_page_fault, do_page_fault no longer needs to return a value
to asm for any sub-architecture, and __bad_page_fault can be static.

Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20210316104206.407354-10-npiggin@gmail.com
arch/powerpc/include/asm/bug.h
arch/powerpc/include/asm/interrupt.h
arch/powerpc/mm/book3s64/hash_utils.c
arch/powerpc/mm/fault.c

index d1635ff..0b21628 100644 (file)
 #ifndef __ASSEMBLY__
 
 struct pt_regs;
-long do_page_fault(struct pt_regs *);
-long hash__do_page_fault(struct pt_regs *);
+void hash__do_page_fault(struct pt_regs *);
 void bad_page_fault(struct pt_regs *, int);
-void __bad_page_fault(struct pt_regs *regs, int sig);
-void do_bad_page_fault_segv(struct pt_regs *regs);
 extern void _exception(int, struct pt_regs *, int, unsigned long);
 extern void _exception_pkey(struct pt_regs *, unsigned long, int);
 extern void die(const char *, struct pt_regs *, long);
index a2f5519..b1b9919 100644 (file)
@@ -444,7 +444,7 @@ DECLARE_INTERRUPT_HANDLER(do_bad_slb_fault);
 DECLARE_INTERRUPT_HANDLER_RAW(do_hash_fault);
 
 /* fault.c */
-DECLARE_INTERRUPT_HANDLER_RET(do_page_fault);
+DECLARE_INTERRUPT_HANDLER(do_page_fault);
 DECLARE_INTERRUPT_HANDLER(do_bad_page_fault_segv);
 
 /* process.c */
index 12de190..c1dace3 100644 (file)
@@ -1583,10 +1583,11 @@ DEFINE_INTERRUPT_HANDLER_RET(__do_hash_fault)
 DEFINE_INTERRUPT_HANDLER_RAW(do_hash_fault)
 {
        unsigned long dsisr = regs->dsisr;
-       long err;
 
-       if (unlikely(dsisr & (DSISR_BAD_FAULT_64S | DSISR_KEYFAULT)))
-               goto page_fault;
+       if (unlikely(dsisr & (DSISR_BAD_FAULT_64S | DSISR_KEYFAULT))) {
+               hash__do_page_fault(regs);
+               return 0;
+       }
 
        /*
         * If we are in an "NMI" (e.g., an interrupt when soft-disabled), then
@@ -1606,13 +1607,10 @@ DEFINE_INTERRUPT_HANDLER_RAW(do_hash_fault)
                return 0;
        }
 
-       err = __do_hash_fault(regs);
-       if (err) {
-page_fault:
-               err = hash__do_page_fault(regs);
-       }
+       if (__do_hash_fault(regs))
+               hash__do_page_fault(regs);
 
-       return err;
+       return 0;
 }
 
 #ifdef CONFIG_PPC_MM_SLICES
index 18e588f..5227def 100644 (file)
@@ -539,36 +539,25 @@ retry:
 }
 NOKPROBE_SYMBOL(___do_page_fault);
 
-static long __do_page_fault(struct pt_regs *regs)
+static __always_inline void __do_page_fault(struct pt_regs *regs)
 {
-       const struct exception_table_entry *entry;
        long err;
 
        err = ___do_page_fault(regs, regs->dar, regs->dsisr);
-       if (likely(!err))
-               return err;
-
-       entry = search_exception_tables(regs->nip);
-       if (likely(entry)) {
-               instruction_pointer_set(regs, extable_fixup(entry));
-               return 0;
-       } else {
-               __bad_page_fault(regs, err);
-               return 0;
-       }
+       if (unlikely(err))
+               bad_page_fault(regs, err);
 }
-NOKPROBE_SYMBOL(__do_page_fault);
 
-DEFINE_INTERRUPT_HANDLER_RET(do_page_fault)
+DEFINE_INTERRUPT_HANDLER(do_page_fault)
 {
-       return __do_page_fault(regs);
+       __do_page_fault(regs);
 }
 
 #ifdef CONFIG_PPC_BOOK3S_64
 /* Same as do_page_fault but interrupt entry has already run in do_hash_fault */
-long hash__do_page_fault(struct pt_regs *regs)
+void hash__do_page_fault(struct pt_regs *regs)
 {
-       return __do_page_fault(regs);
+       __do_page_fault(regs);
 }
 NOKPROBE_SYMBOL(hash__do_page_fault);
 #endif
@@ -578,7 +567,7 @@ NOKPROBE_SYMBOL(hash__do_page_fault);
  * It is called from the DSI and ISI handlers in head.S and from some
  * of the procedures in traps.c.
  */
-void __bad_page_fault(struct pt_regs *regs, int sig)
+static void __bad_page_fault(struct pt_regs *regs, int sig)
 {
        int is_write = page_fault_is_write(regs->dsisr);