From nobody Mon May 6 02:54:07 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 (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 15294373452431003.9928661246288; Tue, 19 Jun 2018 12:42:25 -0700 (PDT) Received: from localhost ([::1]:44656 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fVMW7-0004jy-4f for importer@patchew.org; Tue, 19 Jun 2018 15:42:15 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:52721) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fVMSX-0001i1-VX for qemu-devel@nongnu.org; Tue, 19 Jun 2018 15:38:35 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fVMSW-0002v9-Np for qemu-devel@nongnu.org; Tue, 19 Jun 2018 15:38:33 -0400 Received: from mail-qt0-x241.google.com ([2607:f8b0:400d:c0d::241]:33086) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fVMSW-0002un-Ge for qemu-devel@nongnu.org; Tue, 19 Jun 2018 15:38:32 -0400 Received: by mail-qt0-x241.google.com with SMTP id l10-v6so894120qtj.0 for ; Tue, 19 Jun 2018 12:38:32 -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.29 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 19 Jun 2018 12:38:31 -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=MTZWzVu6EhJbdk1daxv8n8ytIAdkODulfgP/0t7VPLODg9My/5JKuX+glN0/p/9vuI Vsz/rQjuGyPy+tPEHy4K1Ey0BBeBOu23iLw8Nd/x3Ml1KS4N96xDzX5cJ+6BJVZfbxtL vdkwEBLGOudbwCvOBOtxVcPBPYkXuH9HhIt0kfSaEC/QMt00CKV3+M9sRNM4gX/URZ/x R7ndhwyRqjnEpe/PEcGQGNCtZUyT8ZrkEu1Q+Y/Ta0rYJN1X5AdXLTr1tQ58zNN/0NZL lLjEdlaBfLB+q+zlo3pmyjG8U/G3JF1bAkc2xRxDljL8n28MXo+5+Ka9hGF6OBPt3zHT oBQA== 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=LT+yq0aa7YY1PJUdlirHXJGbzwVjAxodHpf5U/illAI/uwmpr/EnxMBmyrV6IDFP8w W68xmZ+H7wB+JMqhV1YSkl7dSDRZY/zwnolqM/SGWACeNXXfMmQu8i58Rfq/yCP+ohg5 KTlrjaMGMwAXBFCnc+qbkmJWBfzLs9h+6+X90VAZtvuimnzWY54ZS3rWXnIPqjwt1L2v zSSUlOMz8e134OIUp7M7r3RO3Ut54gL73jrve7iFABDYLyALdxAVDu9xxO53bWGeUeoq BVoCTXIHXSZoVvbdEkvbciO7IOOD1UkD/vy8IT+LBTREbYE3rLaWwdAFSB9oVYvxlYxY vTAQ== X-Gm-Message-State: APt69E0azwfEEVnff/+IjnxhAYJDtgRkcIo8VHrHjmieetIO/kITguWI kVG88+pmzSH5ceGLL/a86JCHD94QUHI= X-Google-Smtp-Source: ADUXVKIMejBXVqUVVENT9/kz87HQT+SxOI9XT4axN8Xd1DqlWctPNDTmmy1gcFhdoHmAIUZuLfnbew== X-Received: by 2002:a0c:b916:: with SMTP id u22-v6mr15341710qvf.224.1529437111841; Tue, 19 Jun 2018 12:38:31 -0700 (PDT) From: Daniel Henrique Barboza To: qemu-devel@nongnu.org Date: Tue, 19 Jun 2018 16:38:01 -0300 Message-Id: <20180619193806.17419-2-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::241 Subject: [Qemu-devel] [PATCH v1 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 , 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" 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 Mon May 6 02:54:07 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 1529437259109606.9536109558793; Tue, 19 Jun 2018 12:40:59 -0700 (PDT) Received: from localhost ([::1]:44645 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fVMUs-0003gI-B3 for importer@patchew.org; Tue, 19 Jun 2018 15:40:58 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:52774) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fVMSb-0001km-0s for qemu-devel@nongnu.org; Tue, 19 Jun 2018 15:38:38 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fVMSZ-0002yd-LO for qemu-devel@nongnu.org; Tue, 19 Jun 2018 15:38:37 -0400 Received: from mail-qt0-x244.google.com ([2607:f8b0:400d:c0d::244]:38743) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fVMSZ-0002y1-GS for qemu-devel@nongnu.org; Tue, 19 Jun 2018 15:38:35 -0400 Received: by mail-qt0-x244.google.com with SMTP id x34-v6so879303qtk.5 for ; Tue, 19 Jun 2018 12:38:35 -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.32 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 19 Jun 2018 12:38:34 -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=Ks7FsMtR+6EPkCZ6hnFkV5Lbq/tcJXLqiSCW5NXkXv/rYwCJ1ihD8UxTNCuAO+ks02 ZQyCV07orGZ9jtJPD4ObnnZCidk8LE9O6wgSkb0jFlHR7Kc3pyJclO76eWTQJOAacWK5 0H7S2M6a7Wva4UT+B0AfquqvL5fSj3LDHz3WM/95qs3ekbX1k+ZyVuP6p7EP31QTy8hZ PNPoo5BvPWHvtfb8VvFBZOeurQjuyqBuoOSE6d82rbJ6XL+7ostnh2kwZPkCxG0nYGdE 9XEeRmPgSyYflsbXj7f102WSDpn8gJITdypnKUfVOFND98RqUplB8fZ4EXR5w7/k6vwe RDtA== 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=CsgSuztfBz6wJYGpEiPyCDmXm3QU8elawEiRY+JBQDwruzheV73bWMiqOg/9VLEC89 HPSS9fpRZ+07mi/5cKhdVaumEnNmHaRAerD2E0vjSmjlPUQ2ytdZwImz6u1KuuH48p+O nnRZ2xgZGxil/DiZbB94XB6ZWi59i7HEP30ZULherjTa+SZGfXL9MWWhSDI6aAS3FX9s jLHsTAmW3E5HHXt8Fnt45Lamg6BTRYaqvFXrA+KuwMYH7NldSTdeaQMAB2YGxhfaOMv7 CBTOcoMIJGuODDmOch1SxRg+qKZiSgcESKKmugb9AR7cBITlzeLbiM+Ku/dXU/p7wEp4 biSA== X-Gm-Message-State: APt69E2uctiHaHLZtFcp14cb4jIwCoIJCrd9QI1AVTtIwUqez9PVRsDV t5M+yQVXncXdNZ0TTtiWL55rqG0bo+A= X-Google-Smtp-Source: ADUXVKKd0RrGj9KMl02JvsGy+gfg+/kie3r1Sb5J9usnUWk9axKVgW2s8dG7JkXdDmR+cHDf+KTENg== X-Received: by 2002:a0c:88ac:: with SMTP id 41-v6mr15584063qvn.201.1529437114737; Tue, 19 Jun 2018 12:38:34 -0700 (PDT) From: Daniel Henrique Barboza To: qemu-devel@nongnu.org Date: Tue, 19 Jun 2018 16:38:02 -0300 Message-Id: <20180619193806.17419-3-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::244 Subject: [Qemu-devel] [PATCH v1 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 , 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" 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 Mon May 6 02:54:07 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 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 From nobody Mon May 6 02:54:07 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 152943723277571.8245897860586; Tue, 19 Jun 2018 12:40:32 -0700 (PDT) Received: from localhost ([::1]:44639 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fVMUP-0003Gf-8o for importer@patchew.org; Tue, 19 Jun 2018 15:40:29 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:52851) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fVMSf-0001pF-UW for qemu-devel@nongnu.org; Tue, 19 Jun 2018 15:38:43 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fVMSe-00033R-Gn for qemu-devel@nongnu.org; Tue, 19 Jun 2018 15:38:41 -0400 Received: from mail-qt0-x22b.google.com ([2607:f8b0:400d:c0d::22b]:45390) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fVMSe-00032r-BH for qemu-devel@nongnu.org; Tue, 19 Jun 2018 15:38:40 -0400 Received: by mail-qt0-x22b.google.com with SMTP id i18-v6so851829qtp.12 for ; Tue, 19 Jun 2018 12:38:40 -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.37 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 19 Jun 2018 12:38:39 -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=o97E0m+oaVLmYqyhpwB6vUzSVjw0UKi+1Xdz9Rhjmco=; b=BB7ccSNdH05ynoc+b+GVR40/NajpIzuMsMl0MsXa9gZgN5rXyWPFGYrCn5/UZIsQ4V lApLoV/0CdiWK8PEouzPVkLG1qgN6VRZ9w4Fle7/CQkjwLr3yHsI55nmQ2GCobIAA1RN AnGkXYKEdQFqxkx9us8F4I5YN0kGz70UNJuECojDTF8zeCrgBsEjXX836AdMTpgnGrN6 GgPd7xSzZPSN1VgdetnwrLjjE6pfCvmdoowuUER+JNEYzVMbYf26jKNiixduyoJ8vF1X vEAmV90yjc5XD/t9Al4W3bc/0XDsuUor9IxitlhL2HXl5Q1B/2DH/CsoD3PHAJJUsLUt SOQw== 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=o97E0m+oaVLmYqyhpwB6vUzSVjw0UKi+1Xdz9Rhjmco=; b=RBCLe4IAvQRMhS8Tel7N6wPt+M6huCwHf10aW9Si5wKq/G9O/c/6E8zI8uGna3TwOo m0SbkvNqjJUSVHpQ15XV1KHfRNKyfpg0h+wBzvq8sLlx9RAKa09CSaNZkezkSMMSJKgN NtqhfgUhQpSt23Fn3V4pm2mWFLuU0kp7NBmEf+moKwTS+ADTkWNjv83E7W30cU4zpkv9 r31aAXik0ryZig0Xx9ihFJixigXfsWtuYOjkpwIemSHg6kMu7RliK8HKfgRY/bViGJt4 dT/FzIjUNTvr4x6EQ5ywgg5sAj4UxkCcBXAr/y40DvQfdud4hb3eu06Esfj3++FoMPm8 9nsg== X-Gm-Message-State: APt69E1ghhYUsQMk4w+IhgCd47Cz88jjlgfubjBv+xo4mU+zpPZsON1h skfHuVI3nOwFSUn5fHLMxgt6PACnZBg= X-Google-Smtp-Source: ADUXVKKyBaefsfhZd0BoslcFVBG9uXrbz35wovacPzZ2KVXi6FX7m0/xVviBHxXud+ZSzP5Y5OeH9g== X-Received: by 2002:ac8:1a74:: with SMTP id q49-v6mr16466546qtk.142.1529437119574; Tue, 19 Jun 2018 12:38:39 -0700 (PDT) From: Daniel Henrique Barboza To: qemu-devel@nongnu.org Date: Tue, 19 Jun 2018 16:38:04 -0300 Message-Id: <20180619193806.17419-5-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::22b Subject: [Qemu-devel] [PATCH v1 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 , 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" 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 creates a child process and executes a (shell) command, returning the command return 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 | 190 +++++++++++++++++-------------------------- 1 file changed, 76 insertions(+), 114 deletions(-) diff --git a/qga/commands-posix.c b/qga/commands-posix.c index a2870f9ab9..d5e3805ce9 100644 --- a/qga/commands-posix.c +++ b/qga/commands-posix.c @@ -1438,152 +1438,122 @@ 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; + +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; + char *cmd_path =3D g_find_program_in_path(command[0]); pid_t pid; - int status; - bool ret =3D false; - - switch (suspend_mode) { - - 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; - } + int status, ret =3D -1; =20 - pmutils_path =3D g_find_program_in_path(pmutils_bin); - if (!pmutils_path) { + if (!cmd_path) { return ret; } =20 pid =3D fork(); if (!pid) { setsid(); - execle(pmutils_path, pmutils_bin, pmutils_arg, NULL, environ); /* - * If we get here execle() has failed. + * execve receives a char* const argv[] as second arg but we're + * receiving a const char*[]. Since execve does not change the + * array contents it's tolerable to cast here. */ - _exit(SUSPEND_NOT_SUPPORTED); + execve(cmd_path, (char* const*)command, environ); + _exit(errno); } else if (pid < 0) { error_setg_errno(errp, errno, "failed to create child process"); + ret =3D EXIT_FAILURE; goto out; } =20 ga_wait_child(pid, &status, &local_err); if (local_err) { error_propagate(errp, local_err); + ret =3D EXIT_FAILURE; goto out; } =20 - switch (WEXITSTATUS(status)) { - case SUSPEND_SUPPORTED: - ret =3D true; - goto out; - case SUSPEND_NOT_SUPPORTED: - goto out; - default: - error_setg(errp, - "the helper program '%s' returned an unexpected exit st= atus" - " code (%d)", pmutils_path, WEXITSTATUS(status)); - goto out; - } + ret =3D WEXITSTATUS(status); =20 out: - g_free(pmutils_path); + g_free(cmd_path); return ret; } =20 -static void pmutils_suspend(int suspend_mode, Error **errp) +static bool pmutils_supports_mode(SuspendMode mode, Error **errp) { Error *local_err =3D NULL; - const char *pmutils_bin; - char *pmutils_path; - pid_t pid; + const char *pmutils_args[3] =3D {"--hibernate", "--suspend", + "--suspend-hybrid"}; + const char *cmd[3] =3D {"pm-is-supported", pmutils_args[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); - return; + if (status =3D=3D SUSPEND_SUPPORTED) { + return true; } =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) { + return false; } =20 - ga_wait_child(pid, &status, &local_err); if (local_err) { error_propagate(errp, local_err); - goto out; + } else { + error_setg(errp, + "the helper program '%s' returned an unexpected exit" + " status code (%d)", "pm-is-supported", status); } =20 - if (WEXITSTATUS(status)) { - error_setg(errp, - "the helper program '%s' returned an unexpected exit st= atus" - " code (%d)", pmutils_path, WEXITSTATUS(status)); + return false; +} + +static void pmutils_suspend(SuspendMode mode, Error **errp) +{ + Error *local_err =3D NULL; + const char *pmutils_binaries[3] =3D {"pm-hibernate", "pm-suspend", + "pm-suspend-hybrid"}; + const char *cmd[2] =3D {pmutils_binaries[mode], NULL}; + int status; + + status =3D run_process_child(cmd, &local_err); + + if (status =3D=3D 0) { + return; } =20 -out: - g_free(pmutils_path); + if (status =3D=3D -1) { + error_setg(errp, "the helper program '%s' was not found", + pmutils_binaries[mode]); + return; + } + + if (local_err) { + error_propagate(errp, local_err); + } else { + error_setg(errp, + "the helper program '%s' returned an unexpected exit" + " status code (%d)", pmutils_binaries[mode], status); + } } =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 +1574,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 +1624,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 +1637,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 local_err =3D NULL; =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 Mon May 6 02:54:07 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 1529437483026770.4427389090554; Tue, 19 Jun 2018 12:44:43 -0700 (PDT) Received: from localhost ([::1]:44665 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fVMYU-0006Kj-Da for importer@patchew.org; Tue, 19 Jun 2018 15:44:42 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:52890) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fVMSi-0001rk-O7 for qemu-devel@nongnu.org; Tue, 19 Jun 2018 15:38:46 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fVMSh-00037q-DY for qemu-devel@nongnu.org; Tue, 19 Jun 2018 15:38:44 -0400 Received: from mail-qt0-x243.google.com ([2607:f8b0:400d:c0d::243]:44709) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fVMSh-00037T-8d for qemu-devel@nongnu.org; Tue, 19 Jun 2018 15:38:43 -0400 Received: by mail-qt0-x243.google.com with SMTP id l33-v6so854514qta.11 for ; Tue, 19 Jun 2018 12:38:43 -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.39 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 19 Jun 2018 12:38:42 -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=pY7mInYInchvRIVhw0qCZ+4QWNwnOQ0I2TjYXJjdRks=; b=D25g/t0Q1vTmqukB2rEYZhLWLC1B8blg0weVaDlLOZBcSb6ePHTo7y/0Ra8ZAAwFAj 6qYXrNSL2TxAffbBDP0lazSQQcVk7xrXGC1idyROeDiyeHMFVxVXAX6RB8kjSE2QQLQH +GDTHR51ouXIgpI5tdq2Jj25Ol2Ip8nK45klI7dRHguTMlOy14E1lA90MnVzlWbEC7wC qeHbWS1bAQ8NmcGA/i89iVha8x8aC8sn+iIt/UQINbHumuhdOaMbd6gHPSSJ4BmjgbJG i9+UrbPZezPD+O49AhXPFbDSKIblI4q6nVXnzDi9LiGhqf4tUl/sMSNDcqRgWiU8TvEw JgBw== 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=pY7mInYInchvRIVhw0qCZ+4QWNwnOQ0I2TjYXJjdRks=; b=DAWgyg5bNwqzbsl3FL3Z/m1gE8IH5Wlpnta6zEMFpQM9esR60tDIhQlmWCTHRBL8PG V7AgqKuJf/Big70d/jR5ArzCR1lmvCx0rjfnWQ/hHKoIwFNPhTNnVNXA4AtCcZkdsxGi /w79nqQH7MNG3Mazajhz6yiVOR/rdyOEGLU4Nem2KqZSlnpM/gJpeb4/h7shWeipGZnd umoDYOt2i7izg15XpHk7rVotK4juXXh1MjZqqHyZwsqety+gKQLmuou5r9h2UNhJHCMY JpHhr5SjAqEPj0Uv7eptN+vR/1PBS3BTxJay/Xiioul7Fb1BJhqiQdQr13U3sFAo2xyN YX/A== X-Gm-Message-State: APt69E3g03Ozfg1adXZVgO2FyoCOSiOFHAm9TGYGcc6kWeTP0z1FkNQy yc3STsSBjx89S2NvlrdI3NaqJlfGPp4= X-Google-Smtp-Source: ADUXVKIUKPpiumsM8cbLId1wA3g6H/zV7bHYi42XkDW9YfbeOIN8XxvCy+Oat7Ip09Xmrz7o99hk2Q== X-Received: by 2002:ac8:1c37:: with SMTP id a52-v6mr16500651qtk.411.1529437122469; Tue, 19 Jun 2018 12:38:42 -0700 (PDT) From: Daniel Henrique Barboza To: qemu-devel@nongnu.org Date: Tue, 19 Jun 2018 16:38:05 -0300 Message-Id: <20180619193806.17419-6-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::243 Subject: [Qemu-devel] [PATCH v1 5/6] qga: adding 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 , 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" 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 times 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 d5e3805ce9..6a573de86d 100644 --- a/qga/commands-posix.c +++ b/qga/commands-posix.c @@ -1486,6 +1486,63 @@ out: return ret; } =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) { + error_setg(errp, "the helper program '%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; @@ -1629,6 +1686,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; @@ -1654,6 +1719,13 @@ static void guest_suspend(SuspendMode mode, Error **= errp) return; } =20 + systemd_suspend(mode, &local_err); + if (!local_err) { + return; + } + + local_err =3D NULL; + pmutils_suspend(mode, &local_err); if (!local_err) { return; --=20 2.17.1 From nobody Mon May 6 02:54:07 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 1529437554641960.1955869569625; Tue, 19 Jun 2018 12:45:54 -0700 (PDT) Received: from localhost ([::1]:44676 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fVMZX-0007Yy-UP for importer@patchew.org; Tue, 19 Jun 2018 15:45:47 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:52941) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fVMSl-0001uS-JL for qemu-devel@nongnu.org; Tue, 19 Jun 2018 15:38:48 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fVMSk-0003Av-Fi for qemu-devel@nongnu.org; Tue, 19 Jun 2018 15:38:47 -0400 Received: from mail-qt0-x232.google.com ([2607:f8b0:400d:c0d::232]:40765) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fVMSk-0003AQ-1X for qemu-devel@nongnu.org; Tue, 19 Jun 2018 15:38:46 -0400 Received: by mail-qt0-x232.google.com with SMTP id q6-v6so870753qtn.7 for ; Tue, 19 Jun 2018 12:38:45 -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.42 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 19 Jun 2018 12:38:45 -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=7aJT/qhW0T5kCKz8UV6is72ExOD0oHsMYGTMtFmBYCc=; b=qncKtw+ynV8ThrypFQVCdY6pXIe/DaG+zBiKALIXNasuUJIqszvWVoR0TModtADRSH hTRnOcylokkJ/CRrEAcgL5ouJrG8aw+LifGlN/uhb149Z/YC937y1Y3ao1Bxyv8zoW6k 9SNsnlnUXDe/WXhxTw0lSsJpcn1AwLR7Gl3VDqvmpTLOK38R2pPADFhdfiquSqP8j6tX l6Ns/pMICGCi4x0vRVo3NL8G1qBWKOVb2Nd/PWOXYnPI4a6CyoShXTY6JC5vhlwWVcXs 4qK/cpO8YYj2bhEaYycPuZyArptZRqXQYJkheM2nQQK8ayNIBAcIrLSrpzB5fBPD5YCy qrhw== 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=7aJT/qhW0T5kCKz8UV6is72ExOD0oHsMYGTMtFmBYCc=; b=LmCNBrrkDuf3yRtpKAdVA4aegHfNEEG6nImFURu5VBLtmUu/NsSbrlJr2XJhjhkMIu Os/DXrxmaES3K3sQ2erlyRnvVvDbL4w8O0vjIW7XKKw304sNglwutwjmJMuGbBBhleDx Bb6JW9J4tO5JHqI2+sOM76nuDNbqaFncjHxu1rl/+k8/I7G05fDnd0RvJALYsvPOWv5T YRwzUW6NNA1M1C/amj27Vw13zftuC+z0Ny5oxNkLb33e4lXlrALZu7m2Ac6wS2gCoQqM vfRbbL5raZNPoKp3wIcJcdekHGcOtOStR2cnYYQUpSnjcjn2aVBkdw6ekNgvY3bgS7WF 5MDA== X-Gm-Message-State: APt69E0eOmY64n295S8Xfm1t3sxrT5r1UN9fFvNhzA5T7ZNd1MqhyIdF iA7eOFcJGsOy/5JNf+PZzS+5fgE5L+c= X-Google-Smtp-Source: ADUXVKKNz5/pOyfYiKBBM5Ly3k8B1OChGn/lHCxhNqSQlkS9+QfUlu+Pgi4SKQ+ljDLQOtOqNJz9fg== X-Received: by 2002:ac8:855:: with SMTP id x21-v6mr16292844qth.42.1529437125383; Tue, 19 Jun 2018 12:38:45 -0700 (PDT) From: Daniel Henrique Barboza To: qemu-devel@nongnu.org Date: Tue, 19 Jun 2018 16:38:06 -0300 Message-Id: <20180619193806.17419-7-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::232 Subject: [Qemu-devel] [PATCH v1 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 , 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" 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 6a573de86d..79acc28ee7 100644 --- a/qga/commands-posix.c +++ b/qga/commands-posix.c @@ -1681,60 +1681,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 local_err =3D NULL; =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 local_err =3D NULL; =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