From patchwork Thu Jun 21 10:21:52 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Henrique Barboza X-Patchwork-Id: 932666 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="lXAVn/HP"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 41BHsP5mgJz9ry1 for ; Thu, 21 Jun 2018 20:25:45 +1000 (AEST) Received: from localhost ([::1]:54324 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fVwmd-0004sZ-7i for incoming@patchwork.ozlabs.org; Thu, 21 Jun 2018 06:25:43 -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) 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) 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) 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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" 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; } +static bool systemd_supports_mode(SuspendMode mode, Error **errp) +{ + Error *local_err = NULL; + const char *systemctl_args[3] = {"systemd-hibernate", "systemd-suspend", + "systemd-hybrid-sleep"}; + const char *cmd[4] = {"systemctl", "status", systemctl_args[mode], NULL}; + int status; + + status = 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 = 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 = NULL; + const char *systemctl_args[3] = {"hibernate", "suspend", "hybrid-sleep"}; + const char *cmd[3] = {"systemctl", systemctl_args[mode], NULL}; + int status; + + status = run_process_child(cmd, &local_err); + + if (status == 0) { + return; + } + + if ((status == -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 = NULL; @@ -1624,6 +1681,14 @@ static void bios_supports_mode(SuspendMode mode, Error **errp) Error *local_err = NULL; bool ret; + ret = systemd_supports_mode(mode, &local_err); + if (ret) { + return; + } + if (local_err) { + error_propagate(errp, local_err); + return; + } ret = pmutils_supports_mode(mode, &local_err); if (ret) { return; @@ -1649,6 +1714,13 @@ static void guest_suspend(SuspendMode mode, Error **errp) return; } + systemd_suspend(mode, &local_err); + if (!local_err) { + return; + } + + error_free(local_err); + pmutils_suspend(mode, &local_err); if (!local_err) { return;