Patch "powerpc/watchpoint: Disable pagefaults when getting user instruction" has been added to the 5.15-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    powerpc/watchpoint: Disable pagefaults when getting user instruction

to the 5.15-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     powerpc-watchpoint-disable-pagefaults-when-getting-u.patch
and it can be found in the queue-5.15 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 490751d81c2fa2dfc61d40b15e7d01596ed6465f
Author: Benjamin Gray <bgray@xxxxxxxxxxxxx>
Date:   Tue Aug 29 16:34:56 2023 +1000

    powerpc/watchpoint: Disable pagefaults when getting user instruction
    
    [ Upstream commit 3241f260eb830d27d09cc604690ec24533fdb433 ]
    
    This is called in an atomic context, so is not allowed to sleep if a
    user page needs to be faulted in and has nowhere it can be deferred to.
    The pagefault_disabled() function is documented as preventing user
    access methods from sleeping.
    
    In practice the page will be mapped in nearly always because we are
    reading the instruction that just triggered the watchpoint trap.
    
    Signed-off-by: Benjamin Gray <bgray@xxxxxxxxxxxxx>
    Signed-off-by: Michael Ellerman <mpe@xxxxxxxxxxxxxx>
    Link: https://msgid.link/20230829063457.54157-3-bgray@xxxxxxxxxxxxx
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/arch/powerpc/kernel/hw_breakpoint_constraints.c b/arch/powerpc/kernel/hw_breakpoint_constraints.c
index 675d1f66ab728..a541e3b755479 100644
--- a/arch/powerpc/kernel/hw_breakpoint_constraints.c
+++ b/arch/powerpc/kernel/hw_breakpoint_constraints.c
@@ -140,8 +140,13 @@ void wp_get_instr_detail(struct pt_regs *regs, struct ppc_inst *instr,
 			 int *type, int *size, unsigned long *ea)
 {
 	struct instruction_op op;
+	int err;
 
-	if (__get_user_instr(*instr, (void __user *)regs->nip))
+	pagefault_disable();
+	err = __get_user_instr(*instr, (void __user *)regs->nip);
+	pagefault_enable();
+
+	if (err)
 		return;
 
 	analyse_instr(&op, regs, *instr);



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux