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;