From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:60803) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bk54M-0004QU-K3 for qemu-devel@nongnu.org; Wed, 14 Sep 2016 03:57:23 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bk54I-0004Fz-FB for qemu-devel@nongnu.org; Wed, 14 Sep 2016 03:57:21 -0400 Received: from szxga03-in.huawei.com ([119.145.14.66]:63173) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bk54H-0004FP-Q5 for qemu-devel@nongnu.org; Wed, 14 Sep 2016 03:57:18 -0400 From: "Herongguang (Stephen)" Message-ID: <57D90289.6020003@huawei.com> Date: Wed, 14 Sep 2016 15:55:53 +0800 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: 8bit Subject: [Qemu-devel] [RFC/PATCH] migration: SMRAM dirty bitmap not fetched from kvm-kmod and not send to destination List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org, pbonzini@redhat.com, quintela@redhat.com, amit.shah@redhat.com Cc: arei.gonglei@huawei.com, "Huangweidong (C)" Hi, We found a problem that when a redhat 6 VM reboots (in grub countdown UI), migrating this VM will result in VM’s memory difference between source and destination side. The difference always resides in GPA 0xA0000~0xC0000, i.e. SMRAM area. Occasionally this result in VM instruction emulation error in destination side. After some digging, I think this is because in migration code, in migration_bitmap_sync(), only memory slots in address space address_space_memory’s dirty bitmap fetched from kvm-kmod, while SMRAM memory slot, in address space smram_address_space’s dirty bitmap not fetched from kvm-kmod, thus modifications in SMRAM in source side are not sent to destination side. I tried following patch, and this phenomenon does not happen anymore. Do you think this patch is OK or do you have better idea? Thanks. diff --git a/migration/ram.c b/migration/ram.c index a3d70c4..1cc4360 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -607,6 +607,8 @@ static void migration_bitmap_sync_init(void) iterations_prev = 0; } +extern AddressSpace smram_address_space; + static void migration_bitmap_sync(void) { RAMBlock *block; @@ -627,6 +629,7 @@ static void migration_bitmap_sync(void) trace_migration_bitmap_sync_start(); address_space_sync_dirty_bitmap(&address_space_memory); + address_space_sync_dirty_bitmap(&smram_address_space); qemu_mutex_lock(&migration_bitmap_mutex); rcu_read_lock(); diff --git a/target-i386/kvm.c b/target-i386/kvm.c index d1a25c5..b98fe22 100644 --- a/target-i386/kvm.c +++ b/target-i386/kvm.c @@ -1111,7 +1111,7 @@ static int kvm_get_supported_msrs(KVMState *s) static Notifier smram_machine_done; static KVMMemoryListener smram_listener; -static AddressSpace smram_address_space; +AddressSpace smram_address_space; static MemoryRegion smram_as_root; static MemoryRegion smram_as_mem;