From 6a9365c88dd81cc541d5a940229693ba50be051b Mon Sep 17 00:00:00 2001 From: Robbie Harwood Date: Wed, 22 Mar 2023 18:39:56 +0000 Subject: [PATCH] emu: work around systemctl bad behavior Signed-off-by: Robbie Harwood --- ...ork-around-systemctl-kexec-returning.patch | 41 +++++++++++++++++++ grub.patches | 1 + grub2.spec | 5 ++- 3 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 0325-emu-linux-work-around-systemctl-kexec-returning.patch diff --git a/0325-emu-linux-work-around-systemctl-kexec-returning.patch b/0325-emu-linux-work-around-systemctl-kexec-returning.patch new file mode 100644 index 0000000..eaef5ff --- /dev/null +++ b/0325-emu-linux-work-around-systemctl-kexec-returning.patch @@ -0,0 +1,41 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Robbie Harwood +Date: Wed, 22 Mar 2023 14:19:43 -0400 +Subject: [PATCH] emu/linux: work around systemctl kexec returning + +Per systemctl(1), it "is asynchronous; it will return after the reboot +operation is enqueued, without waiting for it to complete". This +differs from kexec(8), which calls reboot(2) and therefore does not +return. + +When not using fallback, this results in the confusing-but-harmless: + + error trying to perform 'systemctl kexec': 0 + Aborted. Press any key to exit. + +on screen for a bit, followed by successful kexec. + +To reduce the liklihood of hitting this case, add a delay on succesful +return. Ultimately, the systemd interface is racy: we can't avoid it +entirely unless we never fallback on success. + +Signed-off-by: Robbie Harwood +--- + grub-core/loader/emu/linux.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/grub-core/loader/emu/linux.c b/grub-core/loader/emu/linux.c +index 0cf378a376..7de3f7f861 100644 +--- a/grub-core/loader/emu/linux.c ++++ b/grub-core/loader/emu/linux.c +@@ -74,6 +74,10 @@ grub_linux_boot (void) + (kexecute==1) ? "do-or-die" : "just-in-case"); + rc = grub_util_exec (systemctl); + ++ /* `systemctl kexec` is "asynchronous" and will return even on success. */ ++ if (rc == 0) ++ grub_sleep (10); ++ + if (kexecute == 1) + grub_fatal (N_("error trying to perform 'systemctl kexec': %d"), rc); + diff --git a/grub.patches b/grub.patches index a4fd33f..b625760 100644 --- a/grub.patches +++ b/grub.patches @@ -322,3 +322,4 @@ Patch0321: 0321-mm-Preallocate-some-space-when-adding-new-regions.patch Patch0322: 0322-mm-Avoid-complex-heap-growth-math-in-hot-path.patch Patch0323: 0323-hostdisk-work-around-proc-not-reporting-size.patch Patch0324: 0324-blscfg-check-for-mounted-boot-in-emu.patch +Patch0325: 0325-emu-linux-work-around-systemctl-kexec-returning.patch diff --git a/grub2.spec b/grub2.spec index 3705490..2dc55b4 100644 --- a/grub2.spec +++ b/grub2.spec @@ -17,7 +17,7 @@ Name: grub2 Epoch: 1 Version: 2.06 -Release: 89%{?dist} +Release: 90%{?dist} Summary: Bootloader with support for Linux, Multiboot and more License: GPLv3+ URL: http://www.gnu.org/software/grub/ @@ -544,6 +544,9 @@ mv ${EFI_HOME}/grub.cfg.stb ${EFI_HOME}/grub.cfg %endif %changelog +* Wed Mar 22 2023 Robbie Harwood - 2.06-90 +- emu: work around systemctl bad behavior + * Thu Mar 09 2023 Robbie Harwood - 2.06-89 - emu: handle BLS /boot weirdness