From patchwork Tue Sep 18 18:52:44 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: 10604801 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id B3CF45A4 for ; Tue, 18 Sep 2018 18:54:47 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id A1E2F2B093 for ; Tue, 18 Sep 2018 18:54:47 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 94F8A2B0B0; Tue, 18 Sep 2018 18:54:47 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.8 required=2.0 tests=BAYES_00,DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id CA1DC2B093 for ; Tue, 18 Sep 2018 18:54:46 +0000 (UTC) Received: from localhost ([::1]:42129 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1g2L93-0000TD-9J for patchwork-qemu-devel@patchwork.kernel.org; Tue, 18 Sep 2018 14:54:45 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:57430) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1g2L7k-0007oc-3j for qemu-devel@nongnu.org; Tue, 18 Sep 2018 14:53:28 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1g2L7e-0003E8-Mb for qemu-devel@nongnu.org; Tue, 18 Sep 2018 14:53:20 -0400 Received: from mail-qt0-x244.google.com ([2607:f8b0:400d:c0d::244]:36440) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1g2L7c-000375-JS for qemu-devel@nongnu.org; Tue, 18 Sep 2018 14:53:18 -0400 Received: by mail-qt0-x244.google.com with SMTP id t5-v6so2746158qtn.3 for ; Tue, 18 Sep 2018 11:53:12 -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=Eh7t6eVrAJhmvryd/XEocpt5dlF7bWef9scYhurdfPI=; b=b64HxoHnvZwsIlCs0B4F/pyyqapoQ8RYPqvyROJgqZ5SgUKKQsuEF5tndBG7t6hUN+ CtIK93oSJaXJb/V10H+EoJVWeaXEPTaMo/mHFfn12BdpkAJsYQD33eUDwUtByRJDHLLf bZigpXt03P5haYJqML1WYsnXcAMyb/N4zxKirKKXWQtCzFOaONJsGHWhzGUTzgTLxPjN tq7ixEbsjpOmAAC2oZgixBRSLMgx7lS2IDH1oo20B3h1hh25JQTHy+glAOkyubkaryEI 8n//50b5GZ287vvVGguj5ZXi0VLwWb70m8WmGwNWpJb3feKwFSZk9zdXNSc6lhIOJKAk bLXw== 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=Eh7t6eVrAJhmvryd/XEocpt5dlF7bWef9scYhurdfPI=; b=J2ep98gS2+57jbd+/UKywLAV7TY4qd6pbTeNafRhtALVidFBre+MGz7Bzlz1MqtLwS U4GK7X1kw8r6IcViea0/+An5S+w/EFfPEXJ/qwjjQJ0Grzwa78BjyenpTDsB0JsjLI5O vdV6mdJnpI5cXLGKu3DgWl8glCzZXYFy1lrNKAxJyZ46d6+EwJTZXcgTKPYDEbby0ifJ HntDnNnFaYNtsJzFnHSB7Aa3lh4dhSz7PGBYxK5U4T1ZAZT90XJZhoIE+6uEsbAWjKRT O+FrRSQidNlinGCsPzI4mMzf5eTK0lwuIi9ESCYNs+5b1ry6eI99dT08Y23TJe696IJn U+gg== X-Gm-Message-State: APzg51BWp1d8CXgicGQ9kvHEnS6XgPV1f36uCjcsxAjeg/qSPEC6r6sQ NQ3PcOv3RT3dVxIsnB9pU2fNrlhtH+k= X-Google-Smtp-Source: ANB0VdZQNYe5QZ4Fgvmja7vjbVqhgOdqZ+IQ3a9/G5oLlVFJ3fmcOQdGjAbvwQ/HrEHHU5vVwsgrTQ== X-Received: by 2002:a0c:eac3:: with SMTP id y3-v6mr21604284qvp.89.1537296791975; Tue, 18 Sep 2018 11:53:11 -0700 (PDT) Received: from localhost.localdomain ([2804:431:f700:46a7:852b:e394:1f41:b69d]) by smtp.gmail.com with ESMTPSA id n186-v6sm10568244qkb.32.2018.09.18.11.53.09 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 18 Sep 2018 11:53:11 -0700 (PDT) From: Daniel Henrique Barboza To: qemu-devel@nongnu.org Date: Tue, 18 Sep 2018 15:52:44 -0300 Message-Id: <20180918185246.18109-2-danielhb413@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180918185246.18109-1-danielhb413@gmail.com> References: <20180918185246.18109-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 v9 1/3] qmp: query-current-machine with wakeup-suspend-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: ehabkost@redhat.com, mst@redhat.com, Daniel Henrique Barboza , armbru@redhat.com, mdroth@linux.vnet.ibm.com, imammedo@redhat.com Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP When issuing the qmp/hmp 'system_wakeup' command, what happens in a nutshell is: - qmp_system_wakeup_request set runstate to RUNNING, sets a wakeup_reason and notify the event - in the main_loop, all vcpus are paused, a system reset is issued, all subscribers of wakeup_notifiers receives a notification, vcpus are then resumed and the wake up QAPI event is fired Note that this procedure alone doesn't ensure that the guest will awake from SUSPENDED state - the subscribers of the wake up event must take action to resume the guest, otherwise the guest will simply reboot. At this moment, only the ACPI machines via acpi_pm1_cnt_init has wake-up from suspend support. However, only the presence of 'system_wakeup' is required for QGA to support 'guest-suspend-ram' and 'guest-suspend-hybrid' at this moment. This means that the user/management will expect to suspend the guest using one of those suspend commands and then resume execution using system_wakeup, regardless of the support offered in system_wakeup in the first place. This patch creates a new API called query-current-machine [1], that holds a new flag called 'wakeup-suspend-support' that indicates if the guest supports wake up from suspend via system_wakeup. The machine is considered to implement wake-up support if a call to a new 'qemu_register_wakeup_support' is made during its init, as it is now being done inside acpi_pm1_cnt_init. This allows for any other machine type to declare wake-up support regardless of ACPI state or wakeup_notifiers subscription, making easier for newer implementations that might have its own mechanisms in the future. This is the expected output of query-current-machine when running a x86 guest: {"execute" : "query-current-machine"} {"return": {"wakeup-suspend-support": true}} Running the same x86 guest, but with the --no-acpi option: {"execute" : "query-current-machine"} {"return": {"wakeup-suspend-support": false}} This is the output when running a pseries guest: {"execute" : "query-current-machine"} {"return": {"wakeup-suspend-support": false}} With this extra tool, management can avoid situations where a guest that does not have proper suspend/wake capabilities ends up in inconsistent state (e.g. https://github.com/open-power-host-os/qemu/issues/31). [1] the decision of creating the query-current-machine API is based on discussions in the QEMU mailing list where it was decided that query-target wasn't a proper place to store the wake-up flag, neither was query-machines because this isn't a static property of the machine object. This new API can then be used to store other dynamic machine properties that are scattered around the code ATM. More info at: https://lists.gnu.org/archive/html/qemu-devel/2018-05/msg04235.html Reported-by: Balamuruhan S Signed-off-by: Daniel Henrique Barboza --- hw/acpi/core.c | 1 + include/sysemu/sysemu.h | 1 + qapi/misc.json | 24 ++++++++++++++++++++++++ vl.c | 19 +++++++++++++++++++ 4 files changed, 45 insertions(+) diff --git a/hw/acpi/core.c b/hw/acpi/core.c index b8d39012cd..2dea893245 100644 --- a/hw/acpi/core.c +++ b/hw/acpi/core.c @@ -617,6 +617,7 @@ void acpi_pm1_cnt_init(ACPIREGS *ar, MemoryRegion *parent, ar->pm1.cnt.s4_val = s4_val; ar->wakeup.notify = acpi_notify_wakeup; qemu_register_wakeup_notifier(&ar->wakeup); + qemu_register_wakeup_support(); memory_region_init_io(&ar->pm1.cnt.io, memory_region_owner(parent), &acpi_pm_cnt_ops, ar, "acpi-cnt", 2); memory_region_add_subregion(parent, 4, &ar->pm1.cnt.io); diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h index 8d6095d98b..0446adacc6 100644 --- a/include/sysemu/sysemu.h +++ b/include/sysemu/sysemu.h @@ -77,6 +77,7 @@ void qemu_register_suspend_notifier(Notifier *notifier); void qemu_system_wakeup_request(WakeupReason reason); void qemu_system_wakeup_enable(WakeupReason reason, bool enabled); void qemu_register_wakeup_notifier(Notifier *notifier); +void qemu_register_wakeup_support(void); void qemu_system_shutdown_request(ShutdownCause reason); void qemu_system_powerdown_request(void); void qemu_register_powerdown_notifier(Notifier *notifier); diff --git a/qapi/misc.json b/qapi/misc.json index d450cfef21..b616d385a4 100644 --- a/qapi/misc.json +++ b/qapi/misc.json @@ -2003,6 +2003,30 @@ ## { 'command': 'query-machines', 'returns': ['MachineInfo'] } +## +# @CurrentMachineParams: +# +# Information describing the running machine parameters. +# +# @wakeup-suspend-support: true if the target supports wake up from +# suspend +# +# Since: 3.1.0 +## +{ 'struct': 'CurrentMachineParams', + 'data': { 'wakeup-suspend-support': 'bool'} } + +## +# @query-current-machine: +# +# Return a list of parameters of the running machine. +# +# Returns: CurrentMachineParams +# +# Since: 3.1.0 +## +{ 'command': 'query-current-machine', 'returns': 'CurrentMachineParams' } + ## # @CpuDefinitionInfo: # diff --git a/vl.c b/vl.c index 5ba06adf78..f78947f69c 100644 --- a/vl.c +++ b/vl.c @@ -184,6 +184,7 @@ bool boot_strict; uint8_t *boot_splash_filedata; size_t boot_splash_filedata_size; uint8_t qemu_extra_params_fw[2]; +bool wakeup_suspend_enabled; int icount_align_option; @@ -1753,6 +1754,24 @@ void qemu_register_wakeup_notifier(Notifier *notifier) notifier_list_add(&wakeup_notifiers, notifier); } +void qemu_register_wakeup_support(void) +{ + wakeup_suspend_enabled = true; +} + +static bool qemu_wakeup_suspend_enabled(void) +{ + return wakeup_suspend_enabled; +} + +CurrentMachineParams *qmp_query_current_machine(Error **errp) +{ + CurrentMachineParams *params = g_malloc0(sizeof(*params)); + params->wakeup_suspend_support = qemu_wakeup_suspend_enabled(); + + return params; +} + void qemu_system_killed(int signal, pid_t pid) { shutdown_signal = signal;