mirror of https://gitee.com/openkylin/linux.git
ftrace: disable tracing on acpi idle calls
The acpi idle waits calls local_irq_save and then uses mwait to go into idle. The tracer gets reenabled at local_irq_save but does not detect that the idle allows for wake ups. This patch adds code to disable the tracing when acpi puts the CPU to idle. Signed-off-by: Steven Rostedt <srostedt@redhat.com> Cc: Peter Zijlstra <peterz@infradead.org> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
1986b0cb16
commit
dcf3099745
|
@ -272,6 +272,8 @@ static atomic_t c3_cpu_count;
|
||||||
/* Common C-state entry for C2, C3, .. */
|
/* Common C-state entry for C2, C3, .. */
|
||||||
static void acpi_cstate_enter(struct acpi_processor_cx *cstate)
|
static void acpi_cstate_enter(struct acpi_processor_cx *cstate)
|
||||||
{
|
{
|
||||||
|
/* Don't trace irqs off for idle */
|
||||||
|
stop_critical_timings();
|
||||||
if (cstate->entry_method == ACPI_CSTATE_FFH) {
|
if (cstate->entry_method == ACPI_CSTATE_FFH) {
|
||||||
/* Call into architectural FFH based C-state */
|
/* Call into architectural FFH based C-state */
|
||||||
acpi_processor_ffh_cstate_enter(cstate);
|
acpi_processor_ffh_cstate_enter(cstate);
|
||||||
|
@ -284,6 +286,7 @@ static void acpi_cstate_enter(struct acpi_processor_cx *cstate)
|
||||||
gets asserted in time to freeze execution properly. */
|
gets asserted in time to freeze execution properly. */
|
||||||
unused = inl(acpi_gbl_FADT.xpm_timer_block.address);
|
unused = inl(acpi_gbl_FADT.xpm_timer_block.address);
|
||||||
}
|
}
|
||||||
|
start_critical_timings();
|
||||||
}
|
}
|
||||||
#endif /* !CONFIG_CPU_IDLE */
|
#endif /* !CONFIG_CPU_IDLE */
|
||||||
|
|
||||||
|
@ -1418,6 +1421,8 @@ static inline void acpi_idle_update_bm_rld(struct acpi_processor *pr,
|
||||||
*/
|
*/
|
||||||
static inline void acpi_idle_do_entry(struct acpi_processor_cx *cx)
|
static inline void acpi_idle_do_entry(struct acpi_processor_cx *cx)
|
||||||
{
|
{
|
||||||
|
/* Don't trace irqs off for idle */
|
||||||
|
stop_critical_timings();
|
||||||
if (cx->entry_method == ACPI_CSTATE_FFH) {
|
if (cx->entry_method == ACPI_CSTATE_FFH) {
|
||||||
/* Call into architectural FFH based C-state */
|
/* Call into architectural FFH based C-state */
|
||||||
acpi_processor_ffh_cstate_enter(cx);
|
acpi_processor_ffh_cstate_enter(cx);
|
||||||
|
@ -1432,6 +1437,7 @@ static inline void acpi_idle_do_entry(struct acpi_processor_cx *cx)
|
||||||
gets asserted in time to freeze execution properly. */
|
gets asserted in time to freeze execution properly. */
|
||||||
unused = inl(acpi_gbl_FADT.xpm_timer_block.address);
|
unused = inl(acpi_gbl_FADT.xpm_timer_block.address);
|
||||||
}
|
}
|
||||||
|
start_critical_timings();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue