From: Juan Quintela <quintela@redhat.com> To: qemu-devel@nongnu.org Cc: "Markus Armbruster" <armbru@redhat.com>, "David Hildenbrand" <david@redhat.com>, "Eduardo Habkost" <ehabkost@redhat.com>, xen-devel@lists.xenproject.org, "Richard Henderson" <richard.henderson@linaro.org>, "Stefano Stabellini" <sstabellini@kernel.org>, "Marcel Apfelbaum" <marcel.apfelbaum@gmail.com>, "Eric Blake" <eblake@redhat.com>, "Philippe Mathieu-Daudé" <philmd@redhat.com>, kvm@vger.kernel.org, "Peter Xu" <peterx@redhat.com>, "Marc-André Lureau" <marcandre.lureau@redhat.com>, "Paul Durrant" <paul@xen.org>, "Paolo Bonzini" <pbonzini@redhat.com>, "Dr. David Alan Gilbert" <dgilbert@redhat.com>, "Juan Quintela" <quintela@redhat.com>, "Michael S. Tsirkin" <mst@redhat.com>, "Anthony Perard" <anthony.perard@citrix.com> Subject: [PULL 17/20] migration/ram: Factor out populating pages readable in ram_block_populate_pages() Date: Mon, 1 Nov 2021 23:09:09 +0100 [thread overview] Message-ID: <20211101220912.10039-18-quintela@redhat.com> (raw) In-Reply-To: <20211101220912.10039-1-quintela@redhat.com> From: David Hildenbrand <david@redhat.com> Let's factor out prefaulting/populating to make further changes easier to review and add a comment what we are actually expecting to happen. While at it, use the actual page size of the ramblock, which defaults to qemu_real_host_page_size for anonymous memory. Further, rename ram_block_populate_pages() to ram_block_populate_read() as well, to make it clearer what we are doing. In the future, we might want to use MADV_POPULATE_READ to speed up population. Reviewed-by: Peter Xu <peterx@redhat.com> Signed-off-by: David Hildenbrand <david@redhat.com> Reviewed-by: Juan Quintela <quintela@redhat.com> Signed-off-by: Juan Quintela <quintela@redhat.com> --- migration/ram.c | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/migration/ram.c b/migration/ram.c index 54df5dc0fc..92c7b788ae 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -1639,26 +1639,35 @@ out: return ret; } +static inline void populate_read_range(RAMBlock *block, ram_addr_t offset, + ram_addr_t size) +{ + /* + * We read one byte of each page; this will preallocate page tables if + * required and populate the shared zeropage on MAP_PRIVATE anonymous memory + * where no page was populated yet. This might require adaption when + * supporting other mappings, like shmem. + */ + for (; offset < size; offset += block->page_size) { + char tmp = *((char *)block->host + offset); + + /* Don't optimize the read out */ + asm volatile("" : "+r" (tmp)); + } +} + /* - * ram_block_populate_pages: populate memory in the RAM block by reading - * an integer from the beginning of each page. + * ram_block_populate_read: preallocate page tables and populate pages in the + * RAM block by reading a byte of each page. * * Since it's solely used for userfault_fd WP feature, here we just * hardcode page size to qemu_real_host_page_size. * * @block: RAM block to populate */ -static void ram_block_populate_pages(RAMBlock *block) +static void ram_block_populate_read(RAMBlock *block) { - char *ptr = (char *) block->host; - - for (ram_addr_t offset = 0; offset < block->used_length; - offset += qemu_real_host_page_size) { - char tmp = *(ptr + offset); - - /* Don't optimize the read out */ - asm volatile("" : "+r" (tmp)); - } + populate_read_range(block, 0, block->used_length); } /* @@ -1684,7 +1693,7 @@ void ram_write_tracking_prepare(void) * UFFDIO_WRITEPROTECT_MODE_WP mode setting would silently skip * pages with pte_none() entries in page table. */ - ram_block_populate_pages(block); + ram_block_populate_read(block); } } -- 2.33.1
WARNING: multiple messages have this Message-ID (diff)
From: Juan Quintela <quintela@redhat.com> To: qemu-devel@nongnu.org Cc: "Stefano Stabellini" <sstabellini@kernel.org>, "Eduardo Habkost" <ehabkost@redhat.com>, kvm@vger.kernel.org, "David Hildenbrand" <david@redhat.com>, "Philippe Mathieu-Daudé" <philmd@redhat.com>, "Paul Durrant" <paul@xen.org>, "Richard Henderson" <richard.henderson@linaro.org>, "Markus Armbruster" <armbru@redhat.com>, "Peter Xu" <peterx@redhat.com>, "Dr. David Alan Gilbert" <dgilbert@redhat.com>, "Juan Quintela" <quintela@redhat.com>, "Paolo Bonzini" <pbonzini@redhat.com>, "Michael S. Tsirkin" <mst@redhat.com>, "Marc-André Lureau" <marcandre.lureau@redhat.com>, "Anthony Perard" <anthony.perard@citrix.com>, xen-devel@lists.xenproject.org, "Eric Blake" <eblake@redhat.com> Subject: [PULL 17/20] migration/ram: Factor out populating pages readable in ram_block_populate_pages() Date: Mon, 1 Nov 2021 23:09:09 +0100 [thread overview] Message-ID: <20211101220912.10039-18-quintela@redhat.com> (raw) In-Reply-To: <20211101220912.10039-1-quintela@redhat.com> From: David Hildenbrand <david@redhat.com> Let's factor out prefaulting/populating to make further changes easier to review and add a comment what we are actually expecting to happen. While at it, use the actual page size of the ramblock, which defaults to qemu_real_host_page_size for anonymous memory. Further, rename ram_block_populate_pages() to ram_block_populate_read() as well, to make it clearer what we are doing. In the future, we might want to use MADV_POPULATE_READ to speed up population. Reviewed-by: Peter Xu <peterx@redhat.com> Signed-off-by: David Hildenbrand <david@redhat.com> Reviewed-by: Juan Quintela <quintela@redhat.com> Signed-off-by: Juan Quintela <quintela@redhat.com> --- migration/ram.c | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/migration/ram.c b/migration/ram.c index 54df5dc0fc..92c7b788ae 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -1639,26 +1639,35 @@ out: return ret; } +static inline void populate_read_range(RAMBlock *block, ram_addr_t offset, + ram_addr_t size) +{ + /* + * We read one byte of each page; this will preallocate page tables if + * required and populate the shared zeropage on MAP_PRIVATE anonymous memory + * where no page was populated yet. This might require adaption when + * supporting other mappings, like shmem. + */ + for (; offset < size; offset += block->page_size) { + char tmp = *((char *)block->host + offset); + + /* Don't optimize the read out */ + asm volatile("" : "+r" (tmp)); + } +} + /* - * ram_block_populate_pages: populate memory in the RAM block by reading - * an integer from the beginning of each page. + * ram_block_populate_read: preallocate page tables and populate pages in the + * RAM block by reading a byte of each page. * * Since it's solely used for userfault_fd WP feature, here we just * hardcode page size to qemu_real_host_page_size. * * @block: RAM block to populate */ -static void ram_block_populate_pages(RAMBlock *block) +static void ram_block_populate_read(RAMBlock *block) { - char *ptr = (char *) block->host; - - for (ram_addr_t offset = 0; offset < block->used_length; - offset += qemu_real_host_page_size) { - char tmp = *(ptr + offset); - - /* Don't optimize the read out */ - asm volatile("" : "+r" (tmp)); - } + populate_read_range(block, 0, block->used_length); } /* @@ -1684,7 +1693,7 @@ void ram_write_tracking_prepare(void) * UFFDIO_WRITEPROTECT_MODE_WP mode setting would silently skip * pages with pte_none() entries in page table. */ - ram_block_populate_pages(block); + ram_block_populate_read(block); } } -- 2.33.1
next prev parent reply other threads:[~2021-11-01 22:09 UTC|newest] Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-11-01 22:08 [PULL 00/20] Migration 20211031 patches Juan Quintela 2021-11-01 22:08 ` Juan Quintela 2021-11-01 22:08 ` [PULL 01/20] migration/rdma: Fix out of order wrid Juan Quintela 2021-11-01 22:08 ` Juan Quintela 2021-11-01 22:08 ` [PULL 02/20] KVM: introduce dirty_pages and kvm_dirty_ring_enabled Juan Quintela 2021-11-01 22:08 ` Juan Quintela 2021-11-01 22:08 ` [PULL 03/20] memory: make global_dirty_tracking a bitmask Juan Quintela 2021-11-01 22:08 ` Juan Quintela 2021-11-01 22:08 ` [PULL 04/20] migration/dirtyrate: introduce struct and adjust DirtyRateStat Juan Quintela 2021-11-01 22:08 ` Juan Quintela 2021-11-04 20:54 ` Eric Blake 2021-11-04 20:54 ` Eric Blake 2021-11-01 22:08 ` [PULL 05/20] migration/dirtyrate: adjust order of registering thread Juan Quintela 2021-11-01 22:08 ` Juan Quintela 2021-11-01 22:08 ` [PULL 06/20] migration/dirtyrate: move init step of calculation to main thread Juan Quintela 2021-11-01 22:08 ` Juan Quintela 2021-11-01 22:08 ` [PULL 07/20] migration/dirtyrate: implement dirty-ring dirtyrate calculation Juan Quintela 2021-11-01 22:08 ` Juan Quintela 2021-11-04 22:05 ` Philippe Mathieu-Daudé 2021-11-04 22:05 ` Philippe Mathieu-Daudé 2021-11-06 11:45 ` Juan Quintela 2021-11-06 11:45 ` Juan Quintela 2021-11-01 22:09 ` [PULL 08/20] migration: Make migration blocker work for snapshots too Juan Quintela 2021-11-01 22:09 ` Juan Quintela 2021-11-01 22:09 ` [PULL 09/20] migration: Add migrate_add_blocker_internal() Juan Quintela 2021-11-01 22:09 ` Juan Quintela 2021-11-01 22:09 ` [PULL 10/20] dump-guest-memory: Block live migration Juan Quintela 2021-11-01 22:09 ` Juan Quintela 2021-11-01 22:09 ` [PULL 11/20] memory: Introduce replay_discarded callback for RamDiscardManager Juan Quintela 2021-11-01 22:09 ` Juan Quintela 2021-11-01 22:09 ` [PULL 12/20] virtio-mem: Implement replay_discarded RamDiscardManager callback Juan Quintela 2021-11-01 22:09 ` Juan Quintela 2021-11-01 22:09 ` [PULL 13/20] migration/ram: Handle RAMBlocks with a RamDiscardManager on the migration source Juan Quintela 2021-11-01 22:09 ` Juan Quintela 2021-11-01 22:09 ` [PULL 14/20] virtio-mem: Drop precopy notifier Juan Quintela 2021-11-01 22:09 ` Juan Quintela 2021-11-01 22:09 ` [PULL 15/20] migration/postcopy: Handle RAMBlocks with a RamDiscardManager on the destination Juan Quintela 2021-11-01 22:09 ` Juan Quintela 2021-11-01 22:09 ` [PULL 16/20] migration: Simplify alignment and alignment checks Juan Quintela 2021-11-01 22:09 ` Juan Quintela 2021-11-01 22:09 ` Juan Quintela [this message] 2021-11-01 22:09 ` [PULL 17/20] migration/ram: Factor out populating pages readable in ram_block_populate_pages() Juan Quintela 2021-11-01 22:09 ` [PULL 18/20] migration/ram: Handle RAMBlocks with a RamDiscardManager on background snapshots Juan Quintela 2021-11-01 22:09 ` Juan Quintela 2021-11-01 22:09 ` [PULL 19/20] memory: introduce total_dirty_pages to stat dirty pages Juan Quintela 2021-11-01 22:09 ` Juan Quintela 2021-11-01 22:09 ` [PULL 20/20] migration/dirtyrate: implement dirty-bitmap dirtyrate calculation Juan Quintela 2021-11-01 22:09 ` Juan Quintela 2021-11-02 15:45 ` [PULL 00/20] Migration 20211031 patches Richard Henderson 2021-11-02 15:45 ` Richard Henderson
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20211101220912.10039-18-quintela@redhat.com \ --to=quintela@redhat.com \ --cc=anthony.perard@citrix.com \ --cc=armbru@redhat.com \ --cc=david@redhat.com \ --cc=dgilbert@redhat.com \ --cc=eblake@redhat.com \ --cc=ehabkost@redhat.com \ --cc=kvm@vger.kernel.org \ --cc=marcandre.lureau@redhat.com \ --cc=marcel.apfelbaum@gmail.com \ --cc=mst@redhat.com \ --cc=paul@xen.org \ --cc=pbonzini@redhat.com \ --cc=peterx@redhat.com \ --cc=philmd@redhat.com \ --cc=qemu-devel@nongnu.org \ --cc=richard.henderson@linaro.org \ --cc=sstabellini@kernel.org \ --cc=xen-devel@lists.xenproject.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.