mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-11-25 13:30:57 +07:00
ftrace: use raw_smp_processor_id for mcount functions
Due to debug hooks in the kernel that can change the way smp_processor_id works, use raw_smp_processor_id in mcount called functions (namely ftrace_record_ip). Currently we annotate most debug functions from calling mcount, but we should not rely on that to prevent kernel lockups. This patch uses the raw_smp_processor_id to prevent a recusive crash that can happen if a debug hook in smp_processor_id calls mcount. Signed-off-by: Steven Rostedt <srostedt@redhat.com> Signed-off-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
parent
a4feb8348b
commit
2bb6f8d638
@ -267,6 +267,7 @@ ftrace_record_ip(unsigned long ip)
|
|||||||
unsigned long key;
|
unsigned long key;
|
||||||
int resched;
|
int resched;
|
||||||
int atomic;
|
int atomic;
|
||||||
|
int cpu;
|
||||||
|
|
||||||
if (!ftrace_enabled || ftrace_disabled)
|
if (!ftrace_enabled || ftrace_disabled)
|
||||||
return;
|
return;
|
||||||
@ -274,9 +275,15 @@ ftrace_record_ip(unsigned long ip)
|
|||||||
resched = need_resched();
|
resched = need_resched();
|
||||||
preempt_disable_notrace();
|
preempt_disable_notrace();
|
||||||
|
|
||||||
/* We simply need to protect against recursion */
|
/*
|
||||||
__get_cpu_var(ftrace_shutdown_disable_cpu)++;
|
* We simply need to protect against recursion.
|
||||||
if (__get_cpu_var(ftrace_shutdown_disable_cpu) != 1)
|
* Use the the raw version of smp_processor_id and not
|
||||||
|
* __get_cpu_var which can call debug hooks that can
|
||||||
|
* cause a recursive crash here.
|
||||||
|
*/
|
||||||
|
cpu = raw_smp_processor_id();
|
||||||
|
per_cpu(ftrace_shutdown_disable_cpu, cpu)++;
|
||||||
|
if (per_cpu(ftrace_shutdown_disable_cpu, cpu) != 1)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (unlikely(ftrace_record_suspend))
|
if (unlikely(ftrace_record_suspend))
|
||||||
@ -317,7 +324,7 @@ ftrace_record_ip(unsigned long ip)
|
|||||||
out_unlock:
|
out_unlock:
|
||||||
spin_unlock_irqrestore(&ftrace_shutdown_lock, flags);
|
spin_unlock_irqrestore(&ftrace_shutdown_lock, flags);
|
||||||
out:
|
out:
|
||||||
__get_cpu_var(ftrace_shutdown_disable_cpu)--;
|
per_cpu(ftrace_shutdown_disable_cpu, cpu)--;
|
||||||
|
|
||||||
/* prevent recursion with scheduler */
|
/* prevent recursion with scheduler */
|
||||||
if (resched)
|
if (resched)
|
||||||
|
Loading…
Reference in New Issue
Block a user