[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 34/36] migration: Add postcopy_has_request()
From: |
Juan Quintela |
Subject: |
[PULL 34/36] migration: Add postcopy_has_request() |
Date: |
Fri, 28 Jan 2022 19:30:31 +0100 |
From: Peter Xu <peterx@redhat.com>
Add a helper to detect whether postcopy has pending request.
Since at it, cleanup the code a bit, e.g. in unqueue_page() we shouldn't need
to check it again on queue empty because we're the only one (besides cleanup
code, which should never run during this process) that will take a request off
the list, so the request list can only grow but not shrink under the hood.
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 | 43 +++++++++++++++++++++++++++----------------
1 file changed, 27 insertions(+), 16 deletions(-)
diff --git a/migration/ram.c b/migration/ram.c
index 58adcaf430..eb9db4f777 100644
--- a/migration/ram.c
+++ b/migration/ram.c
@@ -355,6 +355,12 @@ static RAMState *ram_state;
static NotifierWithReturnList precopy_notifier_list;
+/* Whether postcopy has queued requests? */
+static bool postcopy_has_request(RAMState *rs)
+{
+ return !QSIMPLEQ_EMPTY_ATOMIC(&rs->src_page_requests);
+}
+
void precopy_infrastructure_init(void)
{
notifier_with_return_list_init(&precopy_notifier_list);
@@ -1539,28 +1545,33 @@ static bool find_dirty_block(RAMState *rs,
PageSearchStatus *pss, bool *again)
*/
static RAMBlock *unqueue_page(RAMState *rs, ram_addr_t *offset)
{
+ struct RAMSrcPageRequest *entry;
RAMBlock *block = NULL;
- if (QSIMPLEQ_EMPTY_ATOMIC(&rs->src_page_requests)) {
+ if (!postcopy_has_request(rs)) {
return NULL;
}
QEMU_LOCK_GUARD(&rs->src_page_req_mutex);
- if (!QSIMPLEQ_EMPTY(&rs->src_page_requests)) {
- struct RAMSrcPageRequest *entry =
- QSIMPLEQ_FIRST(&rs->src_page_requests);
- block = entry->rb;
- *offset = entry->offset;
- if (entry->len > TARGET_PAGE_SIZE) {
- entry->len -= TARGET_PAGE_SIZE;
- entry->offset += TARGET_PAGE_SIZE;
- } else {
- memory_region_unref(block->mr);
- QSIMPLEQ_REMOVE_HEAD(&rs->src_page_requests, next_req);
- g_free(entry);
- migration_consume_urgent_request();
- }
+ /*
+ * This should _never_ change even after we take the lock, because no one
+ * should be taking anything off the request list other than us.
+ */
+ assert(postcopy_has_request(rs));
+
+ entry = QSIMPLEQ_FIRST(&rs->src_page_requests);
+ block = entry->rb;
+ *offset = entry->offset;
+
+ if (entry->len > TARGET_PAGE_SIZE) {
+ entry->len -= TARGET_PAGE_SIZE;
+ entry->offset += TARGET_PAGE_SIZE;
+ } else {
+ memory_region_unref(block->mr);
+ QSIMPLEQ_REMOVE_HEAD(&rs->src_page_requests, next_req);
+ g_free(entry);
+ migration_consume_urgent_request();
}
return block;
@@ -2992,7 +3003,7 @@ static int ram_save_iterate(QEMUFile *f, void *opaque)
t0 = qemu_clock_get_ns(QEMU_CLOCK_REALTIME);
i = 0;
while ((ret = qemu_file_rate_limit(f)) == 0 ||
- !QSIMPLEQ_EMPTY(&rs->src_page_requests)) {
+ postcopy_has_request(rs)) {
int pages;
if (qemu_file_get_error(f)) {
--
2.34.1
- [PULL 22/36] migration: Report the error returned when save_live_iterate fails, (continued)
- [PULL 22/36] migration: Report the error returned when save_live_iterate fails, Juan Quintela, 2022/01/28
- [PULL 24/36] migration: Drop dead code of ram_debug_dump_bitmap(), Juan Quintela, 2022/01/28
- [PULL 25/36] migration: Don't return for postcopy_chunk_hostpages(), Juan Quintela, 2022/01/28
- [PULL 23/36] migration/ram: clean up unused comment., Juan Quintela, 2022/01/28
- [PULL 26/36] migration: Drop postcopy_chunk_hostpages(), Juan Quintela, 2022/01/28
- [PULL 28/36] migration: Drop return code for disgard ram process, Juan Quintela, 2022/01/28
- [PULL 27/36] migration: Do chunk page in postcopy_each_ram_send_discard(), Juan Quintela, 2022/01/28
- [PULL 31/36] migration: Tally pre-copy, downtime and post-copy bytes independently, Juan Quintela, 2022/01/28
- [PULL 29/36] migration: Don't return for postcopy_send_discard_bm_ram(), Juan Quintela, 2022/01/28
- [PULL 32/36] migration: No off-by-one for pss->page update in host page size, Juan Quintela, 2022/01/28
- [PULL 34/36] migration: Add postcopy_has_request(),
Juan Quintela <=
- [PULL 35/36] migration: Simplify unqueue_page(), Juan Quintela, 2022/01/28
- [PULL 33/36] migration: Enable UFFD_FEATURE_THREAD_ID even without blocktime feat, Juan Quintela, 2022/01/28
- [PULL 30/36] migration: Introduce ram_transferred_add(), Juan Quintela, 2022/01/28
- [PULL 36/36] migration: Move temp page setup and cleanup into separate functions, Juan Quintela, 2022/01/28
- Re: [PULL 00/36] Migration 20220128 patches, Peter Maydell, 2022/01/30