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

Re: [Xen-devel] [PATCH] xen: xen_sync_dirty_bitmap: attempt to fix SEGV [and 1 more messages]

Alex Bligh writes ("Re: [PATCH] xen: xen_sync_dirty_bitmap: attempt to fix 
> If the former, then I think the problem is that the address that
> cpu_physical_memory_set_dirty (and xen_modified_memory) takes needs
> to be passed through get_physmapping()->phys_offset before use,
> like the second case already does. In this case the patch I've
> just sent should (hopefully) work.

Indeed.  Your patch fixes the problem.

I discussed this with Stefano before he went away and he said I should
push a fix to qemu-xen-upstream-4.2-testing.git staging, so I have
done that.  I edited the commit message slightly.

Thanks for your help!


commit 351f94ff4bf3a7795ca5b282305aa610e598eec0
Author: Alex Bligh <alex@xxxxxxxxxxx>
Date:   Wed Mar 6 14:59:27 2013 +0000

    xen: xen_sync_dirty_bitmap: attempt to fix SEGV
    When xc_hvm_track_dirty_vram fails, iterate through pages based on
    vram_offset and npages, rather than start_addr and size. DPRINTF
    before the loop too.
    [ Fixes a regression introduced by
      eccc68722696864fc4823f048c7be58d11281b97 - iwj ]
    Signed-off-by: Alex Bligh <alex@xxxxxxxxxxx>
    Tested-by: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>

diff --git a/xen-all.c b/xen-all.c
index dbd759c..96a34a9 100644
--- a/xen-all.c
+++ b/xen-all.c
@@ -472,18 +472,17 @@ static int xen_sync_dirty_bitmap(XenIOState *state,
     if (rc < 0) {
         if (rc != -ENODATA) {
-            ram_addr_t addr, end;
-            xen_modified_memory(start_addr, size);
-            end = TARGET_PAGE_ALIGN(start_addr + size);
-            for (addr = start_addr & TARGET_PAGE_MASK; addr < end; addr += 
-                cpu_physical_memory_set_dirty(addr);
-            }
+            target_phys_addr_t todirty;
             DPRINTF("xen: track_dirty_vram failed (0x" TARGET_FMT_plx
                     ", 0x" TARGET_FMT_plx "): %s\n",
                     start_addr, start_addr + size, strerror(-rc));
+            xen_modified_memory(vram_offset, npages * TARGET_PAGE_SIZE);
+            for (todirty = vram_offset, i=0; i < npages; todirty += 
+                cpu_physical_memory_set_dirty(todirty);
+            }
         return rc;

Xen-devel mailing list



Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.