diff options
author | David Hildenbrand <david@redhat.com> | 2023-01-05 13:45:26 +0100 |
---|---|---|
committer | Juan Quintela <quintela@redhat.com> | 2023-02-06 19:22:56 +0100 |
commit | 7cc8e9e0fadc734065d4d5c9cb0bd8997e743146 (patch) | |
tree | e4cb2ff38bd2fb7dfd107ced83cc35cc510a60ac /migration | |
parent | 72ef3a370836aa07261ad7aaeea27ed5cbcee342 (diff) | |
download | qemu-7cc8e9e0fadc734065d4d5c9cb0bd8997e743146.zip qemu-7cc8e9e0fadc734065d4d5c9cb0bd8997e743146.tar.gz qemu-7cc8e9e0fadc734065d4d5c9cb0bd8997e743146.tar.bz2 |
migration/ram: Don't explicitly unprotect when unregistering uffd-wp
When unregistering uffd-wp, older kernels before commit f369b07c86143
("mm/uffd:reset write protection when unregister with wp-mode") won't
clear the uffd-wp PTE bit. When re-registering uffd-wp, the previous
uffd-wp PTE bits would trigger again. With above commit, the kernel will
clear the uffd-wp PTE bits when unregistering itself.
Consequently, we'll clear the uffd-wp PTE bits now twice -- whereby we
don't care about clearing them at all: a new background snapshot will
re-register uffd-wp and re-protect all memory either way.
So let's skip the manual clearing of uffd-wp. If ever relevant, we
could clear conditionally in uffd_unregister_memory() -- we just need a
way to figure out more recent kernels.
Reviewed-by: Peter Xu <peterx@redhat.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
Signed-off-by: David Hildenbrand <david@redhat.com>
Signed-off-by: Juan Quintela <quintela@redhat.com>
Diffstat (limited to 'migration')
-rw-r--r-- | migration/ram.c | 9 |
1 files changed, 0 insertions, 9 deletions
diff --git a/migration/ram.c b/migration/ram.c index 73e5ca9..efaae07 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -1918,12 +1918,6 @@ fail: if ((block->flags & RAM_UF_WRITEPROTECT) == 0) { continue; } - /* - * In case some memory block failed to be write-protected - * remove protection and unregister all succeeded RAM blocks - */ - uffd_change_protection(rs->uffdio_fd, block->host, block->max_length, - false, false); uffd_unregister_memory(rs->uffdio_fd, block->host, block->max_length); /* Cleanup flags and remove reference */ block->flags &= ~RAM_UF_WRITEPROTECT; @@ -1949,9 +1943,6 @@ void ram_write_tracking_stop(void) if ((block->flags & RAM_UF_WRITEPROTECT) == 0) { continue; } - /* Remove protection and unregister all affected RAM blocks */ - uffd_change_protection(rs->uffdio_fd, block->host, block->max_length, - false, false); uffd_unregister_memory(rs->uffdio_fd, block->host, block->max_length); trace_ram_write_tracking_ramblock_stop(block->idstr, block->page_size, |