aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndriy Gapon <avg@FreeBSD.org>2024-02-06 08:55:13 +0000
committerAndriy Gapon <avg@FreeBSD.org>2024-02-06 08:55:13 +0000
commite4ab361e53945a6c3e9d68c5e5ffc11de40a35f2 (patch)
tree55e550c6901360a6793efe5aee8e312bc417a311
parent8e1f58caf79bd50e6d0b1ae29d4fee8344f6f84c (diff)
downloadsrc-e4ab361e53945a6c3e9d68c5e5ffc11de40a35f2.tar.gz
src-e4ab361e53945a6c3e9d68c5e5ffc11de40a35f2.zip
fix poweroff regression from 9cdf326b4f by delaying shutdown_halt
The regression affected ACPI-based systems without EFI poweroff support (including VMs). The key reason for the regression is that I overlooked that poweroff is requested by RB_POWEROFF | RB_HALT combination of flags. In my opinion, that command is a bit bipolar, but since we've been doing that forever, then so be it. Because of that flag combination, the order of shutdown_final handlers that check for either flag does matter. Some additional complexity comes from platform-specific shutdown_final handlers that aim to handle multiple reboot options at once. E.g., acpi_shutdown_final handles both poweroff and reboot / reset. As explained in 9cdf326b4f, such a handler must run after shutdown_panic to give it a chance. But as the change revealed, the handler must also run before shutdown_halt, so that the system can actually power off before entering the halt limbo. Previously, shutdown_panic and shutdown_halt had the same priority which appears to be incompatible with handlers that can do both poweroff and reset. The above also applies to power cycle handlers. PR: 276784 Reported by: many Tested by: Katsuyuki Miyoshi <katsubsd@gmail.com>, Masachika ISHIZUKA <ish@amail.plala.or.jp> Fixes: 9cdf326b4fae run acpi_shutdown_final later to give other handlers a chance MFC after: 1 week
-rw-r--r--sys/kern/kern_shutdown.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/sys/kern/kern_shutdown.c b/sys/kern/kern_shutdown.c
index ee666281418f..f49e315a503d 100644
--- a/sys/kern/kern_shutdown.c
+++ b/sys/kern/kern_shutdown.c
@@ -262,10 +262,10 @@ shutdown_conf(void *unused)
EVENTHANDLER_REGISTER(shutdown_final, poweroff_wait, NULL,
SHUTDOWN_PRI_FIRST);
- EVENTHANDLER_REGISTER(shutdown_final, shutdown_halt, NULL,
- SHUTDOWN_PRI_LAST + 100);
EVENTHANDLER_REGISTER(shutdown_final, shutdown_panic, NULL,
SHUTDOWN_PRI_LAST + 100);
+ EVENTHANDLER_REGISTER(shutdown_final, shutdown_halt, NULL,
+ SHUTDOWN_PRI_LAST + 200);
}
SYSINIT(shutdown_conf, SI_SUB_INTRINSIC, SI_ORDER_ANY, shutdown_conf, NULL);