lkml.org 
[lkml]   [2022]   [Aug]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 053/779] riscv:uprobe fix SR_SPIE set/clear handling
    Date
    From: Yipeng Zou <zouyipeng@huawei.com>

    commit 3dbe5829408bc1586f75b4667ef60e5aab0209c7 upstream.

    In riscv the process of uprobe going to clear spie before exec
    the origin insn,and set spie after that.But When access the page
    which origin insn has been placed a page fault may happen and
    irq was disabled in arch_uprobe_pre_xol function,It cause a WARN
    as follows.
    There is no need to clear/set spie in arch_uprobe_pre/post/abort_xol.
    We can just remove it.

    [ 31.684157] BUG: sleeping function called from invalid context at kernel/locking/rwsem.c:1488
    [ 31.684677] in_atomic(): 0, irqs_disabled(): 1, non_block: 0, pid: 76, name: work
    [ 31.684929] preempt_count: 0, expected: 0
    [ 31.685969] CPU: 2 PID: 76 Comm: work Tainted: G
    [ 31.686542] Hardware name: riscv-virtio,qemu (DT)
    [ 31.686797] Call Trace:
    [ 31.687053] [<ffffffff80006442>] dump_backtrace+0x30/0x38
    [ 31.687699] [<ffffffff80812118>] show_stack+0x40/0x4c
    [ 31.688141] [<ffffffff8081817a>] dump_stack_lvl+0x44/0x5c
    [ 31.688396] [<ffffffff808181aa>] dump_stack+0x18/0x20
    [ 31.688653] [<ffffffff8003e454>] __might_resched+0x114/0x122
    [ 31.688948] [<ffffffff8003e4b2>] __might_sleep+0x50/0x7a
    [ 31.689435] [<ffffffff80822676>] down_read+0x30/0x130
    [ 31.689728] [<ffffffff8000b650>] do_page_fault+0x166/x446
    [ 31.689997] [<ffffffff80003c0c>] ret_from_exception+0x0/0xc

    Fixes: 74784081aac8 ("riscv: Add uprobes supported")
    Signed-off-by: Yipeng Zou <zouyipeng@huawei.com>
    Reviewed-by: Guo Ren <guoren@kernel.org>
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/20220721065820.245755-1-zouyipeng@huawei.com
    Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    arch/riscv/kernel/probes/uprobes.c | 6 ------
    1 file changed, 6 deletions(-)

    --- a/arch/riscv/kernel/probes/uprobes.c
    +++ b/arch/riscv/kernel/probes/uprobes.c
    @@ -59,8 +59,6 @@ int arch_uprobe_pre_xol(struct arch_upro

    instruction_pointer_set(regs, utask->xol_vaddr);

    - regs->status &= ~SR_SPIE;
    -
    return 0;
    }

    @@ -72,8 +70,6 @@ int arch_uprobe_post_xol(struct arch_upr

    instruction_pointer_set(regs, utask->vaddr + auprobe->insn_size);

    - regs->status |= SR_SPIE;
    -
    return 0;
    }

    @@ -111,8 +107,6 @@ void arch_uprobe_abort_xol(struct arch_u
    * address.
    */
    instruction_pointer_set(regs, utask->vaddr);
    -
    - regs->status &= ~SR_SPIE;
    }

    bool arch_uretprobe_is_alive(struct return_instance *ret, enum rp_check ctx,

    \
     
     \ /
      Last update: 2022-08-15 20:19    [W:9.043 / U:0.152 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site