| From 2462c7df4513e298596559627c61108e13809470 Mon Sep 17 00:00:00 2001 |
| From: Gerd Hoffmann <kraxel@redhat.com> |
| Date: Fri, 5 Sep 2014 12:30:38 +0200 |
| Subject: [PATCH 04/12] qemu: Adjust qemu wakeup |
| |
| Message-id: <1409920238-9070-5-git-send-email-kraxel@redhat.com> |
| Patchwork-id: 60872 |
| O-Subject: [RHEL-7.1 qemu-kvm PATCH 4/4] qemu: Adjust qemu wakeup |
| Bugzilla: 1064156 |
| RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com> |
| RH-Acked-by: Laszlo Ersek <lersek@redhat.com> |
| RH-Acked-by: Dr. David Alan Gilbert (git) <dgilbert@redhat.com> |
| |
| From: "Liu, Jinsong" <jinsong.liu@intel.com> |
| |
| Currently Xen hvm s3 has a bug coming from the difference between |
| qemu-traditioanl and qemu-xen. For qemu-traditional, the way to |
| resume from hvm s3 is via 'xl trigger' command. However, for |
| qemu-xen, the way to resume from hvm s3 inherited from standard |
| qemu, i.e. via QMP, and it doesn't work under Xen. |
| |
| The root cause is, for qemu-xen, 'xl trigger' command didn't reset |
| devices, while QMP didn't unpause hvm domain though they did qemu |
| system reset. |
| |
| We have two qemu patches and one xl patch to fix Xen hvm s3 bug. |
| This patch is the qemu patch 1. It adjusts qemu wakeup so that |
| Xen s3 resume logic (which will be implemented at qemu patch 2) |
| will be notified after qemu system reset. |
| |
| Signed-off-by: Liu Jinsong <jinsong.liu@intel.com> |
| Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> |
| Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> |
| Reviewed-by: Anthony PERARD <anthony.perard@citrix.com> |
| (cherry picked from commit 4bc78a877252d772b983810a7d2c0be00e9be70e) |
| |
| hw/acpi/core.c | 3 ++- |
| include/sysemu/sysemu.h | 4 +++- |
| vl.c | 15 +++++++-------- |
| 3 files changed, 12 insertions(+), 10 deletions(-) |
| |
| Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com> |
| |
| hw/acpi/core.c | 3 ++- |
| include/sysemu/sysemu.h | 4 +++- |
| vl.c | 15 +++++++-------- |
| 3 files changed, 12 insertions(+), 10 deletions(-) |
| |
| diff --git a/hw/acpi/core.c b/hw/acpi/core.c |
| index 3352d17..88efba7 100644 |
| |
| |
| @@ -364,12 +364,13 @@ static void acpi_notify_wakeup(Notifier *notifier, void *data) |
| (ACPI_BITMASK_WAKE_STATUS | ACPI_BITMASK_TIMER_STATUS); |
| break; |
| case QEMU_WAKEUP_REASON_OTHER: |
| - default: |
| /* ACPI_BITMASK_WAKE_STATUS should be set on resume. |
| Pretend that resume was caused by power button */ |
| ar->pm1.evt.sts |= |
| (ACPI_BITMASK_WAKE_STATUS | ACPI_BITMASK_POWER_BUTTON_STATUS); |
| break; |
| + default: |
| + break; |
| } |
| } |
| |
| diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h |
| index 07181ac..3e457b8 100644 |
| |
| |
| @@ -42,9 +42,11 @@ int vm_stop(RunState state); |
| int vm_stop_force_state(RunState state); |
| |
| typedef enum WakeupReason { |
| - QEMU_WAKEUP_REASON_OTHER = 0, |
| + /* Always keep QEMU_WAKEUP_REASON_NONE = 0 */ |
| + QEMU_WAKEUP_REASON_NONE = 0, |
| QEMU_WAKEUP_REASON_RTC, |
| QEMU_WAKEUP_REASON_PMTIMER, |
| + QEMU_WAKEUP_REASON_OTHER, |
| } WakeupReason; |
| |
| void qemu_system_reset_request(void); |
| diff --git a/vl.c b/vl.c |
| index fcc8fd1..7c1b9d2 100644 |
| |
| |
| @@ -1690,14 +1690,14 @@ static pid_t shutdown_pid; |
| static int powerdown_requested; |
| static int debug_requested; |
| static int suspend_requested; |
| -static int wakeup_requested; |
| +static WakeupReason wakeup_reason; |
| static NotifierList powerdown_notifiers = |
| NOTIFIER_LIST_INITIALIZER(powerdown_notifiers); |
| static NotifierList suspend_notifiers = |
| NOTIFIER_LIST_INITIALIZER(suspend_notifiers); |
| static NotifierList wakeup_notifiers = |
| NOTIFIER_LIST_INITIALIZER(wakeup_notifiers); |
| -static uint32_t wakeup_reason_mask = ~0; |
| +static uint32_t wakeup_reason_mask = ~(1 << QEMU_WAKEUP_REASON_NONE); |
| static RunState vmstop_requested = RUN_STATE_MAX; |
| |
| int qemu_shutdown_requested_get(void) |
| @@ -1747,11 +1747,9 @@ static int qemu_suspend_requested(void) |
| return r; |
| } |
| |
| -static int qemu_wakeup_requested(void) |
| +static WakeupReason qemu_wakeup_requested(void) |
| { |
| - int r = wakeup_requested; |
| - wakeup_requested = 0; |
| - return r; |
| + return wakeup_reason; |
| } |
| |
| static int qemu_powerdown_requested(void) |
| @@ -1868,8 +1866,7 @@ void qemu_system_wakeup_request(WakeupReason reason) |
| return; |
| } |
| runstate_set(RUN_STATE_RUNNING); |
| - notifier_list_notify(&wakeup_notifiers, &reason); |
| - wakeup_requested = 1; |
| + wakeup_reason = reason; |
| qemu_notify_event(); |
| } |
| |
| @@ -1961,6 +1958,8 @@ static bool main_loop_should_exit(void) |
| pause_all_vcpus(); |
| cpu_synchronize_all_states(); |
| qemu_system_reset(VMRESET_SILENT); |
| + notifier_list_notify(&wakeup_notifiers, &wakeup_reason); |
| + wakeup_reason = QEMU_WAKEUP_REASON_NONE; |
| resume_all_vcpus(); |
| monitor_protocol_event(QEVENT_WAKEUP, NULL); |
| } |
| -- |
| 1.7.1 |
| |