Re: Merging KVM live migration upstream

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Jan Kiszka wrote:
Avi or Uri,

could you explain the first and third hunk? Why are they needed in
qemu-kvm, and will we also need something comparable upstream? They do
not look very beautiful.

This is leftovers from v1 loading. It used to be that we saved the vga buffer independently before slot tracking was as sophisticated in qemu as it is today. We don't restore v1 vga that would contain this section though so it's basically dead code.

I'd just remove it personally.

The second hunk, I guess, should become a kvm hook to
cpu_physical_memory_get_dirty - or is this too costly for other users of
this inline function?

And does anyone knows further migration-related hunks that are missing
upstream (except for the KVM hook in
cpu_physical_memory_set_dirty_tracking)?

The cpu_save/cpu_load additions.

Jan

--- qemu/vl.c
+++ qemu-kvm/vl.c
@@ -3097,6 +3204,8 @@ static int ram_load_v1(QEMUFile *f, void
     if (qemu_get_be32(f) != last_ram_offset)
         return -EINVAL;
     for(i = 0; i < last_ram_offset; i+= TARGET_PAGE_SIZE) {
+        if (kvm_enabled() && (i>=0xa0000) && (i<0xc0000)) /* do not access video-addresses */
+            continue;
         ret = ram_get_page(f, qemu_get_ram_ptr(i), TARGET_PAGE_SIZE);
         if (ret)
             return ret;
@@ -3183,6 +3292,15 @@ static int ram_save_block(QEMUFile *f)
     int found = 0;

     while (addr < last_ram_offset) {
+        if (kvm_enabled() && current_addr == 0) {
+            int r;
+            r = kvm_update_dirty_pages_log();
+            if (r) {
+                fprintf(stderr, "%s: update dirty pages log failed %d\n", __FUNCTION__, r);
+                qemu_file_set_error(f);
+                return 0;
+            }
+        }
         if (cpu_physical_memory_get_dirty(current_addr, MIGRATION_DIRTY_FLAG)) {
             uint8_t *p;

@@ -3273,6 +3391,8 @@ static int ram_load_dead(QEMUFile *f, vo
     if (ram_decompress_open(s, f) < 0)
         return -EINVAL;
     for(i = 0; i < last_ram_offset; i+= BDRV_HASH_BLOCK_SIZE) {
+        if (kvm_enabled() && (i>=0xa0000) && (i<0xc0000)) /* do not access video-addresses */
+            continue;
         if (ram_decompress_buf(s, buf, 1) < 0) {
             fprintf(stderr, "Error while reading ram block header\n");
             goto error;


--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux