[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 37/38] migration: Simplify unqueue_page()
From: |
Juan Quintela |
Subject: |
[PULL 37/38] migration: Simplify unqueue_page() |
Date: |
Thu, 27 Jan 2022 16:05:47 +0100 |
From: Peter Xu <peterx@redhat.com>
This patch simplifies unqueue_page() on both sides of it (itself, and caller).
Firstly, due to the fact that right after unqueue_page() returned true, we'll
definitely send a huge page (see ram_save_huge_page() call - it will _never_
exit before finish sending that huge page), so unqueue_page() does not need to
jump in small page size if huge page is enabled on the ramblock. IOW, it's
destined that only the 1st 4K page will be valid, when unqueue the 2nd+ time
we'll notice the whole huge page has already been sent anyway. Switching to
operating on huge page reduces a lot of the loops of redundant unqueue_page().
Meanwhile, drop the dirty check. It's not helpful to call test_bit() every
time to jump over clean pages, as ram_save_host_page() has already done so,
while in a faster way (see commit ba1b7c812c ("migration/ram: Optimize
ram_save_host_page()", 2021-05-13)). So that's not necessary too.
Drop the two tracepoints along the way - based on above analysis it's very
possible that no one is really using it..
Signed-off-by: Peter Xu <peterx@redhat.com>
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
Signed-off-by: Juan Quintela <quintela@redhat.com>
---
migration/ram.c | 37 +++++++++++--------------------------
migration/trace-events | 3 +--
2 files changed, 12 insertions(+), 28 deletions(-)
diff --git a/migration/ram.c b/migration/ram.c
index eb9db4f777..91ca743ac8 100644
--- a/migration/ram.c
+++ b/migration/ram.c
@@ -1547,6 +1547,7 @@ static RAMBlock *unqueue_page(RAMState *rs, ram_addr_t
*offset)
{
struct RAMSrcPageRequest *entry;
RAMBlock *block = NULL;
+ size_t page_size;
if (!postcopy_has_request(rs)) {
return NULL;
@@ -1563,10 +1564,13 @@ static RAMBlock *unqueue_page(RAMState *rs, ram_addr_t
*offset)
entry = QSIMPLEQ_FIRST(&rs->src_page_requests);
block = entry->rb;
*offset = entry->offset;
+ page_size = qemu_ram_pagesize(block);
+ /* Each page request should only be multiple page size of the ramblock */
+ assert((entry->len % page_size) == 0);
- if (entry->len > TARGET_PAGE_SIZE) {
- entry->len -= TARGET_PAGE_SIZE;
- entry->offset += TARGET_PAGE_SIZE;
+ if (entry->len > page_size) {
+ entry->len -= page_size;
+ entry->offset += page_size;
} else {
memory_region_unref(block->mr);
QSIMPLEQ_REMOVE_HEAD(&rs->src_page_requests, next_req);
@@ -1574,6 +1578,9 @@ static RAMBlock *unqueue_page(RAMState *rs, ram_addr_t
*offset)
migration_consume_urgent_request();
}
+ trace_unqueue_page(block->idstr, *offset,
+ test_bit((*offset >> TARGET_PAGE_BITS), block->bmap));
+
return block;
}
@@ -1948,30 +1955,8 @@ static bool get_queued_page(RAMState *rs,
PageSearchStatus *pss)
{
RAMBlock *block;
ram_addr_t offset;
- bool dirty;
- do {
- block = unqueue_page(rs, &offset);
- /*
- * We're sending this page, and since it's postcopy nothing else
- * will dirty it, and we must make sure it doesn't get sent again
- * even if this queue request was received after the background
- * search already sent it.
- */
- if (block) {
- unsigned long page;
-
- page = offset >> TARGET_PAGE_BITS;
- dirty = test_bit(page, block->bmap);
- if (!dirty) {
- trace_get_queued_page_not_dirty(block->idstr, (uint64_t)offset,
- page);
- } else {
- trace_get_queued_page(block->idstr, (uint64_t)offset, page);
- }
- }
-
- } while (block && !dirty);
+ block = unqueue_page(rs, &offset);
if (!block) {
/*
diff --git a/migration/trace-events b/migration/trace-events
index 171a83a55d..48aa7b10ee 100644
--- a/migration/trace-events
+++ b/migration/trace-events
@@ -86,8 +86,6 @@ put_qlist_end(const char *field_name, const char *vmsd_name)
"%s(%s)"
qemu_file_fclose(void) ""
# ram.c
-get_queued_page(const char *block_name, uint64_t tmp_offset, unsigned long
page_abs) "%s/0x%" PRIx64 " page_abs=0x%lx"
-get_queued_page_not_dirty(const char *block_name, uint64_t tmp_offset,
unsigned long page_abs) "%s/0x%" PRIx64 " page_abs=0x%lx"
migration_bitmap_sync_start(void) ""
migration_bitmap_sync_end(uint64_t dirty_pages) "dirty_pages %" PRIu64
migration_bitmap_clear_dirty(char *str, uint64_t start, uint64_t size,
unsigned long page) "rb %s start 0x%"PRIx64" size 0x%"PRIx64" page 0x%lx"
@@ -113,6 +111,7 @@ ram_save_iterate_big_wait(uint64_t milliconds, int
iterations) "big wait: %" PRI
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"
+unqueue_page(char *block, uint64_t offset, bool dirty) "ramblock '%s' offset
0x%"PRIx64" dirty %d"
# multifd.c
multifd_new_send_channel_async(uint8_t id) "channel %u"
--
2.34.1
- [PULL 27/38] migration: Don't return for postcopy_chunk_hostpages(), (continued)
- [PULL 27/38] migration: Don't return for postcopy_chunk_hostpages(), Juan Quintela, 2022/01/27
- [PULL 26/38] migration: Drop dead code of ram_debug_dump_bitmap(), Juan Quintela, 2022/01/27
- [PULL 29/38] migration: Do chunk page in postcopy_each_ram_send_discard(), Juan Quintela, 2022/01/27
- [PULL 30/38] migration: Drop return code for disgard ram process, Juan Quintela, 2022/01/27
- [PULL 31/38] migration: Don't return for postcopy_send_discard_bm_ram(), Juan Quintela, 2022/01/27
- [PULL 32/38] migration: Introduce ram_transferred_add(), Juan Quintela, 2022/01/27
- [PULL 33/38] migration: Tally pre-copy, downtime and post-copy bytes independently, Juan Quintela, 2022/01/27
- [PULL 34/38] migration: No off-by-one for pss->page update in host page size, Juan Quintela, 2022/01/27
- [PULL 35/38] migration: Enable UFFD_FEATURE_THREAD_ID even without blocktime feat, Juan Quintela, 2022/01/27
- [PULL 36/38] migration: Add postcopy_has_request(), Juan Quintela, 2022/01/27
- [PULL 37/38] migration: Simplify unqueue_page(),
Juan Quintela <=
- [PULL 38/38] migration: Move temp page setup and cleanup into separate functions, Juan Quintela, 2022/01/27
- Re: [PULL 00/38] Migration 20220127 patches, Peter Maydell, 2022/01/28