From nobody Fri May 3 11:12:27 2024 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 1529576648414368.9900123355029; Thu, 21 Jun 2018 03:24:08 -0700 (PDT) Received: from localhost ([::1]:54316 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fVwl5-0003cI-Ij for importer@patchew.org; Thu, 21 Jun 2018 06:24:07 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53246) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fVwjF-0002ka-VQ for qemu-devel@nongnu.org; Thu, 21 Jun 2018 06:22:15 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fVwjE-0001e5-S0 for qemu-devel@nongnu.org; Thu, 21 Jun 2018 06:22:13 -0400 Received: from mail-qt0-x243.google.com ([2607:f8b0:400d:c0d::243]:41619) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fVwjE-0001dw-N6 for qemu-devel@nongnu.org; Thu, 21 Jun 2018 06:22:12 -0400 Received: by mail-qt0-x243.google.com with SMTP id y20-v6so2308132qto.8 for ; Thu, 21 Jun 2018 03:22:12 -0700 (PDT) Received: from localhost.localdomain ([2804:431:f701:8296:fe0b:2550:5aa8:2171]) by smtp.gmail.com with ESMTPSA id d42-v6sm2256974qtd.88.2018.06.21.03.22.10 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 21 Jun 2018 03:22:11 -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=zx+yLPVnrnotPHzfYdyA9IuCS6O3rQZhHm+pbPNCWqc=; b=um6rZvZhF1M7iiTsLYSeCfcZk648WxZI8hVdqMvClxFAsyOvFDco9v1a1s1dgH1Odq bN4oXx48/JQmB8uQwHIvWxeq03fBA4tBLrK20rp/MAXL7nlvmgynM0HIG02NFsXilsUa Mh6zscKCu1F6TAVz9iv07SqtWUtaTb9rBsoPMyw1bWsR61oBJOdu33SKmueJngnTbyno Puh1HU4zukde7rQ1clJjWCm2Ec16WsVUOq4y385x0hez+Sgs/06Hkj0z/EmTZOHAh2w8 qAh7h0xPDOU9PQg2aEEOeo/P48iaModnhyvqbEN2RgYo4Ab2TipKANpTPGnN+MoPcdZn hZKA== 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=zx+yLPVnrnotPHzfYdyA9IuCS6O3rQZhHm+pbPNCWqc=; b=gx/zkQtVcfx+LUSAxkK9s/XMEwo6N5ntGjawVhZlW3PvzYkUecSCn0b7Cg3hnLejJ/ WZQ+zk6FnTJ0sQR0UJEWwOtODNVxUEGaggDFJMcpSvoJfcZMixTm1ZHldRsTk37CNp2i oQy5w6eYprWWDbyxQ/PciTzTNtDn/qAKnoqzfV3f3WUMP4qt0Hjb5doWXPy2q8iNwN9e 208M+ymftpqtM312d8bUuz0AV2lfpTk1WIfTnSk3W4s3Ijel0Ur4p/NYtA0snetwIdq5 YZa1jqOuu/XfNbQ1Y4lPI9b9WhYTc9VqYDWOF9wDleYCVMeqBkrWJziSxrffgK+zVH3t vn+Q== X-Gm-Message-State: APt69E3+EOwTW0s+AW1AB875ugGxoualCztKc7OEQ8RrLhTVriKdshX1 ZNKLQQ82AGclnQs4BFtWMNKXS1cD9LE= X-Google-Smtp-Source: ADUXVKKSYcMPTBbsBidmGgtvS528izDe04+n7PrV4z83RSumR7Xdb8dya+YK0XXbQrFXZC78TX4/lA== X-Received: by 2002:aed:3766:: with SMTP id i93-v6mr22917847qtb.277.1529576532091; Thu, 21 Jun 2018 03:22:12 -0700 (PDT) From: Daniel Henrique Barboza To: qemu-devel@nongnu.org Date: Thu, 21 Jun 2018 07:21:48 -0300 Message-Id: <20180621102153.28443-2-danielhb413@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180621102153.28443-1-danielhb413@gmail.com> References: <20180621102153.28443-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::243 Subject: [Qemu-devel] [PATCH v2 1/6] qga: refactoring qmp_guest_suspend_* functions 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 , marcandre.lureau@gmail.com, mdroth@linux.vnet.ibm.com, armbru@redhat.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" To be able to add new suspend mechanisms we need to detach the existing QMP functions from the current implementation specifics. At this moment we have functions such as qmp_guest_suspend_ram calling bios_suspend_mode and guest_suspend passing the pmutils command and arguments as parameters. This patch removes this logic from the QMP functions, moving them to the respective functions that will have to deal with which binary to use. Signed-off-by: Daniel Henrique Barboza --- qga/commands-posix.c | 87 ++++++++++++++++++++++++++++---------------- 1 file changed, 55 insertions(+), 32 deletions(-) diff --git a/qga/commands-posix.c b/qga/commands-posix.c index eae817191b..63c49791a4 100644 --- a/qga/commands-posix.c +++ b/qga/commands-posix.c @@ -1438,15 +1438,38 @@ qmp_guest_fstrim(bool has_minimum, int64_t minimum,= Error **errp) #define LINUX_SYS_STATE_FILE "/sys/power/state" #define SUSPEND_SUPPORTED 0 #define SUSPEND_NOT_SUPPORTED 1 +#define SUSPEND_MODE_DISK 1 +#define SUSPEND_MODE_RAM 2 +#define SUSPEND_MODE_HYBRID 3 =20 -static void bios_supports_mode(const char *pmutils_bin, const char *pmutil= s_arg, - const char *sysfile_str, Error **errp) +static void bios_supports_mode(int suspend_mode, Error **errp) { Error *local_err =3D NULL; + const char *pmutils_arg, *sysfile_str; + const char *pmutils_bin =3D "pm-is-supported"; char *pmutils_path; pid_t pid; int status; =20 + switch (suspend_mode) { + + case SUSPEND_MODE_DISK: + pmutils_arg =3D "--hibernate"; + sysfile_str =3D "disk"; + break; + case SUSPEND_MODE_RAM: + pmutils_arg =3D "--suspend"; + sysfile_str =3D "mem"; + break; + case SUSPEND_MODE_HYBRID: + pmutils_arg =3D "--suspend-hybrid"; + sysfile_str =3D NULL; + break; + default: + error_setg(errp, "guest suspend mode not supported"); + return; + } + pmutils_path =3D g_find_program_in_path(pmutils_bin); =20 pid =3D fork(); @@ -1523,14 +1546,39 @@ out: g_free(pmutils_path); } =20 -static void guest_suspend(const char *pmutils_bin, const char *sysfile_str, - Error **errp) +static void guest_suspend(int suspend_mode, Error **errp) { Error *local_err =3D NULL; + const char *pmutils_bin, *sysfile_str; char *pmutils_path; 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) { + + 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; + } + pmutils_path =3D g_find_program_in_path(pmutils_bin); =20 pid =3D fork(); @@ -1593,42 +1641,17 @@ out: =20 void qmp_guest_suspend_disk(Error **errp) { - Error *local_err =3D NULL; - - bios_supports_mode("pm-is-supported", "--hibernate", "disk", &local_er= r); - if (local_err) { - error_propagate(errp, local_err); - return; - } - - guest_suspend("pm-hibernate", "disk", errp); + guest_suspend(SUSPEND_MODE_DISK, errp); } =20 void qmp_guest_suspend_ram(Error **errp) { - Error *local_err =3D NULL; - - bios_supports_mode("pm-is-supported", "--suspend", "mem", &local_err); - if (local_err) { - error_propagate(errp, local_err); - return; - } - - guest_suspend("pm-suspend", "mem", errp); + guest_suspend(SUSPEND_MODE_RAM, errp); } =20 void qmp_guest_suspend_hybrid(Error **errp) { - Error *local_err =3D NULL; - - bios_supports_mode("pm-is-supported", "--suspend-hybrid", NULL, - &local_err); - if (local_err) { - error_propagate(errp, local_err); - return; - } - - guest_suspend("pm-suspend-hybrid", NULL, errp); + guest_suspend(SUSPEND_MODE_HYBRID, errp); } =20 static GuestNetworkInterfaceList * --=20 2.17.1 From nobody Fri May 3 11:12:27 2024 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 15295766531633.215916650799386; Thu, 21 Jun 2018 03:24:13 -0700 (PDT) Received: from localhost ([::1]:54317 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fVwlA-0003eo-Bb for importer@patchew.org; Thu, 21 Jun 2018 06:24:12 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53258) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fVwjH-0002lm-SB for qemu-devel@nongnu.org; Thu, 21 Jun 2018 06:22:17 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fVwjG-0001ec-NT for qemu-devel@nongnu.org; Thu, 21 Jun 2018 06:22:15 -0400 Received: from mail-qt0-x243.google.com ([2607:f8b0:400d:c0d::243]:38023) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fVwjG-0001eS-IK for qemu-devel@nongnu.org; Thu, 21 Jun 2018 06:22:14 -0400 Received: by mail-qt0-x243.google.com with SMTP id e11-v6so1730310qtp.5 for ; Thu, 21 Jun 2018 03:22:14 -0700 (PDT) Received: from localhost.localdomain ([2804:431:f701:8296:fe0b:2550:5aa8:2171]) by smtp.gmail.com with ESMTPSA id d42-v6sm2256974qtd.88.2018.06.21.03.22.12 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 21 Jun 2018 03:22:13 -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=iVZrztSVcELAhqbdHKFYyi+XFU11JhBnjsiQg2pn02g=; b=Jlhj9qzkJtOyjCzz/Z1mhaN7pZv5BLkcgCoOl9I2cNz9+WbjBtk08WDAVBp8EpFAwY +pVK82XiFgFmNoDcI9p+2uIX8K6G2vKuF45SHLC09WhxByEpqg46qrRxBO03i4gAn0Wi Z14r2o9o1pe6bx28m8Sr3ykd1+iv/cqTy34OpjznDri3KVx9Az2Dm7zRm7KQY6RGwbBE X7+NUvzzeiC9mbNJIwHj55YSojwIrSOruv8YiYz5tFh1EOD1I+ia4G1JK8MTsyudMmWz O6Y97eplwYYgDZ3dwweaGwfsEw+sjKdzU6iZaxkcuKjuyRQmcmwtNTl3zxtvfI86wBF4 dPaw== 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=iVZrztSVcELAhqbdHKFYyi+XFU11JhBnjsiQg2pn02g=; b=pQUt2dISwqH7fP3wo6tczlV9KGA9m+5wJnK+uKIbJi9qUXYv/WlZFfic9WatS1ByZL Jx5P2PG9PI/OoUHHxJ3WSZtQUkIYYzS/1UZwAO6tPe6PsSSkIE0DozaNriZdDKHqPLp/ XKUbrguZUapcp4EWiIjyxCJIjvkZsL3itT+PMxs6drxkRVbfUDZU2iZRQtY8sQFmc0Pt cdBRf3MP3HuDWN1CMje7EJfY1RW+cMpEo5CutwOgsc1xvjh8cDyf6LoYOhCNmcNYpPDJ syS8GkW9ctW4xb3JKZXvLaWbiRzRU1Z+rL1zqdFUM1flntt3HMyZj8YK6V06r5guJj8j BIxg== X-Gm-Message-State: APt69E3YzZActuTM1lm/kJhN5IdJb7CGyEP9HcVmLHRiNwGl92dFPfhw wZC8PTJXJtdsc+wQ51gx7yIs4KaqX2E= X-Google-Smtp-Source: ADUXVKKHY3fPLC05HBxQHq7NsPdB3DsU/gX22kU8BxhtiUHs+5WPfdmDmSPQ1FIeVGH4dOmAp4r2Dw== X-Received: by 2002:ac8:5155:: with SMTP id h21-v6mr21841485qtn.311.1529576533998; Thu, 21 Jun 2018 03:22:13 -0700 (PDT) From: Daniel Henrique Barboza To: qemu-devel@nongnu.org Date: Thu, 21 Jun 2018 07:21:49 -0300 Message-Id: <20180621102153.28443-3-danielhb413@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180621102153.28443-1-danielhb413@gmail.com> References: <20180621102153.28443-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::243 Subject: [Qemu-devel] [PATCH v2 2/6] qga: bios_supports_mode: 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 , marcandre.lureau@gmail.com, mdroth@linux.vnet.ibm.com, armbru@redhat.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" In bios_supports_mode there is a verification to assert if the chosen suspend mode is supported by the pmutils tools and, if not, we see if the Linux sys state files supports it. This verification is done in the same function, one after the other, and it works for now. But, when adding a new suspend mechanism that will not necessarily follow the same return 0 or 1 logic of pmutils, this code will be hard to deal with. This patch decouple the two existing logics into their own functions, pmutils_supports_mode and linux_sys_state_supports_mode, which in turn are used inside bios_support_mode. The existing logic is kept but now it's easier to extend it. Signed-off-by: Daniel Henrique Barboza --- qga/commands-posix.c | 116 +++++++++++++++++++++++++------------------ 1 file changed, 68 insertions(+), 48 deletions(-) diff --git a/qga/commands-posix.c b/qga/commands-posix.c index 63c49791a4..89ffd8dc88 100644 --- a/qga/commands-posix.c +++ b/qga/commands-posix.c @@ -1442,75 +1442,43 @@ qmp_guest_fstrim(bool has_minimum, int64_t minimum,= Error **errp) #define SUSPEND_MODE_RAM 2 #define SUSPEND_MODE_HYBRID 3 =20 -static void bios_supports_mode(int suspend_mode, Error **errp) +static bool pmutils_supports_mode(int suspend_mode, Error **errp) { Error *local_err =3D NULL; - const char *pmutils_arg, *sysfile_str; + const char *pmutils_arg; const char *pmutils_bin =3D "pm-is-supported"; char *pmutils_path; pid_t pid; int status; + bool ret =3D false; =20 switch (suspend_mode) { =20 case SUSPEND_MODE_DISK: pmutils_arg =3D "--hibernate"; - sysfile_str =3D "disk"; break; case SUSPEND_MODE_RAM: pmutils_arg =3D "--suspend"; - sysfile_str =3D "mem"; break; case SUSPEND_MODE_HYBRID: pmutils_arg =3D "--suspend-hybrid"; - sysfile_str =3D NULL; break; default: - error_setg(errp, "guest suspend mode not supported"); - return; + return ret; } =20 pmutils_path =3D g_find_program_in_path(pmutils_bin); + if (!pmutils_path) { + return ret; + } =20 pid =3D fork(); if (!pid) { - char buf[32]; /* hopefully big enough */ - ssize_t ret; - int fd; - setsid(); - reopen_fd_to_null(0); - reopen_fd_to_null(1); - reopen_fd_to_null(2); - - if (pmutils_path) { - execle(pmutils_path, pmutils_bin, pmutils_arg, NULL, environ); - } - + execle(pmutils_path, pmutils_bin, pmutils_arg, 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 we get here execle() has failed. */ - - if (!sysfile_str) { - _exit(SUSPEND_NOT_SUPPORTED); - } - - fd =3D open(LINUX_SYS_STATE_FILE, O_RDONLY); - if (fd < 0) { - _exit(SUSPEND_NOT_SUPPORTED); - } - - ret =3D read(fd, buf, sizeof(buf)-1); - if (ret <=3D 0) { - _exit(SUSPEND_NOT_SUPPORTED); - } - buf[ret] =3D '\0'; - - if (strstr(buf, sysfile_str)) { - _exit(SUSPEND_SUPPORTED); - } - _exit(SUSPEND_NOT_SUPPORTED); } else if (pid < 0) { error_setg_errno(errp, errno, "failed to create child process"); @@ -1523,17 +1491,11 @@ static void bios_supports_mode(int suspend_mode, Er= ror **errp) goto out; } =20 - if (!WIFEXITED(status)) { - error_setg(errp, "child process has terminated abnormally"); - goto out; - } - switch (WEXITSTATUS(status)) { case SUSPEND_SUPPORTED: + ret =3D true; goto out; case SUSPEND_NOT_SUPPORTED: - error_setg(errp, - "the requested suspend mode is not supported by the gue= st"); goto out; default: error_setg(errp, @@ -1544,6 +1506,64 @@ static void bios_supports_mode(int suspend_mode, Err= or **errp) =20 out: g_free(pmutils_path); + return ret; +} + +static bool linux_sys_state_supports_mode(int suspend_mode, Error **errp) +{ + const char *sysfile_str; + char buf[32]; /* hopefully big enough */ + int fd; + ssize_t ret; + + switch (suspend_mode) { + + case SUSPEND_MODE_DISK: + sysfile_str =3D "disk"; + break; + case SUSPEND_MODE_RAM: + sysfile_str =3D "mem"; + break; + default: + return false; + } + + fd =3D open(LINUX_SYS_STATE_FILE, O_RDONLY); + if (fd < 0) { + return false; + } + + ret =3D read(fd, buf, sizeof(buf) - 1); + if (ret <=3D 0) { + return false; + } + buf[ret] =3D '\0'; + + if (strstr(buf, sysfile_str)) { + return true; + } + return false; +} + +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; + } } =20 static void guest_suspend(int suspend_mode, Error **errp) --=20 2.17.1 From nobody Fri May 3 11:12:27 2024 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 1529576813763526.993797453344; Thu, 21 Jun 2018 03:26:53 -0700 (PDT) Received: from localhost ([::1]:54333 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fVwnk-0005wg-VQ for importer@patchew.org; Thu, 21 Jun 2018 06:26:53 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53269) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fVwjJ-0002nI-SS for qemu-devel@nongnu.org; Thu, 21 Jun 2018 06:22:19 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fVwjI-0001fC-LZ for qemu-devel@nongnu.org; Thu, 21 Jun 2018 06:22:17 -0400 Received: from mail-qt0-x234.google.com ([2607:f8b0:400d:c0d::234]:33730) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fVwjI-0001f1-Fk for qemu-devel@nongnu.org; Thu, 21 Jun 2018 06:22:16 -0400 Received: by mail-qt0-x234.google.com with SMTP id l10-v6so2334688qtj.0 for ; Thu, 21 Jun 2018 03:22:16 -0700 (PDT) Received: from localhost.localdomain ([2804:431:f701:8296:fe0b:2550:5aa8:2171]) by smtp.gmail.com with ESMTPSA id d42-v6sm2256974qtd.88.2018.06.21.03.22.14 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 21 Jun 2018 03:22:15 -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=ln8RZqb7OwC/hVKcdLLgVg0PutO9s10cM3kjqcKgA3c=; b=biY3laAwlR0ANMdI+LdNGLmcI5A3j9LKcCnhzyVHGERa6VyrRKHMWl1twWAzbVLvuu M04beRu+65pm3iG73GFgA4CSIZCK01ZevXZwplryk7FsKdOwUNc0RmNVJfXr0fy+wnCu PFt2YedfqDLQr24Ew8j4MSOjJM6FZ/aaO6pyRAS+BPmCRgdN8etDyC0/SfSyxVvrus9T VNUP4+DONf6lBza+RsZp11h3csmL4KeM98jVrgf4PusXiL9/pm6gi8wx++eI/jSq/g5p k20GwSDex08eZqLlnsSNE0CPNg/AmySxxRqsSHdfIJb6a6ZBXJ58ah3MdZI14sl37cab Ga3Q== 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=ln8RZqb7OwC/hVKcdLLgVg0PutO9s10cM3kjqcKgA3c=; b=kRSygoXq2dV/2aD/Aqv8cvqTwsKtgzws4WtV8XQm5H6Pa7ErQi0zpGHZoTN15czJP3 TFKBiDPlRbzoiYRR1D64hWqHp75bhdtzdgF3AAB71t08yrVhAibbXKfkdaMZvv8IS/7e sjZDhZXGGNlhfrp3ejZY69qSi7cR31Tk0VXg40CGmgYAsML2mu21Kd9D4kjFJnZfnR31 X1jsrTr50LB5n/McwCi7/MKHxhxMHDF8eL006jtnO/fo+wVUag9bPz7/HXgnZMAAFgG8 D24Mz7tZXQR5d77JO13Hb4OmtF7uiB3PbMfp6ye5v8Yyfkq84FO/69iKEoclObVKpcg1 sCWQ== X-Gm-Message-State: APt69E2j26UXYPK2PfCC/YHeWCJRSLoD4GEvJmc7JbP7ta682/ewtd0m vOjgGEum6QT6YKz/gIu70ruQgvxvYV0= X-Google-Smtp-Source: ADUXVKJFjVn7Bx1upyeALYSi9JWjrB3t2FZ2Anw+yRdxCE4mHcIbDB8IHgjbabpu0FigI8EQbyn+2Q== X-Received: by 2002:ac8:112:: with SMTP id e18-v6mr21194643qtg.91.1529576535763; Thu, 21 Jun 2018 03:22:15 -0700 (PDT) From: Daniel Henrique Barboza To: qemu-devel@nongnu.org Date: Thu, 21 Jun 2018 07:21:50 -0300 Message-Id: <20180621102153.28443-4-danielhb413@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180621102153.28443-1-danielhb413@gmail.com> References: <20180621102153.28443-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::234 Subject: [Qemu-devel] [PATCH v2 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 , marcandre.lureau@gmail.com, mdroth@linux.vnet.ibm.com, armbru@redhat.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..4b6fbd9b80 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; + } + + error_free(local_err); + + 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 From nobody Fri May 3 11:12:27 2024 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 1529576828013616.4963498597044; Thu, 21 Jun 2018 03:27:08 -0700 (PDT) Received: from localhost ([::1]:54335 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fVwnz-00067v-6q for importer@patchew.org; Thu, 21 Jun 2018 06:27:07 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53286) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fVwjM-0002pe-GK for qemu-devel@nongnu.org; Thu, 21 Jun 2018 06:22:22 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fVwjK-0001fp-TH for qemu-devel@nongnu.org; Thu, 21 Jun 2018 06:22:20 -0400 Received: from mail-qt0-x241.google.com ([2607:f8b0:400d:c0d::241]:40104) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fVwjK-0001fc-Mz for qemu-devel@nongnu.org; Thu, 21 Jun 2018 06:22:18 -0400 Received: by mail-qt0-x241.google.com with SMTP id q6-v6so2308372qtn.7 for ; Thu, 21 Jun 2018 03:22:18 -0700 (PDT) Received: from localhost.localdomain ([2804:431:f701:8296:fe0b:2550:5aa8:2171]) by smtp.gmail.com with ESMTPSA id d42-v6sm2256974qtd.88.2018.06.21.03.22.15 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 21 Jun 2018 03:22:17 -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=aafRhRjwdkKj2KqX7ZH5M7Z4C7dJehNJifEC6gJu2Vo=; b=t6IfU//zt2wSTAGyOsZxo2n/Jor5WHCYgwvP1QJJV8EQX/5qzycB5nDmUVrxhdh7kf wkfZfPbTU826ULfjPEDlAv3PqYhNIbgy0iIdcS/1qgb+umCSk+nPipRtY21V+S5rzBjF wNgk4K7t04cGIxK4pQEQcvX7yaSfjoXfaav7Q6diCCYZuCf0ys3H6GJwuHbMQCBRX1Qz 5kdOPtDmT/fBoCnbeeJhNbilzKESaao8wB6EyZpzvpczkC+HMbNEmQaidW/AbV9S1obk qmzml6vTTHQ6YJy4nL9d2E+obPIV0Xx70bN69STj90uh28D3o+m1kN5JLfPFjCd9A2zX QU1Q== 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=aafRhRjwdkKj2KqX7ZH5M7Z4C7dJehNJifEC6gJu2Vo=; b=EKpWW4aJN26WG3C2mZiGd0YkpukbrkoYH9+WaMgPXWruO9ZO7/z97Jr18lqWfV8oFZ CCrRMrUE1qwhbiNVChW8xhSltgyLeY5aL2te7uzFLfLsLeSu1ooeMNExX2Hnc1Otvl/i +Npo7r4QiCdNbOGrG/r26YSDpaTKhA8HEU4ZOUVZyReYPeARnSEBHt9/i5xf1jITYIdP 7e+YBr6rD2N9DAsCsSKg+V6/wExEz+oEnzk3YfT9RyVwXAQcSzrHlMK5N8xVKsiJOJ/H bCRPdv87mIJXhXIJeQTTxhrRzhWjympHMaGtgyD59kI4a+a7vwTSR+WJU1sm/oTFT29n 75yA== X-Gm-Message-State: APt69E0JFhrgTZwFlb2Y6fPV8LiK2QO9oD8e79PgiUJ+A/sJ+kIlPgiZ ueJYP3Z0X63LKn3rg1ETHr6lpCRFm/Y= X-Google-Smtp-Source: ADUXVKKCoqAkhkZRh1FqGM045CQGtx7eh7C5u85vg3AXJo5cvKmgGpBxN2QKab2Rn8lmrUpecHyk4w== X-Received: by 2002:aed:3a29:: with SMTP id n38-v6mr22386597qte.108.1529576537837; Thu, 21 Jun 2018 03:22:17 -0700 (PDT) From: Daniel Henrique Barboza To: qemu-devel@nongnu.org Date: Thu, 21 Jun 2018 07:21:51 -0300 Message-Id: <20180621102153.28443-5-danielhb413@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180621102153.28443-1-danielhb413@gmail.com> References: <20180621102153.28443-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::241 Subject: [Qemu-devel] [PATCH v2 4/6] qga: removing switch statements, adding run_process_child 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 , marcandre.lureau@gmail.com, mdroth@linux.vnet.ibm.com, armbru@redhat.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" This is a cleanup of the resulting code after detaching pmutils and Linux sys state file logic: - remove the SUSPEND_MODE_* macros and use an enumeration instead. At the same time, drop the switch statements at the start of each function and use the enumeration index to get the right binary/argument; - create a new function called run_process_child(). This function uses g_spawn_sync() to execute a shell command, returning the exit code. This is a common operation in the pmutils functions and will be used in the systemd implementation as well, so this function will avoid code repetition. There are more places inside commands-posix.c where this new run_process_child function can also be used, but one step at a time. Signed-off-by: Daniel Henrique Barboza --- qga/commands-posix.c | 211 +++++++++++++++++-------------------------- 1 file changed, 84 insertions(+), 127 deletions(-) diff --git a/qga/commands-posix.c b/qga/commands-posix.c index 4b6fbd9b80..925544ae6d 100644 --- a/qga/commands-posix.c +++ b/qga/commands-posix.c @@ -1438,152 +1438,117 @@ qmp_guest_fstrim(bool has_minimum, int64_t minimu= m, Error **errp) #define LINUX_SYS_STATE_FILE "/sys/power/state" #define SUSPEND_SUPPORTED 0 #define SUSPEND_NOT_SUPPORTED 1 -#define SUSPEND_MODE_DISK 1 -#define SUSPEND_MODE_RAM 2 -#define SUSPEND_MODE_HYBRID 3 =20 -static bool pmutils_supports_mode(int suspend_mode, Error **errp) +typedef enum { + SUSPEND_MODE_DISK =3D 0, + SUSPEND_MODE_RAM =3D 1, + SUSPEND_MODE_HYBRID =3D 2, +} SuspendMode; + +/* + * Executes a command in a child process using g_spawn_sync, + * returning an int >=3D 0 representing the exit status of the + * process. + * + * If the program wasn't found in path, returns -1. + * + * If a problem happened when creating the child process, + * returns -1 and errp is set. + */ +static int run_process_child(const char *command[], Error **errp) { - Error *local_err =3D NULL; - const char *pmutils_arg; - const char *pmutils_bin =3D "pm-is-supported"; - char *pmutils_path; - pid_t pid; - int status; - bool ret =3D false; + int exit_status, spawn_flag; + GError *g_err =3D NULL; + bool success; =20 - switch (suspend_mode) { + spawn_flag =3D G_SPAWN_SEARCH_PATH | G_SPAWN_STDOUT_TO_DEV_NULL | + G_SPAWN_STDERR_TO_DEV_NULL; =20 - case SUSPEND_MODE_DISK: - pmutils_arg =3D "--hibernate"; - break; - case SUSPEND_MODE_RAM: - pmutils_arg =3D "--suspend"; - break; - case SUSPEND_MODE_HYBRID: - pmutils_arg =3D "--suspend-hybrid"; - break; - default: - return ret; + success =3D g_spawn_sync(NULL, (char **)command, environ, spawn_flag, + NULL, NULL, NULL, NULL, + &exit_status, &g_err); + + if (success) { + return WEXITSTATUS(exit_status); } =20 - pmutils_path =3D g_find_program_in_path(pmutils_bin); - if (!pmutils_path) { - return ret; + if (g_err && (g_err->code !=3D G_SPAWN_ERROR_NOENT)) { + error_setg(errp, "failed to create child process, error '%s'", + g_err->message); } =20 - pid =3D fork(); - if (!pid) { - setsid(); - execle(pmutils_path, pmutils_bin, pmutils_arg, NULL, environ); - /* - * If we get here execle() has failed. - */ - _exit(SUSPEND_NOT_SUPPORTED); - } else if (pid < 0) { - error_setg_errno(errp, errno, "failed to create child process"); - goto out; + g_error_free(g_err); + return -1; +} + +static bool pmutils_supports_mode(SuspendMode mode, Error **errp) +{ + Error *local_err =3D NULL; + const char *pmutils_args[3] =3D {"--hibernate", "--suspend", + "--suspend-hybrid"}; + const char *cmd[3] =3D {"pm-is-supported", pmutils_args[mode], NULL}; + int status; + + status =3D run_process_child(cmd, &local_err); + + if (status =3D=3D SUSPEND_SUPPORTED) { + return true; } =20 - ga_wait_child(pid, &status, &local_err); - if (local_err) { - error_propagate(errp, local_err); - goto out; + if ((status =3D=3D -1) && !local_err) { + return false; } =20 - switch (WEXITSTATUS(status)) { - case SUSPEND_SUPPORTED: - ret =3D true; - goto out; - case SUSPEND_NOT_SUPPORTED: - goto out; - default: + if (local_err) { + error_propagate(errp, local_err); + } else { error_setg(errp, - "the helper program '%s' returned an unexpected exit st= atus" - " code (%d)", pmutils_path, WEXITSTATUS(status)); - goto out; + "the helper program '%s' returned an unexpected exit" + " status code (%d)", "pm-is-supported", status); } =20 -out: - g_free(pmutils_path); - return ret; + return false; } =20 -static void pmutils_suspend(int suspend_mode, Error **errp) +static void pmutils_suspend(SuspendMode mode, Error **errp) { Error *local_err =3D NULL; - const char *pmutils_bin; - char *pmutils_path; - pid_t pid; + const char *pmutils_binaries[3] =3D {"pm-hibernate", "pm-suspend", + "pm-suspend-hybrid"}; + const char *cmd[2] =3D {pmutils_binaries[mode], NULL}; int status; =20 - 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; - } + status =3D run_process_child(cmd, &local_err); =20 - 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); + if (status =3D=3D 0) { return; } =20 - 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; + if ((status =3D=3D -1) && !local_err) { + error_setg(errp, "the helper program '%s' was not found", + pmutils_binaries[mode]); + return; } =20 - ga_wait_child(pid, &status, &local_err); if (local_err) { error_propagate(errp, local_err); - goto out; - } - - if (WEXITSTATUS(status)) { + } else { error_setg(errp, - "the helper program '%s' returned an unexpected exit st= atus" - " code (%d)", pmutils_path, WEXITSTATUS(status)); + "the helper program '%s' returned an unexpected exit" + " status code (%d)", pmutils_binaries[mode], status); } - -out: - g_free(pmutils_path); } =20 -static bool linux_sys_state_supports_mode(int suspend_mode, Error **errp) +static bool linux_sys_state_supports_mode(SuspendMode mode, Error **errp) { - const char *sysfile_str; + const char *sysfile_strs[3] =3D {"disk", "mem", NULL}; + const char *sysfile_str =3D sysfile_strs[mode]; char buf[32]; /* hopefully big enough */ int fd; ssize_t ret; =20 - switch (suspend_mode) { - - case SUSPEND_MODE_DISK: - sysfile_str =3D "disk"; - break; - case SUSPEND_MODE_RAM: - sysfile_str =3D "mem"; - break; - default: + if (!sysfile_str) { + error_setg(errp, "unknown guest suspend mode"); return false; } =20 @@ -1604,22 +1569,15 @@ static bool linux_sys_state_supports_mode(int suspe= nd_mode, Error **errp) return false; } =20 -static void linux_sys_state_suspend(int suspend_mode, Error **errp) +static void linux_sys_state_suspend(SuspendMode mode, Error **errp) { Error *local_err =3D NULL; - const char *sysfile_str; + const char *sysfile_strs[3] =3D {"disk", "mem", NULL}; + const char *sysfile_str =3D sysfile_strs[mode]; pid_t pid; int status; =20 - switch (suspend_mode) { - - case SUSPEND_MODE_DISK: - sysfile_str =3D "disk"; - break; - case SUSPEND_MODE_RAM: - sysfile_str =3D "mem"; - break; - default: + if (!sysfile_str) { error_setg(errp, "unknown guest suspend mode"); return; } @@ -1661,12 +1619,12 @@ static void linux_sys_state_suspend(int suspend_mod= e, Error **errp) =20 } =20 -static void bios_supports_mode(int suspend_mode, Error **errp) +static void bios_supports_mode(SuspendMode mode, Error **errp) { Error *local_err =3D NULL; bool ret; =20 - ret =3D pmutils_supports_mode(suspend_mode, &local_err); + ret =3D pmutils_supports_mode(mode, &local_err); if (ret) { return; } @@ -1674,32 +1632,31 @@ static void bios_supports_mode(int suspend_mode, Er= ror **errp) error_propagate(errp, local_err); return; } - ret =3D linux_sys_state_supports_mode(suspend_mode, errp); + ret =3D linux_sys_state_supports_mode(mode, &local_err); if (!ret) { error_setg(errp, "the requested suspend mode is not supported by the gue= st"); - return; } } =20 -static void guest_suspend(int suspend_mode, Error **errp) +static void guest_suspend(SuspendMode mode, Error **errp) { Error *local_err =3D NULL; =20 - bios_supports_mode(suspend_mode, &local_err); + bios_supports_mode(mode, &local_err); if (local_err) { error_propagate(errp, local_err); return; } =20 - pmutils_suspend(suspend_mode, &local_err); + pmutils_suspend(mode, &local_err); if (!local_err) { return; } =20 error_free(local_err); =20 - linux_sys_state_suspend(suspend_mode, &local_err); + linux_sys_state_suspend(mode, &local_err); if (local_err) { error_propagate(errp, local_err); } --=20 2.17.1 From nobody Fri May 3 11:12:27 2024 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 1529576820913884.7198266675387; Thu, 21 Jun 2018 03:27:00 -0700 (PDT) Received: from localhost ([::1]:54334 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fVwnr-00062z-JT for importer@patchew.org; Thu, 21 Jun 2018 06:26:59 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53292) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fVwjN-0002qK-Aj for qemu-devel@nongnu.org; Thu, 21 Jun 2018 06:22:22 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fVwjM-0001g6-Bq for qemu-devel@nongnu.org; Thu, 21 Jun 2018 06:22:21 -0400 Received: from mail-qt0-x234.google.com ([2607:f8b0:400d:c0d::234]:36198) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fVwjM-0001g1-73 for qemu-devel@nongnu.org; Thu, 21 Jun 2018 06:22:20 -0400 Received: by mail-qt0-x234.google.com with SMTP id o9-v6so2320716qtp.3 for ; Thu, 21 Jun 2018 03:22:20 -0700 (PDT) Received: from localhost.localdomain ([2804:431:f701:8296:fe0b:2550:5aa8:2171]) by smtp.gmail.com with ESMTPSA id d42-v6sm2256974qtd.88.2018.06.21.03.22.18 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 21 Jun 2018 03:22:19 -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=VulEx+qA0kZwi2XUzByyi+v216uQU3wahOga2Q4uA38=; b=lXAVn/HPjieRvFelTJsL3aURPpedeEhAcwDDxDXX6oOR+xR+D1Z6M2l+uFMWc6HgKs iIt8K4z+qDKbTlQVK/hIsCeMAb0gEgHvb6b75baIaABUnb2dl8H2MSpuVMZTy/pa90aX 6GtcJNRZtlQaClApUzwoBs1kvIcb9+n2CnG9B2vFut5ZrTyVQdJ85ix/HTG4qayMZ4a3 gsdso1oS4C9aHhzmJsv/eqMA+l6ffG+ke+vMKm8effdota7LCkPc+XFilZWhrQsRJ7Ec Da822KUq2SYfSEm5tfxUL0G/wCO1Xa0Yk5cmMYs+wuzhNe87Qp5Myxtn4vvLVoDzrH8a 1OGA== 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=VulEx+qA0kZwi2XUzByyi+v216uQU3wahOga2Q4uA38=; b=V8OSC8Thlp5gFecRUekjtzSQNSNJoNxjS788gqd2cL0OpImHv7WCRwHkGCP6IS3elZ 8Y7cRcpcqY8t3f6LSFP37CeuW7AUL0LDSnCsibdBNL+fwu1YRnH4gpyVLMfj31RZP/ex W7URisbbvc5Lmtcq8GwGBDalf9ScyWWAw9Ys23E5yyxuJML+tU90gRjkORSxnjfMIeqv 3mOtpBJ7crz0kefbLT+LseZzFO83a6r488kNpjJBu3cuG+u+G0Wi2viawaT0LDveoKUD w5zxxErsIJcvULnEImNTCzdYrt2LE3gP+tjSFOfpWOdlSp46C47HXk7gM8uv2vRee2f8 gEPQ== X-Gm-Message-State: APt69E2hL3k/XCTSFC6TgZTEnBVXInxjnONENVhv4MeFxeim0o1RuEAU hAWEhq13RNpV7lXlMHfCXTd6L/A8CMI= X-Google-Smtp-Source: ADUXVKLCiy8HWdk252TD3pFcKNS0+cY3Ysb0fenCZUFZ+kvUnSO5gnd/b3Kolkem5Osp/yBH/4GCVQ== X-Received: by 2002:ac8:152:: with SMTP id f18-v6mr22201589qtg.296.1529576539682; Thu, 21 Jun 2018 03:22:19 -0700 (PDT) From: Daniel Henrique Barboza To: qemu-devel@nongnu.org Date: Thu, 21 Jun 2018 07:21:52 -0300 Message-Id: <20180621102153.28443-6-danielhb413@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180621102153.28443-1-danielhb413@gmail.com> References: <20180621102153.28443-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::234 Subject: [Qemu-devel] [PATCH v2 5/6] qga: systemd hibernate/suspend/hybrid-sleep support 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 , marcandre.lureau@gmail.com, mdroth@linux.vnet.ibm.com, armbru@redhat.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" pmutils isn't being supported by newer OSes like Fedora 27 or Mint. This means that the only suspend option QGA offers for these guests are writing directly into the Linux sys state file. This also means that QGA also loses the ability to do hybrid suspend in those guests - this suspend mode is only available when using pmutils. Newer guests can use systemd facilities to do all the suspend types QGA supports. The mapping in comparison with pmutils is: - pm-hibernate -> systemctl hibernate - pm-suspend -> systemctl suspend - pm-suspend-hybrid -> systemctl hybrid-sleep To discover whether systemd supports these functions, we inspect the status of the services that implements them. With this patch, we can offer hybrid suspend again for newer guests that do not have pmutils support anymore. Signed-off-by: Daniel Henrique Barboza --- qga/commands-posix.c | 72 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/qga/commands-posix.c b/qga/commands-posix.c index 925544ae6d..3546b74fed 100644 --- a/qga/commands-posix.c +++ b/qga/commands-posix.c @@ -1481,6 +1481,63 @@ static int run_process_child(const char *command[], = Error **errp) return -1; } =20 +static bool systemd_supports_mode(SuspendMode mode, Error **errp) +{ + Error *local_err =3D NULL; + const char *systemctl_args[3] =3D {"systemd-hibernate", "systemd-suspe= nd", + "systemd-hybrid-sleep"}; + const char *cmd[4] =3D {"systemctl", "status", systemctl_args[mode], N= ULL}; + int status; + + status =3D run_process_child(cmd, &local_err); + + /* + * systemctl status uses LSB return codes so we can expect + * status > 0 and be ok. To assert if the guest has support + * for the selected suspend mode, status should be < 4. 4 is + * the code for unknown service status, the return value when + * the service does not exist. A common value is status =3D 3 + * (program is not running). + */ + if (status > 0 && status < 4) { + return true; + } + + if (local_err) { + error_propagate(errp, local_err); + } + + return false; +} + +static void systemd_suspend(SuspendMode mode, Error **errp) +{ + Error *local_err =3D NULL; + const char *systemctl_args[3] =3D {"hibernate", "suspend", "hybrid-sle= ep"}; + const char *cmd[3] =3D {"systemctl", systemctl_args[mode], NULL}; + int status; + + status =3D run_process_child(cmd, &local_err); + + if (status =3D=3D 0) { + return; + } + + if ((status =3D=3D -1) && !local_err) { + error_setg(errp, "the helper program 'systemctl %s' was not found", + systemctl_args[mode]); + return; + } + + if (local_err) { + error_propagate(errp, local_err); + } else { + error_setg(errp, "the helper program 'systemctl %s' returned an " + "unexpected exit status code (%d)", + systemctl_args[mode], status); + } +} + static bool pmutils_supports_mode(SuspendMode mode, Error **errp) { Error *local_err =3D NULL; @@ -1624,6 +1681,14 @@ static void bios_supports_mode(SuspendMode mode, Err= or **errp) Error *local_err =3D NULL; bool ret; =20 + ret =3D systemd_supports_mode(mode, &local_err); + if (ret) { + return; + } + if (local_err) { + error_propagate(errp, local_err); + return; + } ret =3D pmutils_supports_mode(mode, &local_err); if (ret) { return; @@ -1649,6 +1714,13 @@ static void guest_suspend(SuspendMode mode, Error **= errp) return; } =20 + systemd_suspend(mode, &local_err); + if (!local_err) { + return; + } + + error_free(local_err); + pmutils_suspend(mode, &local_err); if (!local_err) { return; --=20 2.17.1 From nobody Fri May 3 11:12:27 2024 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 1529576940817681.9636252464072; Thu, 21 Jun 2018 03:29:00 -0700 (PDT) Received: from localhost ([::1]:54349 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fVwpo-0007hr-4e for importer@patchew.org; Thu, 21 Jun 2018 06:29:00 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53308) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fVwjP-0002s4-D0 for qemu-devel@nongnu.org; Thu, 21 Jun 2018 06:22:24 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fVwjO-0001gf-Dv for qemu-devel@nongnu.org; Thu, 21 Jun 2018 06:22:23 -0400 Received: from mail-qt0-x236.google.com ([2607:f8b0:400d:c0d::236]:34308) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fVwjO-0001gW-8e for qemu-devel@nongnu.org; Thu, 21 Jun 2018 06:22:22 -0400 Received: by mail-qt0-x236.google.com with SMTP id d3-v6so2336071qto.1 for ; Thu, 21 Jun 2018 03:22:22 -0700 (PDT) Received: from localhost.localdomain ([2804:431:f701:8296:fe0b:2550:5aa8:2171]) by smtp.gmail.com with ESMTPSA id d42-v6sm2256974qtd.88.2018.06.21.03.22.19 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 21 Jun 2018 03:22:21 -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=BaZRrnMaoP5l+tWnqXXXFhah5KMxuV+Oc2C7jud3tFU=; b=AHJLJYkgASYj3nVIhfGznUoSLRn70kZR9pcgKQGpS2LN16dr+qWgi7aZeJlIs0qi4g 9PzTXy8xXG36fTYoGJfei+2BoR8sPdzApjZuHV+fyj96I8f43MgBtzUFW7/UFTer1K24 v/0mEhGmo/c3r+tbURmKmySkwo9GOhCWPLwbcm8Uepiovp7VYjxGtV//3UAatOkT7wAc Tz8atzHynHOUkCUwduJHlKUNbpcHlsHOEOFgpBT8irMYMG5sbMwCF9GqnP1y78o1eRrG 7N97CPnSjNsxehBzLyGTQcmHThzNMAcGyLdAfxDnP0cnrawKzduhOGLy180aFi3tqEma J8Jg== 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=BaZRrnMaoP5l+tWnqXXXFhah5KMxuV+Oc2C7jud3tFU=; b=DIz+ankrMY1sTQiHn4lIBbfXcIxuVYDZ71TtFLKEPp70hRcDvfD/Qg/Oydrg9+zVLW UWwIrj5EiEvmGU4xF8C15tYSv5utyup0Yth9xiC28E4oDOxAS+nGtx7HMfaQje9OmqUR eE9BIDWdkCcPVGE8b1rwO/f3ALZVmVWyuW/EJhsNx2Xh0O0YcnoicIdRZ32IXF01BxiB so0hAYpwdWoHeyItTXzur85flTqfaMjTWAkhRG8Mss1vVP7e1Zkd9S9YawTGf/oulvsC Ne3M9DLYjQNyC5Ymy1fMGwvt1TAWonn0E4OOjoxkNacPWhC2qbS3qR5LxQR2noG5POlV wsqQ== X-Gm-Message-State: APt69E39WSnuXFOWr+Geq5hA2AO2lvp3ClE8MZcUoaySYG/offvp2Wla qLD/2U6tKn8Z4hlaOc9bBIjJ9vxFQWI= X-Google-Smtp-Source: ADUXVKKd1rywD95JW6Sw8g4TBAcoekYnZ238oTCUwoJ3AZbd5CKHkLL+jtIZvLsCDtdGJ9jahrknFA== X-Received: by 2002:ac8:720f:: with SMTP id a15-v6mr21586898qtp.243.1529576541394; Thu, 21 Jun 2018 03:22:21 -0700 (PDT) From: Daniel Henrique Barboza To: qemu-devel@nongnu.org Date: Thu, 21 Jun 2018 07:21:53 -0300 Message-Id: <20180621102153.28443-7-danielhb413@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180621102153.28443-1-danielhb413@gmail.com> References: <20180621102153.28443-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::236 Subject: [Qemu-devel] [PATCH v2 6/6] qga: removing bios_supports_mode 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 , marcandre.lureau@gmail.com, mdroth@linux.vnet.ibm.com, armbru@redhat.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" bios_support_mode verifies if the guest has support for a certain suspend mode but it doesn't inform back which suspend tool provides it. The caller, guest_suspend, executes all suspend strategies in order again. After adding systemd suspend support, bios_support_mode now will verify for support for systemd, then pmutils, then Linux sys state file. In a worst case scenario where both systemd and pmutils isn't supported but Linux sys state is: - bios_supports_mode will check for systemd, then pmutils, then Linux sys state. It will tell guest_suspend that there is support, but it will not tell who provides it; - guest_suspend will try to execute (and fail) systemd suspend, then pmutils suspend, to only then use the Linux sys suspend. The time spent executing systemd and pmutils suspend was wasted and could be avoided, but only bios_support_mode knew it but didn't inform it back. A quicker approach is to nuke bios_supports_mode and control whether we found support at all with a bool flag inside guest_suspend. guest_suspend will search for suspend support and execute it as soon as possible. If the a given suspend mechanism fails, continue to the next. If no suspend support is found, the "not supported" message is still being sent back to the user. Signed-off-by: Daniel Henrique Barboza --- qga/commands-posix.c | 54 +++++++++++++++----------------------------- 1 file changed, 18 insertions(+), 36 deletions(-) diff --git a/qga/commands-posix.c b/qga/commands-posix.c index 3546b74fed..d0d38cb7d9 100644 --- a/qga/commands-posix.c +++ b/qga/commands-posix.c @@ -1676,60 +1676,42 @@ static void linux_sys_state_suspend(SuspendMode mod= e, Error **errp) =20 } =20 -static void bios_supports_mode(SuspendMode mode, Error **errp) -{ - Error *local_err =3D NULL; - bool ret; - - ret =3D systemd_supports_mode(mode, &local_err); - if (ret) { - return; - } - if (local_err) { - error_propagate(errp, local_err); - return; - } - ret =3D pmutils_supports_mode(mode, &local_err); - if (ret) { - return; - } - if (local_err) { - error_propagate(errp, local_err); - return; - } - ret =3D linux_sys_state_supports_mode(mode, &local_err); - if (!ret) { - error_setg(errp, - "the requested suspend mode is not supported by the gue= st"); - } -} - static void guest_suspend(SuspendMode mode, Error **errp) { Error *local_err =3D NULL; + bool mode_supported =3D false; =20 - bios_supports_mode(mode, &local_err); - if (local_err) { - error_propagate(errp, local_err); - return; + if (systemd_supports_mode(mode, &local_err)) { + mode_supported =3D true; + systemd_suspend(mode, &local_err); } =20 - systemd_suspend(mode, &local_err); if (!local_err) { return; } =20 error_free(local_err); =20 - pmutils_suspend(mode, &local_err); + if (pmutils_supports_mode(mode, &local_err)) { + mode_supported =3D true; + pmutils_suspend(mode, &local_err); + } + if (!local_err) { return; } =20 error_free(local_err); =20 - linux_sys_state_suspend(mode, &local_err); - if (local_err) { + if (linux_sys_state_supports_mode(mode, &local_err)) { + mode_supported =3D true; + linux_sys_state_suspend(mode, &local_err); + } + + if (!mode_supported) { + error_setg(errp, + "the requested suspend mode is not supported by the gue= st"); + } else if (local_err) { error_propagate(errp, local_err); } } --=20 2.17.1