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