]> rtime.felk.cvut.cz Git - lisovros/qemu_apohw.git/commit
exec: fix migration with devices that use address_space_rw
authorPaolo Bonzini <pbonzini@redhat.com>
Mon, 21 Jul 2014 14:45:18 +0000 (16:45 +0200)
committerPaolo Bonzini <pbonzini@redhat.com>
Tue, 22 Jul 2014 08:38:50 +0000 (10:38 +0200)
commit6886867e9880830d735d8ae6f6cc63ed9eb2be0c
treef0e383fbf68b8ce5631b6e772053ad575ff0203b
parentfa666c10f2f3e15685ff88abd3bc433ddce012d6
exec: fix migration with devices that use address_space_rw

Devices that use address_space_rw to write large areas to memory
(as opposed to address_space_map/unmap) were broken with respect
to migration since fe680d0 (exec: Limit translation limiting in
address_space_translate to xen, 2014-05-07).  Such devices include
IDE CD-ROMs.

The reason is that invalidate_and_set_dirty (called by address_space_rw
but not address_space_map/unmap) was only setting the dirty bit for
the first page in the translation.

To fix this, introduce cpu_physical_memory_set_dirty_range_nocode that
is the same as cpu_physical_memory_set_dirty_range except it does not
muck with the DIRTY_MEMORY_CODE bitmap.  This function can be used if
the caller invalidates translations with tb_invalidate_phys_page_range.

There is another difference between cpu_physical_memory_set_dirty_range
and cpu_physical_memory_set_dirty_flag; the former includes a call
to xen_modified_memory.  This is handled separately in
invalidate_and_set_dirty, and is not needed in other callers of
cpu_physical_memory_set_dirty_range_nocode, so leave it alone.

Just one nit: now that invalidate_and_set_dirty takes care of handling
multiple pages, there is no need for address_space_unmap to wrap it
in a loop.  In fact that loop would now be O(n^2).

Reported-by: Dave Gilbert <dgilbert@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Tested-by: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
exec.c
include/exec/ram_addr.h