[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[RFC PATCH v1 23/26] migration/multifd: Support incoming fixed-ram strea
From: |
Fabiano Rosas |
Subject: |
[RFC PATCH v1 23/26] migration/multifd: Support incoming fixed-ram stream format |
Date: |
Thu, 30 Mar 2023 15:03:33 -0300 |
For the incoming fixed-ram migration we need to read the ramblock
headers, get the pages bitmap and send the host address of each
non-zero page to the multifd channel thread for writing.
To read from the migration file we need a preadv function that can
read into the iovs in segments of contiguous pages because (as in the
writing case) the file offset applies to the entire iovec.
Usage on HMP is:
(qemu) migrate_set_capability multifd on
(qemu) migrate_set_capability fixed-ram on
(qemu) migrate_set_parameter max-bandwidth 0
(qemu) migrate_set_parameter multifd-channels 8
(qemu) migrate_incoming file:migfile
(qemu) info status
(qemu) c
Signed-off-by: Fabiano Rosas <farosas@suse.de>
---
migration/multifd.c | 26 ++++++++++++++++++++++++--
migration/ram.c | 9 +++++++--
2 files changed, 31 insertions(+), 4 deletions(-)
diff --git a/migration/multifd.c b/migration/multifd.c
index cc70b20ff7..36b5aedb16 100644
--- a/migration/multifd.c
+++ b/migration/multifd.c
@@ -141,6 +141,7 @@ static void nocomp_recv_cleanup(MultiFDRecvParams *p)
static int nocomp_recv_pages(MultiFDRecvParams *p, Error **errp)
{
uint32_t flags = p->flags & MULTIFD_FLAG_COMPRESSION_MASK;
+ uint64_t read_base = 0;
if (flags != MULTIFD_FLAG_NOCOMP) {
error_setg(errp, "multifd %u: flags received %x flags expected %x",
@@ -151,7 +152,13 @@ static int nocomp_recv_pages(MultiFDRecvParams *p, Error
**errp)
p->iov[i].iov_base = p->host + p->normal[i];
p->iov[i].iov_len = p->page_size;
}
- return qio_channel_readv_all(p->c, p->iov, p->normal_num, errp);
+
+ if (migrate_fixed_ram()) {
+ read_base = p->pages->block->pages_offset - (uint64_t) p->host;
+ }
+
+ return qio_channel_read_full_all(p->c, p->iov, p->normal_num, read_base,
+ p->read_flags, errp);
}
static MultiFDMethods multifd_nocomp_ops = {
@@ -1221,9 +1228,21 @@ void multifd_recv_sync_main(void)
{
int i;
- if (!migrate_use_multifd() || !migrate_multifd_use_packets()) {
+ if (!migrate_use_multifd()) {
return;
}
+
+ if (!migrate_multifd_use_packets()) {
+ for (i = 0; i < migrate_multifd_channels(); i++) {
+ MultiFDRecvParams *p = &multifd_recv_state->params[i];
+
+ qemu_sem_post(&p->sem);
+ continue;
+ }
+
+ return;
+ }
+
for (i = 0; i < migrate_multifd_channels(); i++) {
MultiFDRecvParams *p = &multifd_recv_state->params[i];
@@ -1256,6 +1275,7 @@ static void *multifd_recv_thread(void *opaque)
while (true) {
uint32_t flags;
+ p->normal_num = 0;
if (p->quit) {
break;
@@ -1377,6 +1397,8 @@ int multifd_load_setup(Error **errp)
p->packet_len = sizeof(MultiFDPacket_t)
+ sizeof(uint64_t) * page_count;
p->packet = g_malloc0(p->packet_len);
+ } else {
+ p->read_flags |= QIO_CHANNEL_READ_FLAG_WITH_OFFSET;
}
p->name = g_strdup_printf("multifdrecv_%d", i);
p->iov = g_new0(struct iovec, page_count);
diff --git a/migration/ram.c b/migration/ram.c
index e9b28c16da..180e8e0d94 100644
--- a/migration/ram.c
+++ b/migration/ram.c
@@ -4427,8 +4427,13 @@ static void read_ramblock_fixed_ram(QEMUFile *f,
RAMBlock *block,
host = host_from_ram_block_offset(block, offset);
read_len = MIN(len, TARGET_PAGE_SIZE);
- read = qemu_get_buffer_at(f, host, read_len,
- block->pages_offset + offset);
+ if (migrate_use_multifd()) {
+ multifd_recv_queue_page(f, block, offset);
+ read = read_len;
+ } else {
+ read = qemu_get_buffer_at(f, host, read_len,
+ block->pages_offset + offset);
+ }
completed += read;
}
}
--
2.35.3
- [RFC PATCH v1 13/26] tests/qtest: migration-test: Add tests for fixed-ram file-based migration, (continued)
- [RFC PATCH v1 13/26] tests/qtest: migration-test: Add tests for fixed-ram file-based migration, Fabiano Rosas, 2023/03/30
- [RFC PATCH v1 15/26] migration/multifd: Remove direct "socket" references, Fabiano Rosas, 2023/03/30
- [RFC PATCH v1 14/26] migration: Add completion tracepoint, Fabiano Rosas, 2023/03/30
- [RFC PATCH v1 16/26] migration/multifd: Allow multifd without packets, Fabiano Rosas, 2023/03/30
- [RFC PATCH v1 17/26] migration/multifd: Add outgoing QIOChannelFile support, Fabiano Rosas, 2023/03/30
- [RFC PATCH v1 19/26] migration/multifd: Add pages to the receiving side, Fabiano Rosas, 2023/03/30
- [RFC PATCH v1 18/26] migration/multifd: Add incoming QIOChannelFile support, Fabiano Rosas, 2023/03/30
- [RFC PATCH v1 21/26] migration/ram: Add a wrapper for fixed-ram shadow bitmap, Fabiano Rosas, 2023/03/30
- [RFC PATCH v1 22/26] migration/multifd: Support outgoing fixed-ram stream format, Fabiano Rosas, 2023/03/30
- [RFC PATCH v1 20/26] io: Add a pwritev/preadv version that takes a discontiguous iovec, Fabiano Rosas, 2023/03/30
- [RFC PATCH v1 23/26] migration/multifd: Support incoming fixed-ram stream format,
Fabiano Rosas <=
- [RFC PATCH v1 25/26] migration: Add direct-io parameter, Fabiano Rosas, 2023/03/30
- [RFC PATCH v1 24/26] tests/qtest: Add a multifd + fixed-ram migration test, Fabiano Rosas, 2023/03/30
- [RFC PATCH v1 26/26] tests/migration/guestperf: Add file, fixed-ram and direct-io support, Fabiano Rosas, 2023/03/30
- Re: [RFC PATCH v1 00/26] migration: File based migration with multifd and fixed-ram, Peter Xu, 2023/03/30
- Re: [RFC PATCH v1 00/26] migration: File based migration with multifd and fixed-ram, Fabiano Rosas, 2023/03/31
- Re: [RFC PATCH v1 00/26] migration: File based migration with multifd and fixed-ram, Peter Xu, 2023/03/31
- Re: [RFC PATCH v1 00/26] migration: File based migration with multifd and fixed-ram, Fabiano Rosas, 2023/03/31
- Re: [RFC PATCH v1 00/26] migration: File based migration with multifd and fixed-ram, Peter Xu, 2023/03/31
- Re: [RFC PATCH v1 00/26] migration: File based migration with multifd and fixed-ram, Daniel P . Berrangé, 2023/03/31
- Re: [RFC PATCH v1 00/26] migration: File based migration with multifd and fixed-ram, Peter Xu, 2023/03/31