lkml.org 
[lkml]   [2022]   [Apr]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.17 087/146] irq_work: use kasan_record_aux_stack_noalloc() record callstack
    Date
    From: Zqiang <qiang1.zhang@intel.com>

    [ Upstream commit 25934fcfb93c4687ad32fd3d062bcf03457129d4 ]

    On PREEMPT_RT kernel and KASAN is enabled. the kasan_record_aux_stack()
    may call alloc_pages(), and the rt-spinlock will be acquired, if currently
    in atomic context, will trigger warning:

    BUG: sleeping function called from invalid context at kernel/locking/spinlock_rt.c:46
    in_atomic(): 1, irqs_disabled(): 1, non_block: 0, pid: 239, name: bootlogd
    Preemption disabled at:
    [<ffffffffbab1a531>] rt_mutex_slowunlock+0xa1/0x4e0
    CPU: 3 PID: 239 Comm: bootlogd Tainted: G W 5.17.1-rt17-yocto-preempt-rt+ #105
    Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.15.0-0-g2dd4b9b3f840-prebuilt.qemu.org 04/01/2014
    Call Trace:
    __might_resched.cold+0x13b/0x173
    rt_spin_lock+0x5b/0xf0
    get_page_from_freelist+0x20c/0x1610
    __alloc_pages+0x25e/0x5e0
    __stack_depot_save+0x3c0/0x4a0
    kasan_save_stack+0x3a/0x50
    __kasan_record_aux_stack+0xb6/0xc0
    kasan_record_aux_stack+0xe/0x10
    irq_work_queue_on+0x6a/0x1c0
    pull_rt_task+0x631/0x6b0
    do_balance_callbacks+0x56/0x80
    __balance_callbacks+0x63/0x90
    rt_mutex_setprio+0x349/0x880
    rt_mutex_slowunlock+0x22a/0x4e0
    rt_spin_unlock+0x49/0x80
    uart_write+0x186/0x2b0
    do_output_char+0x2e9/0x3a0
    n_tty_write+0x306/0x800
    file_tty_write.isra.0+0x2af/0x450
    tty_write+0x22/0x30
    new_sync_write+0x27c/0x3a0
    vfs_write+0x3f7/0x5d0
    ksys_write+0xd9/0x180
    __x64_sys_write+0x43/0x50
    do_syscall_64+0x44/0x90
    entry_SYSCALL_64_after_hwframe+0x44/0xae

    Fix it by using kasan_record_aux_stack_noalloc() to avoid the call to
    alloc_pages().

    Link: https://lkml.kernel.org/r/20220402142555.2699582-1-qiang1.zhang@intel.com
    Signed-off-by: Zqiang <qiang1.zhang@intel.com>
    Cc: Andrey Ryabinin <ryabinin.a.a@gmail.com>
    Cc: Alexander Potapenko <glider@google.com>
    Cc: Andrey Konovalov <andreyknvl@gmail.com>
    Cc: Dmitry Vyukov <dvyukov@google.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    kernel/irq_work.c | 2 +-
    1 file changed, 1 insertion(+), 1 deletion(-)

    diff --git a/kernel/irq_work.c b/kernel/irq_work.c
    index f7df715ec28e..7afa40fe5cc4 100644
    --- a/kernel/irq_work.c
    +++ b/kernel/irq_work.c
    @@ -137,7 +137,7 @@ bool irq_work_queue_on(struct irq_work *work, int cpu)
    if (!irq_work_claim(work))
    return false;

    - kasan_record_aux_stack(work);
    + kasan_record_aux_stack_noalloc(work);

    preempt_disable();
    if (cpu != smp_processor_id()) {
    --
    2.35.1


    \
     
     \ /
      Last update: 2022-04-26 11:32    [W:4.120 / U:0.084 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site