MIPS: Fix kernel hang under FUNCTION_GRAPH_TRACER and PREEMPT_TRACER
[ Upstream commit78cf0eb926] When update the latest mainline kernel with the following three configs, the kernel hangs during startup: (1) CONFIG_FUNCTION_GRAPH_TRACER=y (2) CONFIG_PREEMPT_TRACER=y (3) CONFIG_FTRACE_STARTUP_TEST=y When update the latest mainline kernel with the above two configs (1) and (2), the kernel starts normally, but it still hangs when execute the following command: echo "function_graph" > /sys/kernel/debug/tracing/current_tracer Without CONFIG_PREEMPT_TRACER=y, the above two kinds of kernel hangs disappeared, so it seems that CONFIG_PREEMPT_TRACER has some influences with function_graph tracer at the first glance. I use ejtag to find out the epc address is related with preempt_enable() in the file arch/mips/lib/mips-atomic.c, because function tracing can trace the preempt_{enable,disable} calls that are traced, replace them with preempt_{enable,disable}_notrace to prevent function tracing from going into an infinite loop, and then it can fix the kernel hang issue. By the way, it seems that this commit is a complement and improvement of commitf93a1a00f2("MIPS: Fix crash that occurs when function tracing is enabled"). Signed-off-by: Tiezhu Yang <yangtiezhu@loongson.cn> Cc: Steven Rostedt <rostedt@goodmis.org> Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
37a079a6ae
commit
7519ece673
@@ -37,7 +37,7 @@
|
|||||||
*/
|
*/
|
||||||
notrace void arch_local_irq_disable(void)
|
notrace void arch_local_irq_disable(void)
|
||||||
{
|
{
|
||||||
preempt_disable();
|
preempt_disable_notrace();
|
||||||
|
|
||||||
__asm__ __volatile__(
|
__asm__ __volatile__(
|
||||||
" .set push \n"
|
" .set push \n"
|
||||||
@@ -53,7 +53,7 @@ notrace void arch_local_irq_disable(void)
|
|||||||
: /* no inputs */
|
: /* no inputs */
|
||||||
: "memory");
|
: "memory");
|
||||||
|
|
||||||
preempt_enable();
|
preempt_enable_notrace();
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(arch_local_irq_disable);
|
EXPORT_SYMBOL(arch_local_irq_disable);
|
||||||
|
|
||||||
@@ -61,7 +61,7 @@ notrace unsigned long arch_local_irq_save(void)
|
|||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
preempt_disable();
|
preempt_disable_notrace();
|
||||||
|
|
||||||
__asm__ __volatile__(
|
__asm__ __volatile__(
|
||||||
" .set push \n"
|
" .set push \n"
|
||||||
@@ -78,7 +78,7 @@ notrace unsigned long arch_local_irq_save(void)
|
|||||||
: /* no inputs */
|
: /* no inputs */
|
||||||
: "memory");
|
: "memory");
|
||||||
|
|
||||||
preempt_enable();
|
preempt_enable_notrace();
|
||||||
|
|
||||||
return flags;
|
return flags;
|
||||||
}
|
}
|
||||||
@@ -88,7 +88,7 @@ notrace void arch_local_irq_restore(unsigned long flags)
|
|||||||
{
|
{
|
||||||
unsigned long __tmp1;
|
unsigned long __tmp1;
|
||||||
|
|
||||||
preempt_disable();
|
preempt_disable_notrace();
|
||||||
|
|
||||||
__asm__ __volatile__(
|
__asm__ __volatile__(
|
||||||
" .set push \n"
|
" .set push \n"
|
||||||
@@ -106,7 +106,7 @@ notrace void arch_local_irq_restore(unsigned long flags)
|
|||||||
: "0" (flags)
|
: "0" (flags)
|
||||||
: "memory");
|
: "memory");
|
||||||
|
|
||||||
preempt_enable();
|
preempt_enable_notrace();
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(arch_local_irq_restore);
|
EXPORT_SYMBOL(arch_local_irq_restore);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user