[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 14/28] migration/ram: Yield periodically to the main loop
From: |
Juan Quintela |
Subject: |
[PULL 14/28] migration/ram: Yield periodically to the main loop |
Date: |
Fri, 10 Jan 2020 18:32:01 +0100 |
From: Yury Kotov <address@hidden>
Usually, incoming migration coroutine yields to the main loop
while its IO-channel is waiting for data to receive. But there is a case
when RAM migration and data receive have the same speed: VM with huge
zeroed RAM. In this case, IO-channel won't read and thus the main loop
is stuck and for instance, it doesn't respond to QMP commands.
For this case, yield periodically, but not too often, so as not to
affect the speed of migration.
Signed-off-by: Yury Kotov <address@hidden>
Reviewed-by: Juan Quintela <address@hidden>
Signed-off-by: Juan Quintela <address@hidden>
---
migration/ram.c | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/migration/ram.c b/migration/ram.c
index 718a02a974..31d21b7f6b 100644
--- a/migration/ram.c
+++ b/migration/ram.c
@@ -4246,7 +4246,7 @@ static void colo_flush_ram_cache(void)
*/
static int ram_load_precopy(QEMUFile *f)
{
- int flags = 0, ret = 0, invalid_flags = 0, len = 0;
+ int flags = 0, ret = 0, invalid_flags = 0, len = 0, i = 0;
/* ADVISE is earlier, it shows the source has the postcopy capability on */
bool postcopy_advised = postcopy_is_advised();
if (!migrate_use_compression()) {
@@ -4258,6 +4258,17 @@ static int ram_load_precopy(QEMUFile *f)
void *host = NULL;
uint8_t ch;
+ /*
+ * Yield periodically to let main loop run, but an iteration of
+ * the main loop is expensive, so do it each some iterations
+ */
+ if ((i & 32767) == 0 && qemu_in_coroutine()) {
+ aio_co_schedule(qemu_get_current_aio_context(),
+ qemu_coroutine_self());
+ qemu_coroutine_yield();
+ }
+ i++;
+
addr = qemu_get_be64(f);
flags = addr & ~TARGET_PAGE_MASK;
addr &= TARGET_PAGE_MASK;
--
2.24.1
- [PULL 04/28] migration-test: ppc64: fix FORTH test program, (continued)
- [PULL 04/28] migration-test: ppc64: fix FORTH test program, Juan Quintela, 2020/01/10
- [PULL 05/28] runstate: ignore finishmigrate -> prelaunch transition, Juan Quintela, 2020/01/10
- [PULL 06/28] ram.c: remove unneeded labels, Juan Quintela, 2020/01/10
- [PULL 07/28] migration: Rate limit inside host pages, Juan Quintela, 2020/01/10
- [PULL 08/28] migration: Support QLIST migration, Juan Quintela, 2020/01/10
- [PULL 09/28] migration: Fix incorrect integer->float conversion caught by clang, Juan Quintela, 2020/01/10
- [PULL 11/28] misc: use QEMU_IS_ALIGNED, Juan Quintela, 2020/01/10
- [PULL 12/28] migration: add savevm_state_handler_remove(), Juan Quintela, 2020/01/10
- [PULL 10/28] migration: Fix the re-run check of the migrate-incoming command, Juan Quintela, 2020/01/10
- [PULL 13/28] migration: savevm_state_handler_insert: constant-time element insertion, Juan Quintela, 2020/01/10
- [PULL 14/28] migration/ram: Yield periodically to the main loop,
Juan Quintela <=
- [PULL 15/28] migration/postcopy: reduce memset when it is zero page and matches_target_page_size, Juan Quintela, 2020/01/10
- [PULL 16/28] migration/postcopy: wait for decompress thread in precopy, Juan Quintela, 2020/01/10
- [PULL 17/28] migration/postcopy: count target page number to decide the place_needed, Juan Quintela, 2020/01/10
- [PULL 18/28] migration/postcopy: set all_zero to true on the first target page, Juan Quintela, 2020/01/10
- [PULL 19/28] migration/postcopy: enable random order target page arrival, Juan Quintela, 2020/01/10
- [PULL 20/28] migration/postcopy: enable compress during postcopy, Juan Quintela, 2020/01/10
- [PULL 21/28] migration/multifd: clean pages after filling packet, Juan Quintela, 2020/01/10
- [PULL 22/28] migration/multifd: not use multifd during postcopy, Juan Quintela, 2020/01/10
- [PULL 23/28] migration/multifd: fix nullptr access in terminating multifd threads, Juan Quintela, 2020/01/10
- [PULL 24/28] migration/multifd: fix destroyed mutex access in terminating multifd threads, Juan Quintela, 2020/01/10