diff options
author | Andrey Gruzdev <andrey.gruzdev@virtuozzo.com> | 2021-01-29 13:14:05 +0300 |
---|---|---|
committer | Dr. David Alan Gilbert <dgilbert@redhat.com> | 2021-02-08 11:19:51 +0000 |
commit | 278e2f551a095b234de74dca9c214d5502a1f72c (patch) | |
tree | 0759c7262dc70c647fcfb12fdc9905e81666b022 /migration/trace-events | |
parent | 0e9b5cd6b238b7ca9a3a50d957f50c37082705a0 (diff) | |
download | qemu-278e2f551a095b234de74dca9c214d5502a1f72c.zip qemu-278e2f551a095b234de74dca9c214d5502a1f72c.tar.gz qemu-278e2f551a095b234de74dca9c214d5502a1f72c.tar.bz2 |
migration: support UFFD write fault processing in ram_save_iterate()
In this particular implementation the same single migration
thread is responsible for both normal linear dirty page
migration and procesing UFFD page fault events.
Processing write faults includes reading UFFD file descriptor,
finding respective RAM block and saving faulting page to
the migration stream. After page has been saved, write protection
can be removed. Since asynchronous version of qemu_put_buffer()
is expected to be used to save pages, we also have to flush
migraion stream prior to un-protecting saved memory range.
Write protection is being removed for any previously protected
memory chunk that has hit the migration stream. That's valid
for pages from linear page scan along with write fault pages.
Signed-off-by: Andrey Gruzdev <andrey.gruzdev@virtuozzo.com>
Acked-by: Peter Xu <peterx@redhat.com>
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Message-Id: <20210129101407.103458-4-andrey.gruzdev@virtuozzo.com>
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
fixup pagefault.address cast for 32bit
Diffstat (limited to 'migration/trace-events')
-rw-r--r-- | migration/trace-events | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/migration/trace-events b/migration/trace-events index 75de500..668c562 100644 --- a/migration/trace-events +++ b/migration/trace-events @@ -111,6 +111,8 @@ save_xbzrle_page_skipping(void) "" save_xbzrle_page_overflow(void) "" ram_save_iterate_big_wait(uint64_t milliconds, int iterations) "big wait: %" PRIu64 " milliseconds, %d iterations" ram_load_complete(int ret, uint64_t seq_iter) "exit_code %d seq iteration %" PRIu64 +ram_write_tracking_ramblock_start(const char *block_id, size_t page_size, void *addr, size_t length) "%s: page_size: %zu addr: %p length: %zu" +ram_write_tracking_ramblock_stop(const char *block_id, size_t page_size, void *addr, size_t length) "%s: page_size: %zu addr: %p length: %zu" # multifd.c multifd_new_send_channel_async(uint8_t id) "channel %d" |