Message ID | 20220608144516.998681585@infradead.org |
---|---|
State | Superseded |
Headers | show |
Series | cpuidle,rcu: Cleanup the mess | expand |
On Wed, Jun 8, 2022 at 4:47 PM Peter Zijlstra <peterz@infradead.org> wrote: > > All the idle routines are called with RCU disabled, as such there must > not be any tracing inside. > > Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> This actually does some additional code duplication cleanup which would be good to mention in the changelog. Or even move to a separate patch for that matter. Otherwise LGTM. > --- > drivers/acpi/processor_idle.c | 24 +++++++++++++----------- > 1 file changed, 13 insertions(+), 11 deletions(-) > > --- a/drivers/acpi/processor_idle.c > +++ b/drivers/acpi/processor_idle.c > @@ -108,8 +108,8 @@ static const struct dmi_system_id proces > static void __cpuidle acpi_safe_halt(void) > { > if (!tif_need_resched()) { > - safe_halt(); > - local_irq_disable(); > + raw_safe_halt(); > + raw_local_irq_disable(); > } > } > > @@ -524,16 +524,21 @@ static int acpi_idle_bm_check(void) > return bm_status; > } > > -static void wait_for_freeze(void) > +static __cpuidle void io_idle(unsigned long addr) > { > + /* IO port based C-state */ > + inb(addr); > + > #ifdef CONFIG_X86 > /* No delay is needed if we are in guest */ > if (boot_cpu_has(X86_FEATURE_HYPERVISOR)) > return; > #endif > - /* Dummy wait op - must do something useless after P_LVL2 read > - because chipsets cannot guarantee that STPCLK# signal > - gets asserted in time to freeze execution properly. */ > + /* > + * Dummy wait op - must do something useless after P_LVL2 read > + * because chipsets cannot guarantee that STPCLK# signal > + * gets asserted in time to freeze execution properly. > + */ > inl(acpi_gbl_FADT.xpm_timer_block.address); > } > > @@ -553,9 +558,7 @@ static void __cpuidle acpi_idle_do_entry > } else if (cx->entry_method == ACPI_CSTATE_HALT) { > acpi_safe_halt(); > } else { > - /* IO port based C-state */ > - inb(cx->address); > - wait_for_freeze(); > + io_idle(cx->address); > } > > perf_lopwr_cb(false); > @@ -577,8 +580,7 @@ static int acpi_idle_play_dead(struct cp > if (cx->entry_method == ACPI_CSTATE_HALT) > safe_halt(); > else if (cx->entry_method == ACPI_CSTATE_SYSTEMIO) { > - inb(cx->address); > - wait_for_freeze(); > + io_idle(cx->address); > } else > return -ENODEV; > > >
--- a/drivers/acpi/processor_idle.c +++ b/drivers/acpi/processor_idle.c @@ -108,8 +108,8 @@ static const struct dmi_system_id proces static void __cpuidle acpi_safe_halt(void) { if (!tif_need_resched()) { - safe_halt(); - local_irq_disable(); + raw_safe_halt(); + raw_local_irq_disable(); } } @@ -524,16 +524,21 @@ static int acpi_idle_bm_check(void) return bm_status; } -static void wait_for_freeze(void) +static __cpuidle void io_idle(unsigned long addr) { + /* IO port based C-state */ + inb(addr); + #ifdef CONFIG_X86 /* No delay is needed if we are in guest */ if (boot_cpu_has(X86_FEATURE_HYPERVISOR)) return; #endif - /* Dummy wait op - must do something useless after P_LVL2 read - because chipsets cannot guarantee that STPCLK# signal - gets asserted in time to freeze execution properly. */ + /* + * Dummy wait op - must do something useless after P_LVL2 read + * because chipsets cannot guarantee that STPCLK# signal + * gets asserted in time to freeze execution properly. + */ inl(acpi_gbl_FADT.xpm_timer_block.address); } @@ -553,9 +558,7 @@ static void __cpuidle acpi_idle_do_entry } else if (cx->entry_method == ACPI_CSTATE_HALT) { acpi_safe_halt(); } else { - /* IO port based C-state */ - inb(cx->address); - wait_for_freeze(); + io_idle(cx->address); } perf_lopwr_cb(false); @@ -577,8 +580,7 @@ static int acpi_idle_play_dead(struct cp if (cx->entry_method == ACPI_CSTATE_HALT) safe_halt(); else if (cx->entry_method == ACPI_CSTATE_SYSTEMIO) { - inb(cx->address); - wait_for_freeze(); + io_idle(cx->address); } else return -ENODEV;
All the idle routines are called with RCU disabled, as such there must not be any tracing inside. Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> --- drivers/acpi/processor_idle.c | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-)