Re: Pressing the power button causes the device to freeze completely

From: Rafael J. Wysocki

Date: Sun Apr 26 2026 - 10:50:46 EST


On Friday, April 24, 2026 11:18:02 PM CEST Evgeny Sagatov wrote:
> dmesg | grep "Fast frequency"
> Nothing was displayed.
>
> The PC froze when I pressed the power button. Nothing in the log.
>
> I applied this patch after deleting all the previous ones. Is this correct?

Yes, it is.

> I received this message when applying a patch. Perhaps we have
> different versions of the source code? I'm using 7.0.0.
> patching file drivers/acpi/acpica/evevent.c
> patching file drivers/cpufreq/acpi-cpufreq.c
> Hunk #1 succeeded at 895 (offset -17 lines).
> patching file drivers/cpufreq/cpufreq.c

That should be fine.

We've switched over schedutil to a different code path and the problem is
still there, so it appears to be related to hardware accesses.

To test this, please apply the patch below (which is a replacement for the
previous patch) and collect the output of

$ dmesg | grep ""

after a fresh boot. Please let me know what's there.

Also, the "Fast frequency switching enabled" messages should be back.

Then, check what happens when the power button is pressed (if the system
doesn't lock up, a message should be printed to the kernel log every time
the power button is pressed).

With this patch applied, schedutil will not access hardware in the fast
frequency switching path, so the frequency scaling will not actually work
(this is roughly equivalent to running the "performance" or "powersave"
governor all the time).

---
drivers/acpi/acpica/evevent.c | 5 +++++
drivers/cpufreq/acpi-cpufreq.c | 6 ++++--
drivers/cpufreq/cpufreq.c | 1 +
3 files changed, 10 insertions(+), 2 deletions(-)

--- a/drivers/acpi/acpica/evevent.c
+++ b/drivers/acpi/acpica/evevent.c
@@ -243,6 +243,11 @@ static u32 acpi_ev_fixed_event_dispatch(
(void)acpi_write_bit_register(acpi_gbl_fixed_event_info[event].
status_register_id, ACPI_CLEAR_STATUS);

+ if (event == ACPI_EVENT_POWER_BUTTON) {
+ pr_info("ACPI power button event\n");
+ return (ACPI_INTERRUPT_HANDLED);
+ }
+
/*
* Make sure that a handler exists. If not, report an error
* and disable the event to prevent further interrupts.
--- a/drivers/cpufreq/acpi-cpufreq.c
+++ b/drivers/cpufreq/acpi-cpufreq.c
@@ -479,8 +479,8 @@ static unsigned int acpi_cpufreq_fast_sw
return next_freq;
}

- data->cpu_freq_write(&perf->control_register,
- perf->states[next_perf_state].control);
+ /*data->cpu_freq_write(&perf->control_register,
+ perf->states[next_perf_state].control);*/
perf->state = next_perf_state;
return next_freq;
}
@@ -887,9 +887,11 @@ static int acpi_cpufreq_cpu_init(struct
* unknown and not detectable via IO ports.
*/
policy->cur = acpi_cpufreq_guess_freq(data, policy->cpu);
+ pr_info("CPU%u: Using I/O space for frequency scaling\n", cpu);
break;
case ACPI_ADR_SPACE_FIXED_HARDWARE:
acpi_cpufreq_driver.get = get_cur_freq_on_cpu;
+ pr_info("CPU%u: Using FFH for frequency scaling\n", cpu);
break;
default:
break;
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -473,6 +473,7 @@ void cpufreq_enable_fast_switch(struct c
if (cpufreq_fast_switch_count >= 0) {
cpufreq_fast_switch_count++;
policy->fast_switch_enabled = true;
+ pr_info("CPU%u: Fast frequency switching enabled\n", policy->cpu);
} else {
pr_warn("CPU%u: Fast frequency switching not enabled\n",
policy->cpu);