From cdda5b9dfcd01868b728e245b8a4d63d2b86e6ae Mon Sep 17 00:00:00 2001
From: Paolo Bonzini <pbonzini@redhat.com>
Date: Tue, 28 Feb 2012 12:53:15 +0100
Subject: [PATCH 2/7] kvm: Flush coalesced mmio buffer on IO window exits

RH-Author: Paolo Bonzini <pbonzini@redhat.com>
Message-id: <1330433598-21534-3-git-send-email-pbonzini@redhat.com>
Patchwork-id: 37669
O-Subject: [RHEL 6.3 qemu-kvm PATCH 2/5] kvm: Flush coalesced mmio buffer on IO window exits
Bugzilla: 796575
RH-Acked-by: Alex Williamson <alex.williamson@redhat.com>
RH-Acked-by: Laszlo Ersek <lersek@redhat.com>
RH-Acked-by: Markus Armbruster <armbru@redhat.com>

From: Jan Kiszka <jan.kiszka@siemens.com>

We must flush pending mmio writes if we leave kvm_cpu_exec for an IO
window. Otherwise we risk to loose those requests when migrating to a
different host during that window.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
(cherry picked from commit b0c883b5e079a4f719c43f875034e5e665ccc232)

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 kvm-all.c  |    4 ++--
 qemu-kvm.c |    4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

Signed-off-by: Michal Novotny <minovotn@redhat.com>
---
 kvm-all.c  |    4 ++--
 qemu-kvm.c |    4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/kvm-all.c b/kvm-all.c
index e36c15f..a50ec56 100644
--- a/kvm-all.c
+++ b/kvm-all.c
@@ -650,6 +650,8 @@ int kvm_cpu_exec(CPUState *env)
         qemu_mutex_lock_iothread();
         kvm_arch_post_run(env, run);
 
+        kvm_flush_coalesced_mmio_buffer();
+
         if (ret == -EINTR || ret == -EAGAIN) {
             dprintf("io window exit\n");
             ret = 0;
@@ -661,8 +663,6 @@ int kvm_cpu_exec(CPUState *env)
             abort();
         }
 
-        kvm_flush_coalesced_mmio_buffer();
-
         ret = 0; /* exit loop */
         switch (run->exit_reason) {
         case KVM_EXIT_IO:
diff --git a/qemu-kvm.c b/qemu-kvm.c
index 8d0105d..ba5a037 100644
--- a/qemu-kvm.c
+++ b/qemu-kvm.c
@@ -922,6 +922,8 @@ void post_kvm_run(kvm_context_t kvm, CPUState *env)
     pthread_mutex_lock(&qemu_mutex);
     kvm_arch_post_run(env, env->kvm_run);
     cpu_single_env = env;
+
+    kvm_flush_coalesced_mmio_buffer();
 }
 
 int pre_kvm_run(kvm_context_t kvm, CPUState *env)
@@ -1013,8 +1015,6 @@ int kvm_run(CPUState *env)
 
     post_kvm_run(kvm, env);
 
-    kvm_flush_coalesced_mmio_buffer();
-
 #if !defined(__s390__)
     if (r == -1) {
         r = handle_io_window(kvm);
-- 
1.7.7.6

