From nobody Tue Feb 10 03:57:27 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 15294373759451008.109218230079; Tue, 19 Jun 2018 12:42:55 -0700 (PDT) Received: from localhost ([::1]:44658 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fVMWl-0005AT-6t for importer@patchew.org; Tue, 19 Jun 2018 15:42:55 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:52818) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fVMSd-0001mk-3q for qemu-devel@nongnu.org; Tue, 19 Jun 2018 15:38:40 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fVMSb-00031b-Us for qemu-devel@nongnu.org; Tue, 19 Jun 2018 15:38:39 -0400 Received: from mail-qt0-x242.google.com ([2607:f8b0:400d:c0d::242]:44707) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fVMSb-00031F-PB for qemu-devel@nongnu.org; Tue, 19 Jun 2018 15:38:37 -0400 Received: by mail-qt0-x242.google.com with SMTP id l33-v6so854218qta.11 for ; Tue, 19 Jun 2018 12:38:37 -0700 (PDT) Received: from localhost.localdomain ([2804:431:f701:9a90:70ce:7c7a:343e:57]) by smtp.gmail.com with ESMTPSA id a62-v6sm419686qka.11.2018.06.19.12.38.34 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 19 Jun 2018 12:38:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=Wnpt6mCHd3qNlZq2LgYQSRm1b79lm91iPu9HJnpLezI=; b=qlrHQHz+4IhLegeTgJ2Sa+v3PKLozlKyk9y4cHItNYRvWaz/EFmlo/SMcHkbGHwdrS H5ABe8nP4BLEq9x7BTXdmUEI8AJdEu4RqFVTpWwRW/IzYwsXDiM5RxQZuQ12CAZyvZrh zonW5nArawUAOKgyuh9WAR7q7ZhBYk8Hw9cNraXuFLgHLuw51WZX12cwVNhe/Orp5w8i VJQuagstQ9Z+tXt2JzunVqSUT4YF8yJL4U4SYSKd88SdHN0HC912xL1B4DZbVo82pzjz 6a1dRmJ0t4SBXg+2YO9OpzU+fLLSDHsrMXBZXO8pjGGEHeMTGbQggpwJz69YKIzFNUs5 fCZg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=Wnpt6mCHd3qNlZq2LgYQSRm1b79lm91iPu9HJnpLezI=; b=rR5VT4gu4WkTLdKM6UCI3tMJJYtplG1L5B4ldVq/5olszHV0fMJ7FgP/bF2f+29JQ0 eUndf/9lFum2nXCTPaXAezoFtVrrz/JpcyZK1eQPBP/ZG9pvyfoPdvvpSUraQ8Pzwe4/ dQk53xxTk9TGioDyXB4yCJTRruQjRZbRPoCyjsArc0CcZPy+FOKTvGJIXCegJxH87ZD2 TGqkAyN1DpfTHdmbaLoPKM3hGxD8g+L331xdryiOT+tP2rQDyQdJKc96DvpUA3a3h1iQ UPt2Y1JcV1Qz6m7OezHdsQTi+WjYQRaK0nJpXADF+mrefgtjzRKffjY6ZOd1hhCpnXRo yRjQ== X-Gm-Message-State: APt69E0eN7UflOT5mGEk6t11ucnpZpf7ScJ39DGbOnHCYebnoEUDJUzJ qA4KMCY3km8nZRW7TMGa7ZFlhvcJCvU= X-Google-Smtp-Source: ADUXVKJ89k6MIIjpoXkqjO+5mJFXg1GXVFLTmU9JfMTLRFBlnPpE2mL/9wIHzsZGsP/t5UdMmId7+g== X-Received: by 2002:a0c:86e1:: with SMTP id 30-v6mr15236189qvg.143.1529437117093; Tue, 19 Jun 2018 12:38:37 -0700 (PDT) From: Daniel Henrique Barboza To: qemu-devel@nongnu.org Date: Tue, 19 Jun 2018 16:38:03 -0300 Message-Id: <20180619193806.17419-4-danielhb413@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180619193806.17419-1-danielhb413@gmail.com> References: <20180619193806.17419-1-danielhb413@gmail.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:400d:c0d::242 Subject: [Qemu-devel] [PATCH v1 3/6] qga: guest_suspend: decoupling pm-utils and sys logic X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Daniel Henrique Barboza , armbru@redhat.com, mdroth@linux.vnet.ibm.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Following the same logic of the previous patch, let's also decouple the suspend logic from guest_suspend into specialized functions, one for each strategy we support at this moment. Signed-off-by: Daniel Henrique Barboza --- qga/commands-posix.c | 170 +++++++++++++++++++++++++++---------------- 1 file changed, 108 insertions(+), 62 deletions(-) diff --git a/qga/commands-posix.c b/qga/commands-posix.c index 89ffd8dc88..a2870f9ab9 100644 --- a/qga/commands-posix.c +++ b/qga/commands-posix.c @@ -1509,6 +1509,65 @@ out: return ret; } =20 +static void pmutils_suspend(int suspend_mode, Error **errp) +{ + Error *local_err =3D NULL; + const char *pmutils_bin; + char *pmutils_path; + pid_t pid; + int status; + + switch (suspend_mode) { + + case SUSPEND_MODE_DISK: + pmutils_bin =3D "pm-hibernate"; + break; + case SUSPEND_MODE_RAM: + pmutils_bin =3D "pm-suspend"; + break; + case SUSPEND_MODE_HYBRID: + pmutils_bin =3D "pm-suspend-hybrid"; + break; + default: + error_setg(errp, "unknown guest suspend mode"); + return; + } + + pmutils_path =3D g_find_program_in_path(pmutils_bin); + if (!pmutils_path) { + error_setg(errp, "the helper program '%s' was not found", pmutils_= bin); + return; + } + + pid =3D fork(); + if (!pid) { + setsid(); + execle(pmutils_path, pmutils_bin, NULL, environ); + /* + * If we get here execle() has failed. + */ + _exit(EXIT_FAILURE); + } else if (pid < 0) { + error_setg_errno(errp, errno, "failed to create child process"); + goto out; + } + + ga_wait_child(pid, &status, &local_err); + if (local_err) { + error_propagate(errp, local_err); + goto out; + } + + if (WEXITSTATUS(status)) { + error_setg(errp, + "the helper program '%s' returned an unexpected exit st= atus" + " code (%d)", pmutils_path, WEXITSTATUS(status)); + } + +out: + g_free(pmutils_path); +} + static bool linux_sys_state_supports_mode(int suspend_mode, Error **errp) { const char *sysfile_str; @@ -1545,64 +1604,28 @@ static bool linux_sys_state_supports_mode(int suspe= nd_mode, Error **errp) return false; } =20 -static void bios_supports_mode(int suspend_mode, Error **errp) -{ - Error *local_err =3D NULL; - bool ret; - - ret =3D pmutils_supports_mode(suspend_mode, &local_err); - if (ret) { - return; - } - if (local_err) { - error_propagate(errp, local_err); - return; - } - ret =3D linux_sys_state_supports_mode(suspend_mode, errp); - if (!ret) { - error_setg(errp, - "the requested suspend mode is not supported by the gue= st"); - return; - } -} - -static void guest_suspend(int suspend_mode, Error **errp) +static void linux_sys_state_suspend(int suspend_mode, Error **errp) { Error *local_err =3D NULL; - const char *pmutils_bin, *sysfile_str; - char *pmutils_path; + const char *sysfile_str; pid_t pid; int status; =20 - bios_supports_mode(suspend_mode, &local_err); - if (local_err) { - error_propagate(errp, local_err); - return; - } - switch (suspend_mode) { =20 case SUSPEND_MODE_DISK: - pmutils_bin =3D "pm-hibernate"; sysfile_str =3D "disk"; break; case SUSPEND_MODE_RAM: - pmutils_bin =3D "pm-suspend"; sysfile_str =3D "mem"; break; - case SUSPEND_MODE_HYBRID: - pmutils_bin =3D "pm-suspend-hybrid"; - sysfile_str =3D NULL; - break; default: error_setg(errp, "unknown guest suspend mode"); return; } =20 - pmutils_path =3D g_find_program_in_path(pmutils_bin); - pid =3D fork(); - if (pid =3D=3D 0) { + if (!pid) { /* child */ int fd; =20 @@ -1611,19 +1634,6 @@ static void guest_suspend(int suspend_mode, Error **= errp) reopen_fd_to_null(1); reopen_fd_to_null(2); =20 - if (pmutils_path) { - execle(pmutils_path, pmutils_bin, NULL, environ); - } - - /* - * If we get here either pm-utils is not installed or execle() has - * failed. Let's try the manual method if the caller wants it. - */ - - if (!sysfile_str) { - _exit(EXIT_FAILURE); - } - fd =3D open(LINUX_SYS_STATE_FILE, O_WRONLY); if (fd < 0) { _exit(EXIT_FAILURE); @@ -1636,27 +1646,63 @@ static void guest_suspend(int suspend_mode, Error *= *errp) _exit(EXIT_SUCCESS); } else if (pid < 0) { error_setg_errno(errp, errno, "failed to create child process"); - goto out; + return; } =20 ga_wait_child(pid, &status, &local_err); if (local_err) { error_propagate(errp, local_err); - goto out; - } - - if (!WIFEXITED(status)) { - error_setg(errp, "child process has terminated abnormally"); - goto out; + return; } =20 if (WEXITSTATUS(status)) { error_setg(errp, "child process has failed to suspend"); - goto out; } =20 -out: - g_free(pmutils_path); +} + +static void bios_supports_mode(int suspend_mode, Error **errp) +{ + Error *local_err =3D NULL; + bool ret; + + ret =3D pmutils_supports_mode(suspend_mode, &local_err); + if (ret) { + return; + } + if (local_err) { + error_propagate(errp, local_err); + return; + } + ret =3D linux_sys_state_supports_mode(suspend_mode, errp); + if (!ret) { + error_setg(errp, + "the requested suspend mode is not supported by the gue= st"); + return; + } +} + +static void guest_suspend(int suspend_mode, Error **errp) +{ + Error *local_err =3D NULL; + + bios_supports_mode(suspend_mode, &local_err); + if (local_err) { + error_propagate(errp, local_err); + return; + } + + pmutils_suspend(suspend_mode, &local_err); + if (!local_err) { + return; + } + + local_err =3D NULL; + + linux_sys_state_suspend(suspend_mode, &local_err); + if (local_err) { + error_propagate(errp, local_err); + } } =20 void qmp_guest_suspend_disk(Error **errp) --=20 2.17.1