diff options
Diffstat (limited to 'arch/riscv/kernel/stacktrace.c')
| -rw-r--r-- | arch/riscv/kernel/stacktrace.c | 5 | 
1 files changed, 3 insertions, 2 deletions
diff --git a/arch/riscv/kernel/stacktrace.c b/arch/riscv/kernel/stacktrace.c index 75c8dd64fc48..64a9c093aef9 100644 --- a/arch/riscv/kernel/stacktrace.c +++ b/arch/riscv/kernel/stacktrace.c @@ -32,6 +32,7 @@ void notrace walk_stackframe(struct task_struct *task, struct pt_regs *regs,  		fp = (unsigned long)__builtin_frame_address(0);  		sp = current_stack_pointer;  		pc = (unsigned long)walk_stackframe; +		level = -1;  	} else {  		/* task blocked in __switch_to */  		fp = task->thread.s[0]; @@ -43,7 +44,7 @@ void notrace walk_stackframe(struct task_struct *task, struct pt_regs *regs,  		unsigned long low, high;  		struct stackframe *frame; -		if (unlikely(!__kernel_text_address(pc) || (level++ >= 1 && !fn(arg, pc)))) +		if (unlikely(!__kernel_text_address(pc) || (level++ >= 0 && !fn(arg, pc))))  			break;  		/* Validate frame pointer */ @@ -100,7 +101,7 @@ void notrace walk_stackframe(struct task_struct *task,  	while (!kstack_end(ksp)) {  		if (__kernel_text_address(pc) && unlikely(!fn(arg, pc)))  			break; -		pc = (*ksp++) - 0x4; +		pc = READ_ONCE_NOCHECK(*ksp++) - 0x4;  	}  }  |