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;
>
>
>