diff --git a/arch/x86/kernel/stacktrace.c b/arch/x86/kernel/stacktrace.c index ee117fcf46ed..b7d2912a715b 100644 --- a/arch/x86/kernel/stacktrace.c +++ b/arch/x86/kernel/stacktrace.c @@ -17,6 +17,7 @@ void arch_stack_walk(stack_trace_consume_fn consume_entry, void *cookie, { struct unwind_state state; unsigned long addr; + unsigned int frame_count = 0; if (regs && !consume_entry(cookie, regs->ip)) return; @@ -26,6 +27,12 @@ void arch_stack_walk(stack_trace_consume_fn consume_entry, void *cookie, addr = unwind_get_return_address(&state); if (!addr || !consume_entry(cookie, addr)) break; + + if (IS_ENABLED(CONFIG_KASAN) && + (need_resched() || ++frame_count >= 16)) { + cond_resched(); + frame_count = 0; + } } }