Hi Kostiantyn, Thank you again for your valuable feedback. I've conducted further tests to address your questions, and here are the details:
1. Regarding exit code 1: I performed an experiment with the kernel configuration: When CONFIG_HIBERNATION is disabled in the kernel: [root@VM-23-13-opencloudos OpenCloudOS-Kernel]# grep -i HIBERNATION /boot/config-6.6.47-12.oc9.x86_64 CONFIG_ARCH_HIBERNATION_POSSIBLE=y # CONFIG_HIBERNATION is not set The /sys/power/state shows no "disk" support: [root@VM-0-94-opencloudos patch]# cat /sys/power/state freeze mem While "systemctl status systemd-hibernate" returns code 3: [root@VM-0-94-opencloudos patch]# systemctl status systemd-hibernate ○ systemd-hibernate.service - Hibernate Loaded: loaded (/usr/lib/systemd/system/systemd-hibernate.service; static) Active: inactive (dead) Docs: man:systemd-hibernate.service(8) [root@VM-0-94-opencloudos patch]# echo $? 3 The actual hibernation command returns code 1 due to kernel incompatibility: [root@VM-0-94-opencloudos patch]# systemctl hibernate Call to Hibernate failed: Sleep verb 'hibernate' is not configured or configuration is not supported by kernel [root@VM-0-94-opencloudos patch]# echo $? 1 This confirms exit code 1 indicates actual hibernation support failure in this scenario. 2. Regarding mode_supported logic: I understand your confusion about the check in systemd_supports_mode(mode, &local_err). Another experiment illustrates the issue: On a system with hibernation enabled: [opencloudos@VM-23-13-opencloudos ~]$ grep -i HIBERNATION /boot/config-6.6.92+ CONFIG_ARCH_HIBERNATION_POSSIBLE=y CONFIG_ARCH_HIBERNATION_HEADER=y CONFIG_HIBERNATION=y CONFIG_HIBERNATION_SNAPSHOT_DEV=y /sys/power/state includes "disk": [opencloudos@VM-23-13-opencloudos ~]$ cat /sys/power/state freeze mem disk However, "systemctl status systemd-hibernate" still returns code 3 regardless of actual support: [opencloudos@VM-23-13-opencloudos ~]$ sudo systemctl status systemd-hibernate ○ systemd-hibernate.service - Hibernate Loaded: loaded (/usr/lib/systemd/system/systemd-hibernate.service; static) Active: inactive (dead) Docs: man:systemd-hibernate.service(8) [output truncated for brevity] [opencloudos@VM-23-13-opencloudos ~]$ echo $? 3 This shows "systemctl status" isn't reliable for determining support. The actual execution result of "systemctl hibernate" is necessary to accurately verify suspend-to-disk capability. Thanks again for your patience and guidance. I'll revise the patch accordingly and resubmit as v2. Best regards, panzerzheng Kostiantyn Kostiuk <kkost...@redhat.com> 于2025年8月4日周一 16:18写道: > > > On Mon, Aug 4, 2025 at 10:47 AM <zhengn...@gmail.com> wrote: > >> From: panzerzheng <panzerzh...@tencent.com> >> >> When "/sys/power/state" does not contain "disk", the operating system >> does not support hibernation. Executing "sudo systemctl hibernate" will >> return an exit code of 1 with the stderr output: "Call to Hibernate >> failed: >> Sleep verb 'hibernate' is not configured or configuration is not >> supported by kernel". >> > >> This patch adds handling for exit code 1 in the systemd_suspend function, >> setting appropriate error messages when the kernel does not support >> standby. >> It also adds local_err handling in the guest_suspend function to set >> mode_supported to false. >> >> Without these fixes, libvirt would hold the lock indefinitely. >> >> Signed-off-by: panzerzheng <panzerzh...@tencent.com> >> --- >> qga/commands-linux.c | 8 ++++++++ >> 1 file changed, 8 insertions(+) >> >> diff --git a/qga/commands-linux.c b/qga/commands-linux.c >> index 9e8a934b9a..26229396c3 100644 >> --- a/qga/commands-linux.c >> +++ b/qga/commands-linux.c >> @@ -1300,6 +1300,12 @@ static void systemd_suspend(SuspendMode mode, >> Error **errp) >> return; >> } >> >> + if ((status == 1) && !local_err) { >> > > Is there any documentation that explains that exit code = 1 is an error? > If you look into systemd_supports_mode, you can see that exit code = 1 is > detected > as a supported mode. > > >> + error_setg(errp, "'systemctl %s' not suspend", >> + systemctl_args[mode]); >> + return; >> + } >> + >> if (local_err) { >> error_propagate(errp, local_err); >> } else { >> @@ -1428,6 +1434,8 @@ static void guest_suspend(SuspendMode mode, Error >> **errp) >> >> if (!local_err) { >> return; >> + } else { >> + mode_supported = false; >> } >> > > This is very confusing. We check that the mode is supported, but after > running suspend, > we find that it is unsupported. I think we should fix > systemd_supports_mode instead. > > Also, setting mode_supported = false does not change anything. > In the next step, we will check pmutils_supports_mode and > linux_sys_state_supports_mode, > and I think this check will pass, so we set mode_supported = true again. > > Best Regards, > Kostiantyn Kostiuk. > > >> } >> >> -- >> 2.43.7 >> >>