OSDN Git Service

signal/arm64: For clarity separate the 3 signal sending cases in do_page_fault
authorEric W. Biederman <ebiederm@xmission.com>
Sat, 22 Sep 2018 07:54:33 +0000 (09:54 +0200)
committerEric W. Biederman <ebiederm@xmission.com>
Thu, 27 Sep 2018 19:54:10 +0000 (21:54 +0200)
It gets easy to confuse what is going on when some code is shared and some not
so stop sharing the trivial bits of signal generation to make future updates
easier to understand.

Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
Tested-by: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
arch/arm64/mm/fault.c

index 0ddc8c6..14d6ff8 100644 (file)
@@ -567,16 +567,16 @@ retry:
                return 0;
        }
 
-       clear_siginfo(&si);
-       si.si_addr = (void __user *)addr;
-
        if (fault & VM_FAULT_SIGBUS) {
                /*
                 * We had some memory, but were unable to successfully fix up
                 * this page fault.
                 */
+               clear_siginfo(&si);
                si.si_signo     = SIGBUS;
                si.si_code      = BUS_ADRERR;
+               si.si_addr = (void __user *)addr;
+               __do_user_fault(&si, esr);
        } else if (fault & (VM_FAULT_HWPOISON_LARGE | VM_FAULT_HWPOISON)) {
                unsigned int lsb;
 
@@ -584,20 +584,25 @@ retry:
                if (fault & VM_FAULT_HWPOISON_LARGE)
                        lsb = hstate_index_to_shift(VM_FAULT_GET_HINDEX(fault));
 
+               clear_siginfo(&si);
                si.si_signo     = SIGBUS;
                si.si_code      = BUS_MCEERR_AR;
+               si.si_addr = (void __user *)addr;
                si.si_addr_lsb  = lsb;
+               __do_user_fault(&si, esr);
        } else {
                /*
                 * Something tried to access memory that isn't in our memory
                 * map.
                 */
+               clear_siginfo(&si);
                si.si_signo     = SIGSEGV;
                si.si_code      = fault == VM_FAULT_BADACCESS ?
                                  SEGV_ACCERR : SEGV_MAPERR;
+               si.si_addr = (void __user *)addr;
+               __do_user_fault(&si, esr);
        }
 
-       __do_user_fault(&si, esr);
        return 0;
 
 no_context: