* [PATCH v2 00/16] migration: Remove QEMUFileHooks
@ 2023-05-03 13:18 Juan Quintela
2023-05-03 13:18 ` [PATCH v2 01/16] migration: Create migrate_rdma() Juan Quintela
` (15 more replies)
0 siblings, 16 replies; 20+ messages in thread
From: Juan Quintela @ 2023-05-03 13:18 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Xu, Juan Quintela, Leonardo Bras
Hi
Changes in v2:
- rebased on top of migration-20230428 pull (second try)
- several of the patches on the PULL request
- make clean that we don't use rdma code when we don't use rdma
- create migrate_rdma() to check if we are in rdma migration.
There is no hope for this code. I am trying to cleanup the rest of
rdma calls, but the code is convoluted as hell. And it lies with the
ram counters as crazy.
Please review.
In this series (v1):
- QEMUFileHooks only had a single user, RDMA migration. Just remove the
hooks and create stubs for when RDMA is not compiled in.
- This implies that we have to move all the operations from
migration/qemu-file.c to migration/rdma.c.
- I now we can still simplify rdma_control_save_page(), but I don't
have an easy setup for testing.
- Yes, the goal of the whole operations is to be able to move
ram_file_limit from qemu-file to migration.c.
Please review.
Thanks, Juan.
Juan Quintela (16):
migration: Create migrate_rdma()
migration/rdma: Unfold ram_control_before_iterate()
migration/rdma: Unfold ram_control_after_iterate()
migration/rdma: simplify ram_control_load_hook()
migration/rdma: Don't pass the QIOChannelRDMA as an opaque
migration/rdma: We can calculate the rioc from the QEMUFile
migration/rdma: It makes no sense to recive that flag without RDMA
migration: Make RAM_SAVE_FLAG_HOOK a normal case entry
migration/rdma: Remove all uses of RAM_CONTROL_HOOK
migration/rdma: Unfold hook_ram_load()
migration/rdma: Make ram_control_save_page() use exported interfaces
migration/rdma: Create rdma_control_save_page()
qemu-file: Remove QEMUFileHooks
migration/rdma: Move rdma constants from qemu-file.h to rdma.h
migration/rdma: Remove qemu_ prefix from exported functions
migration/rdma: If we are in postcopy don't do anything
migration/migration.h | 3 +
migration/options.c | 7 ++
migration/options.h | 1 +
migration/qemu-file.c | 77 +-------------------
migration/qemu-file.h | 51 --------------
migration/ram.c | 60 +++++++++++-----
migration/rdma.c | 155 ++++++++++++++++++++++-------------------
migration/rdma.h | 36 ++++++++++
migration/trace-events | 28 ++++----
9 files changed, 186 insertions(+), 232 deletions(-)
--
2.40.0
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH v2 01/16] migration: Create migrate_rdma()
2023-05-03 13:18 [PATCH v2 00/16] migration: Remove QEMUFileHooks Juan Quintela
@ 2023-05-03 13:18 ` Juan Quintela
2023-05-03 13:34 ` Daniel P. Berrangé
2023-05-03 13:18 ` [PATCH v2 02/16] migration/rdma: Unfold ram_control_before_iterate() Juan Quintela
` (14 subsequent siblings)
15 siblings, 1 reply; 20+ messages in thread
From: Juan Quintela @ 2023-05-03 13:18 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Xu, Juan Quintela, Leonardo Bras
Helper to say if we are doing a migration over rdma.
Signed-off-by: Juan Quintela <quintela@redhat.com>
---
migration/migration.h | 3 +++
migration/options.c | 7 +++++++
migration/options.h | 1 +
migration/rdma.c | 4 +++-
4 files changed, 14 insertions(+), 1 deletion(-)
diff --git a/migration/migration.h b/migration/migration.h
index 3a918514e7..47fe116167 100644
--- a/migration/migration.h
+++ b/migration/migration.h
@@ -432,6 +432,9 @@ struct MigrationState {
/* QEMU_VM_VMDESCRIPTION content filled for all non-iterable devices. */
JSONWriter *vmdesc;
+
+ /* Is this a rdma migration */
+ bool rdma_migration;
};
void migrate_set_state(int *state, int old_state, int new_state);
diff --git a/migration/options.c b/migration/options.c
index 53b7fc5d5d..39843f9325 100644
--- a/migration/options.c
+++ b/migration/options.c
@@ -349,6 +349,13 @@ bool migrate_postcopy(void)
return migrate_postcopy_ram() || migrate_dirty_bitmaps();
}
+bool migrate_rdma(void)
+{
+ MigrationState *s = migrate_get_current();
+
+ return s->rdma_migration;
+}
+
bool migrate_tls(void)
{
MigrationState *s = migrate_get_current();
diff --git a/migration/options.h b/migration/options.h
index 3c322867cd..3c555e28c7 100644
--- a/migration/options.h
+++ b/migration/options.h
@@ -61,6 +61,7 @@ bool migrate_zero_copy_send(void);
bool migrate_multifd_flush_after_each_section(void);
bool migrate_postcopy(void);
+bool migrate_rdma(void);
bool migrate_tls(void);
/* capabilities helpers */
diff --git a/migration/rdma.c b/migration/rdma.c
index 7e747b2595..b026e98519 100644
--- a/migration/rdma.c
+++ b/migration/rdma.c
@@ -4119,6 +4119,7 @@ void rdma_start_incoming_migration(const char *host_port, Error **errp)
int ret;
RDMAContext *rdma;
Error *local_err = NULL;
+ MigrationState *s = migrate_get_current();
trace_rdma_start_incoming_migration();
@@ -4149,7 +4150,7 @@ void rdma_start_incoming_migration(const char *host_port, Error **errp)
}
trace_rdma_start_incoming_migration_after_rdma_listen();
-
+ s->rdma_migration = true;
qemu_set_fd_handler(rdma->channel->fd, rdma_accept_incoming_migration,
NULL, (void *)(intptr_t)rdma);
return;
@@ -4225,6 +4226,7 @@ void rdma_start_outgoing_migration(void *opaque,
trace_rdma_start_outgoing_migration_after_rdma_connect();
+ s->rdma_migration = true;
s->to_dst_file = qemu_fopen_rdma(rdma, "wb");
migrate_fd_connect(s, NULL);
return;
--
2.40.0
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v2 02/16] migration/rdma: Unfold ram_control_before_iterate()
2023-05-03 13:18 [PATCH v2 00/16] migration: Remove QEMUFileHooks Juan Quintela
2023-05-03 13:18 ` [PATCH v2 01/16] migration: Create migrate_rdma() Juan Quintela
@ 2023-05-03 13:18 ` Juan Quintela
2023-05-03 13:18 ` [PATCH v2 03/16] migration/rdma: Unfold ram_control_after_iterate() Juan Quintela
` (13 subsequent siblings)
15 siblings, 0 replies; 20+ messages in thread
From: Juan Quintela @ 2023-05-03 13:18 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Xu, Juan Quintela, Leonardo Bras
Once there:
- Remove unused data parameter
- unfold it in its callers.
- change all callers to call qemu_rdma_registration_start()
Signed-off-by: Juan Quintela <quintela@redhat.com>
---
migration/qemu-file.c | 13 +------------
migration/qemu-file.h | 2 --
migration/ram.c | 16 +++++++++++++---
migration/rdma.c | 8 +++++---
migration/rdma.h | 6 ++++++
5 files changed, 25 insertions(+), 20 deletions(-)
diff --git a/migration/qemu-file.c b/migration/qemu-file.c
index ee04240a21..b6dca23706 100644
--- a/migration/qemu-file.c
+++ b/migration/qemu-file.c
@@ -30,6 +30,7 @@
#include "qemu-file.h"
#include "trace.h"
#include "qapi/error.h"
+#include "rdma.h"
#define IO_BUF_SIZE 32768
#define MAX_IOV_SIZE MIN_CONST(IOV_MAX, 64)
@@ -314,18 +315,6 @@ void qemu_fflush(QEMUFile *f)
f->iovcnt = 0;
}
-void ram_control_before_iterate(QEMUFile *f, uint64_t flags)
-{
- int ret = 0;
-
- if (f->hooks && f->hooks->before_ram_iterate) {
- ret = f->hooks->before_ram_iterate(f, flags, NULL);
- if (ret < 0) {
- qemu_file_set_error(f, ret);
- }
- }
-}
-
void ram_control_after_iterate(QEMUFile *f, uint64_t flags)
{
int ret = 0;
diff --git a/migration/qemu-file.h b/migration/qemu-file.h
index d16cd50448..c898c5c537 100644
--- a/migration/qemu-file.h
+++ b/migration/qemu-file.h
@@ -56,7 +56,6 @@ typedef size_t (QEMURamSaveFunc)(QEMUFile *f,
uint64_t *bytes_sent);
typedef struct QEMUFileHooks {
- QEMURamHookFunc *before_ram_iterate;
QEMURamHookFunc *after_ram_iterate;
QEMURamHookFunc *hook_ram_load;
QEMURamSaveFunc *save_page;
@@ -150,7 +149,6 @@ void qemu_fflush(QEMUFile *f);
void qemu_file_set_blocking(QEMUFile *f, bool block);
int qemu_file_get_to_fd(QEMUFile *f, int fd, size_t size);
-void ram_control_before_iterate(QEMUFile *f, uint64_t flags);
void ram_control_after_iterate(QEMUFile *f, uint64_t flags);
void ram_control_load_hook(QEMUFile *f, uint64_t flags, void *data);
diff --git a/migration/ram.c b/migration/ram.c
index 7d81c4a39e..ce5dfc3c86 100644
--- a/migration/ram.c
+++ b/migration/ram.c
@@ -58,6 +58,7 @@
#include "qemu/iov.h"
#include "multifd.h"
#include "sysemu/runstate.h"
+#include "rdma.h"
#include "options.h"
#include "hw/boards.h" /* for machine_dump_guest_core() */
@@ -3277,7 +3278,10 @@ static int ram_save_setup(QEMUFile *f, void *opaque)
}
}
- ram_control_before_iterate(f, RAM_CONTROL_SETUP);
+ ret = qemu_rdma_registration_start(f, RAM_CONTROL_SETUP);
+ if (ret < 0) {
+ qemu_file_set_error(f, ret);
+ }
ram_control_after_iterate(f, RAM_CONTROL_SETUP);
migration_ops = g_malloc0(sizeof(MigrationOps));
@@ -3337,7 +3341,10 @@ static int ram_save_iterate(QEMUFile *f, void *opaque)
/* Read version before ram_list.blocks */
smp_rmb();
- ram_control_before_iterate(f, RAM_CONTROL_ROUND);
+ ret = qemu_rdma_registration_start(f, RAM_CONTROL_ROUND);
+ if (ret < 0) {
+ qemu_file_set_error(f, ret);
+ }
t0 = qemu_clock_get_ns(QEMU_CLOCK_REALTIME);
i = 0;
@@ -3442,7 +3449,10 @@ static int ram_save_complete(QEMUFile *f, void *opaque)
migration_bitmap_sync_precopy(rs);
}
- ram_control_before_iterate(f, RAM_CONTROL_FINISH);
+ ret = qemu_rdma_registration_start(f, RAM_CONTROL_FINISH);
+ if (ret < 0) {
+ qemu_file_set_error(f, ret);
+ }
/* try transferring iterative blocks of memory */
diff --git a/migration/rdma.c b/migration/rdma.c
index b026e98519..d8a194ff26 100644
--- a/migration/rdma.c
+++ b/migration/rdma.c
@@ -3860,12 +3860,15 @@ static int rdma_load_hook(QEMUFile *f, uint64_t flags, void *data)
}
}
-static int qemu_rdma_registration_start(QEMUFile *f,
- uint64_t flags, void *data)
+int qemu_rdma_registration_start(QEMUFile *f, uint64_t flags)
{
QIOChannelRDMA *rioc = QIO_CHANNEL_RDMA(qemu_file_get_ioc(f));
RDMAContext *rdma;
+ if (!migrate_rdma()) {
+ return 0;
+ }
+
RCU_READ_LOCK_GUARD();
rdma = qatomic_rcu_read(&rioc->rdmaout);
if (!rdma) {
@@ -4004,7 +4007,6 @@ static const QEMUFileHooks rdma_read_hooks = {
};
static const QEMUFileHooks rdma_write_hooks = {
- .before_ram_iterate = qemu_rdma_registration_start,
.after_ram_iterate = qemu_rdma_registration_stop,
.save_page = qemu_rdma_save_page,
};
diff --git a/migration/rdma.h b/migration/rdma.h
index de2ba09dc5..901c829c8b 100644
--- a/migration/rdma.h
+++ b/migration/rdma.h
@@ -22,4 +22,10 @@ void rdma_start_outgoing_migration(void *opaque, const char *host_port,
void rdma_start_incoming_migration(const char *host_port, Error **errp);
+
+#ifdef CONFIG_RDMA
+int qemu_rdma_registration_start(QEMUFile *f, uint64_t flags);
+#else
+int qemu_rdma_registration_start(QEMUFile *f, uint64_t flags) { return 0; }
+#endif
#endif
--
2.40.0
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v2 03/16] migration/rdma: Unfold ram_control_after_iterate()
2023-05-03 13:18 [PATCH v2 00/16] migration: Remove QEMUFileHooks Juan Quintela
2023-05-03 13:18 ` [PATCH v2 01/16] migration: Create migrate_rdma() Juan Quintela
2023-05-03 13:18 ` [PATCH v2 02/16] migration/rdma: Unfold ram_control_before_iterate() Juan Quintela
@ 2023-05-03 13:18 ` Juan Quintela
2023-05-03 13:18 ` [PATCH v2 04/16] migration/rdma: simplify ram_control_load_hook() Juan Quintela
` (12 subsequent siblings)
15 siblings, 0 replies; 20+ messages in thread
From: Juan Quintela @ 2023-05-03 13:18 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Xu, Juan Quintela, Leonardo Bras
Once there:
- Remove unused data parameter
- unfold it in its callers
- change all callers to call qemu_rdma_registration_stop()
Signed-off-by: Juan Quintela <quintela@redhat.com>
---
migration/qemu-file.c | 12 ------------
migration/qemu-file.h | 2 --
migration/ram.c | 17 ++++++++++++++---
migration/rdma.c | 8 +++++---
migration/rdma.h | 2 ++
5 files changed, 21 insertions(+), 20 deletions(-)
diff --git a/migration/qemu-file.c b/migration/qemu-file.c
index b6dca23706..22af45a5db 100644
--- a/migration/qemu-file.c
+++ b/migration/qemu-file.c
@@ -315,18 +315,6 @@ void qemu_fflush(QEMUFile *f)
f->iovcnt = 0;
}
-void ram_control_after_iterate(QEMUFile *f, uint64_t flags)
-{
- int ret = 0;
-
- if (f->hooks && f->hooks->after_ram_iterate) {
- ret = f->hooks->after_ram_iterate(f, flags, NULL);
- if (ret < 0) {
- qemu_file_set_error(f, ret);
- }
- }
-}
-
void ram_control_load_hook(QEMUFile *f, uint64_t flags, void *data)
{
int ret = -EINVAL;
diff --git a/migration/qemu-file.h b/migration/qemu-file.h
index c898c5c537..fac26d7869 100644
--- a/migration/qemu-file.h
+++ b/migration/qemu-file.h
@@ -56,7 +56,6 @@ typedef size_t (QEMURamSaveFunc)(QEMUFile *f,
uint64_t *bytes_sent);
typedef struct QEMUFileHooks {
- QEMURamHookFunc *after_ram_iterate;
QEMURamHookFunc *hook_ram_load;
QEMURamSaveFunc *save_page;
} QEMUFileHooks;
@@ -149,7 +148,6 @@ void qemu_fflush(QEMUFile *f);
void qemu_file_set_blocking(QEMUFile *f, bool block);
int qemu_file_get_to_fd(QEMUFile *f, int fd, size_t size);
-void ram_control_after_iterate(QEMUFile *f, uint64_t flags);
void ram_control_load_hook(QEMUFile *f, uint64_t flags, void *data);
/* Whenever this is found in the data stream, the flags
diff --git a/migration/ram.c b/migration/ram.c
index ce5dfc3c86..a5109a0f77 100644
--- a/migration/ram.c
+++ b/migration/ram.c
@@ -3282,7 +3282,11 @@ static int ram_save_setup(QEMUFile *f, void *opaque)
if (ret < 0) {
qemu_file_set_error(f, ret);
}
- ram_control_after_iterate(f, RAM_CONTROL_SETUP);
+
+ ret = qemu_rdma_registration_stop(f, RAM_CONTROL_SETUP);
+ if (ret < 0) {
+ qemu_file_set_error(f, ret);
+ }
migration_ops = g_malloc0(sizeof(MigrationOps));
migration_ops->ram_save_target_page = ram_save_target_page_legacy;
@@ -3401,7 +3405,10 @@ static int ram_save_iterate(QEMUFile *f, void *opaque)
* Must occur before EOS (or any QEMUFile operation)
* because of RDMA protocol.
*/
- ram_control_after_iterate(f, RAM_CONTROL_ROUND);
+ ret = qemu_rdma_registration_stop(f, RAM_CONTROL_ROUND);
+ if (ret < 0) {
+ qemu_file_set_error(f, ret);
+ }
out:
if (ret >= 0
@@ -3474,7 +3481,11 @@ static int ram_save_complete(QEMUFile *f, void *opaque)
qemu_mutex_unlock(&rs->bitmap_mutex);
flush_compressed_data(rs);
- ram_control_after_iterate(f, RAM_CONTROL_FINISH);
+
+ int ret = qemu_rdma_registration_stop(f, RAM_CONTROL_FINISH);
+ if (ret < 0) {
+ qemu_file_set_error(f, ret);
+ }
}
if (ret < 0) {
diff --git a/migration/rdma.c b/migration/rdma.c
index d8a194ff26..ca893c0bba 100644
--- a/migration/rdma.c
+++ b/migration/rdma.c
@@ -3892,14 +3892,17 @@ int qemu_rdma_registration_start(QEMUFile *f, uint64_t flags)
* Inform dest that dynamic registrations are done for now.
* First, flush writes, if any.
*/
-static int qemu_rdma_registration_stop(QEMUFile *f,
- uint64_t flags, void *data)
+int qemu_rdma_registration_stop(QEMUFile *f, uint64_t flags)
{
QIOChannelRDMA *rioc = QIO_CHANNEL_RDMA(qemu_file_get_ioc(f));
RDMAContext *rdma;
RDMAControlHeader head = { .len = 0, .repeat = 1 };
int ret = 0;
+ if (!migrate_rdma()) {
+ return 0;
+ }
+
RCU_READ_LOCK_GUARD();
rdma = qatomic_rcu_read(&rioc->rdmaout);
if (!rdma) {
@@ -4007,7 +4010,6 @@ static const QEMUFileHooks rdma_read_hooks = {
};
static const QEMUFileHooks rdma_write_hooks = {
- .after_ram_iterate = qemu_rdma_registration_stop,
.save_page = qemu_rdma_save_page,
};
diff --git a/migration/rdma.h b/migration/rdma.h
index 901c829c8b..a16a8d8bc6 100644
--- a/migration/rdma.h
+++ b/migration/rdma.h
@@ -25,7 +25,9 @@ void rdma_start_incoming_migration(const char *host_port, Error **errp);
#ifdef CONFIG_RDMA
int qemu_rdma_registration_start(QEMUFile *f, uint64_t flags);
+int qemu_rdma_registration_stop(QEMUFile *f, uint64_t flags);
#else
int qemu_rdma_registration_start(QEMUFile *f, uint64_t flags) { return 0; }
+int qemu_rdma_registration_stop(QEMUFile *f, uint64_t flags) { return 0; }
#endif
#endif
--
2.40.0
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v2 04/16] migration/rdma: simplify ram_control_load_hook()
2023-05-03 13:18 [PATCH v2 00/16] migration: Remove QEMUFileHooks Juan Quintela
` (2 preceding siblings ...)
2023-05-03 13:18 ` [PATCH v2 03/16] migration/rdma: Unfold ram_control_after_iterate() Juan Quintela
@ 2023-05-03 13:18 ` Juan Quintela
2023-05-03 13:18 ` [PATCH v2 05/16] migration/rdma: Don't pass the QIOChannelRDMA as an opaque Juan Quintela
` (11 subsequent siblings)
15 siblings, 0 replies; 20+ messages in thread
From: Juan Quintela @ 2023-05-03 13:18 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Xu, Juan Quintela, Leonardo Bras
Signed-off-by: Juan Quintela <quintela@redhat.com>
---
migration/qemu-file.c | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/migration/qemu-file.c b/migration/qemu-file.c
index 22af45a5db..9b5e14a2ef 100644
--- a/migration/qemu-file.c
+++ b/migration/qemu-file.c
@@ -317,10 +317,8 @@ void qemu_fflush(QEMUFile *f)
void ram_control_load_hook(QEMUFile *f, uint64_t flags, void *data)
{
- int ret = -EINVAL;
-
if (f->hooks && f->hooks->hook_ram_load) {
- ret = f->hooks->hook_ram_load(f, flags, data);
+ int ret = f->hooks->hook_ram_load(f, flags, data);
if (ret < 0) {
qemu_file_set_error(f, ret);
}
@@ -330,7 +328,7 @@ void ram_control_load_hook(QEMUFile *f, uint64_t flags, void *data)
* that expects there to be a hook on the destination.
*/
if (flags == RAM_CONTROL_HOOK) {
- qemu_file_set_error(f, ret);
+ qemu_file_set_error(f, -EINVAL);
}
}
}
--
2.40.0
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v2 05/16] migration/rdma: Don't pass the QIOChannelRDMA as an opaque
2023-05-03 13:18 [PATCH v2 00/16] migration: Remove QEMUFileHooks Juan Quintela
` (3 preceding siblings ...)
2023-05-03 13:18 ` [PATCH v2 04/16] migration/rdma: simplify ram_control_load_hook() Juan Quintela
@ 2023-05-03 13:18 ` Juan Quintela
2023-05-03 13:35 ` Daniel P. Berrangé
2023-05-03 13:18 ` [PATCH v2 06/16] migration/rdma: We can calculate the rioc from the QEMUFile Juan Quintela
` (10 subsequent siblings)
15 siblings, 1 reply; 20+ messages in thread
From: Juan Quintela @ 2023-05-03 13:18 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Xu, Juan Quintela, Leonardo Bras
We can calculate it from the QEMUFile like the caller.
Signed-off-by: Juan Quintela <quintela@redhat.com>
---
migration/rdma.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/migration/rdma.c b/migration/rdma.c
index ca893c0bba..c37fcab88a 100644
--- a/migration/rdma.c
+++ b/migration/rdma.c
@@ -3527,7 +3527,7 @@ static int dest_ram_sort_func(const void *a, const void *b)
*
* Keep doing this until the source tells us to stop.
*/
-static int qemu_rdma_registration_handle(QEMUFile *f, void *opaque)
+static int qemu_rdma_registration_handle(QEMUFile *f)
{
RDMAControlHeader reg_resp = { .len = sizeof(RDMARegisterResult),
.type = RDMA_CONTROL_REGISTER_RESULT,
@@ -3539,7 +3539,7 @@ static int qemu_rdma_registration_handle(QEMUFile *f, void *opaque)
};
RDMAControlHeader blocks = { .type = RDMA_CONTROL_RAM_BLOCKS_RESULT,
.repeat = 1 };
- QIOChannelRDMA *rioc = QIO_CHANNEL_RDMA(opaque);
+ QIOChannelRDMA *rioc = QIO_CHANNEL_RDMA(qemu_file_get_ioc(f));
RDMAContext *rdma;
RDMALocalBlocks *local;
RDMAControlHeader head;
@@ -3852,7 +3852,7 @@ static int rdma_load_hook(QEMUFile *f, uint64_t flags, void *data)
return rdma_block_notification_handle(rioc, data);
case RAM_CONTROL_HOOK:
- return qemu_rdma_registration_handle(f, rioc);
+ return qemu_rdma_registration_handle(f);
default:
/* Shouldn't be called with any other values */
--
2.40.0
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v2 06/16] migration/rdma: We can calculate the rioc from the QEMUFile
2023-05-03 13:18 [PATCH v2 00/16] migration: Remove QEMUFileHooks Juan Quintela
` (4 preceding siblings ...)
2023-05-03 13:18 ` [PATCH v2 05/16] migration/rdma: Don't pass the QIOChannelRDMA as an opaque Juan Quintela
@ 2023-05-03 13:18 ` Juan Quintela
2023-05-03 13:18 ` [PATCH v2 07/16] migration/rdma: It makes no sense to recive that flag without RDMA Juan Quintela
` (9 subsequent siblings)
15 siblings, 0 replies; 20+ messages in thread
From: Juan Quintela @ 2023-05-03 13:18 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Xu, Juan Quintela, Leonardo Bras
Signed-off-by: Juan Quintela <quintela@redhat.com>
---
migration/rdma.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/migration/rdma.c b/migration/rdma.c
index c37fcab88a..11815d1c11 100644
--- a/migration/rdma.c
+++ b/migration/rdma.c
@@ -3811,9 +3811,10 @@ out:
* the source.
*/
static int
-rdma_block_notification_handle(QIOChannelRDMA *rioc, const char *name)
+rdma_block_notification_handle(QEMUFile *f, const char *name)
{
RDMAContext *rdma;
+ QIOChannelRDMA *rioc = QIO_CHANNEL_RDMA(qemu_file_get_ioc(f));
int curr;
int found = -1;
@@ -3846,10 +3847,9 @@ rdma_block_notification_handle(QIOChannelRDMA *rioc, const char *name)
static int rdma_load_hook(QEMUFile *f, uint64_t flags, void *data)
{
- QIOChannelRDMA *rioc = QIO_CHANNEL_RDMA(qemu_file_get_ioc(f));
switch (flags) {
case RAM_CONTROL_BLOCK_REG:
- return rdma_block_notification_handle(rioc, data);
+ return rdma_block_notification_handle(f, data);
case RAM_CONTROL_HOOK:
return qemu_rdma_registration_handle(f);
--
2.40.0
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v2 07/16] migration/rdma: It makes no sense to recive that flag without RDMA
2023-05-03 13:18 [PATCH v2 00/16] migration: Remove QEMUFileHooks Juan Quintela
` (5 preceding siblings ...)
2023-05-03 13:18 ` [PATCH v2 06/16] migration/rdma: We can calculate the rioc from the QEMUFile Juan Quintela
@ 2023-05-03 13:18 ` Juan Quintela
2023-05-03 13:18 ` [PATCH v2 08/16] migration: Make RAM_SAVE_FLAG_HOOK a normal case entry Juan Quintela
` (8 subsequent siblings)
15 siblings, 0 replies; 20+ messages in thread
From: Juan Quintela @ 2023-05-03 13:18 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Xu, Juan Quintela, Leonardo Bras
This could only happen if the source send
RAM_SAVE_FLAG_HOOK (i.e. rdma) and destination don't have CONFIG_RDMA.
Signed-off-by: Juan Quintela <quintela@redhat.com>
---
migration/qemu-file.c | 8 --------
1 file changed, 8 deletions(-)
diff --git a/migration/qemu-file.c b/migration/qemu-file.c
index 9b5e14a2ef..014db96984 100644
--- a/migration/qemu-file.c
+++ b/migration/qemu-file.c
@@ -322,14 +322,6 @@ void ram_control_load_hook(QEMUFile *f, uint64_t flags, void *data)
if (ret < 0) {
qemu_file_set_error(f, ret);
}
- } else {
- /*
- * Hook is a hook specifically requested by the source sending a flag
- * that expects there to be a hook on the destination.
- */
- if (flags == RAM_CONTROL_HOOK) {
- qemu_file_set_error(f, -EINVAL);
- }
}
}
--
2.40.0
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v2 08/16] migration: Make RAM_SAVE_FLAG_HOOK a normal case entry
2023-05-03 13:18 [PATCH v2 00/16] migration: Remove QEMUFileHooks Juan Quintela
` (6 preceding siblings ...)
2023-05-03 13:18 ` [PATCH v2 07/16] migration/rdma: It makes no sense to recive that flag without RDMA Juan Quintela
@ 2023-05-03 13:18 ` Juan Quintela
2023-05-03 13:18 ` [PATCH v2 09/16] migration/rdma: Remove all uses of RAM_CONTROL_HOOK Juan Quintela
` (7 subsequent siblings)
15 siblings, 0 replies; 20+ messages in thread
From: Juan Quintela @ 2023-05-03 13:18 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Xu, Juan Quintela, Leonardo Bras
Fixes this commit, clearly a bad merge after a rebase or similar, it
should have been its own case since that point.
commit 5b0e9dd46fbda5152566a4a26fd96bc0d0452bf7
Author: Peter Lieven <pl@kamp.de>
Date: Tue Jun 24 11:32:36 2014 +0200
migration: catch unknown flag combinations in ram_load
Signed-off-by: Juan Quintela <quintela@redhat.com>
---
migration/ram.c | 12 +++++-------
1 file changed, 5 insertions(+), 7 deletions(-)
diff --git a/migration/ram.c b/migration/ram.c
index a5109a0f77..67ba2d7f7e 100644
--- a/migration/ram.c
+++ b/migration/ram.c
@@ -4466,14 +4466,12 @@ static int ram_load_precopy(QEMUFile *f)
multifd_recv_sync_main();
}
break;
+ case RAM_SAVE_FLAG_HOOK:
+ ram_control_load_hook(f, RAM_CONTROL_HOOK, NULL);
+ break;
default:
- if (flags & RAM_SAVE_FLAG_HOOK) {
- ram_control_load_hook(f, RAM_CONTROL_HOOK, NULL);
- } else {
- error_report("Unknown combination of migration flags: 0x%x",
- flags);
- ret = -EINVAL;
- }
+ error_report("Unknown combination of migration flags: 0x%x", flags);
+ ret = -EINVAL;
}
if (!ret) {
ret = qemu_file_get_error(f);
--
2.40.0
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v2 09/16] migration/rdma: Remove all uses of RAM_CONTROL_HOOK
2023-05-03 13:18 [PATCH v2 00/16] migration: Remove QEMUFileHooks Juan Quintela
` (7 preceding siblings ...)
2023-05-03 13:18 ` [PATCH v2 08/16] migration: Make RAM_SAVE_FLAG_HOOK a normal case entry Juan Quintela
@ 2023-05-03 13:18 ` Juan Quintela
2023-05-03 13:18 ` [PATCH v2 10/16] migration/rdma: Unfold hook_ram_load() Juan Quintela
` (6 subsequent siblings)
15 siblings, 0 replies; 20+ messages in thread
From: Juan Quintela @ 2023-05-03 13:18 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Xu, Juan Quintela, Leonardo Bras
Instead of going trhough ram_control_load_hook(), call
qemu_rdma_registration_handle() directly.
Signed-off-by: Juan Quintela <quintela@redhat.com>
---
migration/qemu-file.h | 1 -
migration/ram.c | 5 ++++-
migration/rdma.c | 9 +++++----
migration/rdma.h | 2 ++
4 files changed, 11 insertions(+), 6 deletions(-)
diff --git a/migration/qemu-file.h b/migration/qemu-file.h
index fac26d7869..7623e3c475 100644
--- a/migration/qemu-file.h
+++ b/migration/qemu-file.h
@@ -41,7 +41,6 @@ typedef int (QEMURamHookFunc)(QEMUFile *f, uint64_t flags, void *data);
*/
#define RAM_CONTROL_SETUP 0
#define RAM_CONTROL_ROUND 1
-#define RAM_CONTROL_HOOK 2
#define RAM_CONTROL_FINISH 3
#define RAM_CONTROL_BLOCK_REG 4
diff --git a/migration/ram.c b/migration/ram.c
index 67ba2d7f7e..c0110ca8cb 100644
--- a/migration/ram.c
+++ b/migration/ram.c
@@ -4467,7 +4467,10 @@ static int ram_load_precopy(QEMUFile *f)
}
break;
case RAM_SAVE_FLAG_HOOK:
- ram_control_load_hook(f, RAM_CONTROL_HOOK, NULL);
+ ret = qemu_rdma_registration_handle(f);
+ if (ret < 0) {
+ qemu_file_set_error(f, ret);
+ }
break;
default:
error_report("Unknown combination of migration flags: 0x%x", flags);
diff --git a/migration/rdma.c b/migration/rdma.c
index 11815d1c11..e0f41a9b97 100644
--- a/migration/rdma.c
+++ b/migration/rdma.c
@@ -3527,7 +3527,7 @@ static int dest_ram_sort_func(const void *a, const void *b)
*
* Keep doing this until the source tells us to stop.
*/
-static int qemu_rdma_registration_handle(QEMUFile *f)
+int qemu_rdma_registration_handle(QEMUFile *f)
{
RDMAControlHeader reg_resp = { .len = sizeof(RDMARegisterResult),
.type = RDMA_CONTROL_REGISTER_RESULT,
@@ -3554,6 +3554,10 @@ static int qemu_rdma_registration_handle(QEMUFile *f)
int count = 0;
int i = 0;
+ if (!migrate_rdma()) {
+ return 0;
+ }
+
RCU_READ_LOCK_GUARD();
rdma = qatomic_rcu_read(&rioc->rdmain);
@@ -3851,9 +3855,6 @@ static int rdma_load_hook(QEMUFile *f, uint64_t flags, void *data)
case RAM_CONTROL_BLOCK_REG:
return rdma_block_notification_handle(f, data);
- case RAM_CONTROL_HOOK:
- return qemu_rdma_registration_handle(f);
-
default:
/* Shouldn't be called with any other values */
abort();
diff --git a/migration/rdma.h b/migration/rdma.h
index a16a8d8bc6..8d0253047c 100644
--- a/migration/rdma.h
+++ b/migration/rdma.h
@@ -24,9 +24,11 @@ void rdma_start_incoming_migration(const char *host_port, Error **errp);
#ifdef CONFIG_RDMA
+int qemu_rdma_registration_handle(QEMUFile *f);
int qemu_rdma_registration_start(QEMUFile *f, uint64_t flags);
int qemu_rdma_registration_stop(QEMUFile *f, uint64_t flags);
#else
+int qemu_rdma_registration_handle(QEMUFile *f) { return 0; }
int qemu_rdma_registration_start(QEMUFile *f, uint64_t flags) { return 0; }
int qemu_rdma_registration_stop(QEMUFile *f, uint64_t flags) { return 0; }
#endif
--
2.40.0
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v2 10/16] migration/rdma: Unfold hook_ram_load()
2023-05-03 13:18 [PATCH v2 00/16] migration: Remove QEMUFileHooks Juan Quintela
` (8 preceding siblings ...)
2023-05-03 13:18 ` [PATCH v2 09/16] migration/rdma: Remove all uses of RAM_CONTROL_HOOK Juan Quintela
@ 2023-05-03 13:18 ` Juan Quintela
2023-05-03 13:18 ` [PATCH v2 11/16] migration/rdma: Make ram_control_save_page() use exported interfaces Juan Quintela
` (5 subsequent siblings)
15 siblings, 0 replies; 20+ messages in thread
From: Juan Quintela @ 2023-05-03 13:18 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Xu, Juan Quintela, Leonardo Bras
There is only one flag called with: RAM_CONTROL_BLOCK_REG.
Signed-off-by: Juan Quintela <quintela@redhat.com>
---
migration/qemu-file.c | 10 ----------
migration/qemu-file.h | 11 -----------
migration/ram.c | 6 ++++--
migration/rdma.c | 29 +++++++++--------------------
migration/rdma.h | 2 ++
5 files changed, 15 insertions(+), 43 deletions(-)
diff --git a/migration/qemu-file.c b/migration/qemu-file.c
index 014db96984..9d86900efe 100644
--- a/migration/qemu-file.c
+++ b/migration/qemu-file.c
@@ -315,16 +315,6 @@ void qemu_fflush(QEMUFile *f)
f->iovcnt = 0;
}
-void ram_control_load_hook(QEMUFile *f, uint64_t flags, void *data)
-{
- if (f->hooks && f->hooks->hook_ram_load) {
- int ret = f->hooks->hook_ram_load(f, flags, data);
- if (ret < 0) {
- qemu_file_set_error(f, ret);
- }
- }
-}
-
size_t ram_control_save_page(QEMUFile *f, ram_addr_t block_offset,
ram_addr_t offset, size_t size,
uint64_t *bytes_sent)
diff --git a/migration/qemu-file.h b/migration/qemu-file.h
index 7623e3c475..d69f5d65e8 100644
--- a/migration/qemu-file.h
+++ b/migration/qemu-file.h
@@ -29,20 +29,12 @@
#include "exec/cpu-common.h"
#include "io/channel.h"
-/*
- * This function provides hooks around different
- * stages of RAM migration.
- * 'data' is call specific data associated with the 'flags' value
- */
-typedef int (QEMURamHookFunc)(QEMUFile *f, uint64_t flags, void *data);
-
/*
* Constants used by ram_control_* hooks
*/
#define RAM_CONTROL_SETUP 0
#define RAM_CONTROL_ROUND 1
#define RAM_CONTROL_FINISH 3
-#define RAM_CONTROL_BLOCK_REG 4
/*
* This function allows override of where the RAM page
@@ -55,7 +47,6 @@ typedef size_t (QEMURamSaveFunc)(QEMUFile *f,
uint64_t *bytes_sent);
typedef struct QEMUFileHooks {
- QEMURamHookFunc *hook_ram_load;
QEMURamSaveFunc *save_page;
} QEMUFileHooks;
@@ -147,8 +138,6 @@ void qemu_fflush(QEMUFile *f);
void qemu_file_set_blocking(QEMUFile *f, bool block);
int qemu_file_get_to_fd(QEMUFile *f, int fd, size_t size);
-void ram_control_load_hook(QEMUFile *f, uint64_t flags, void *data);
-
/* Whenever this is found in the data stream, the flags
* will be passed to ram_control_load_hook in the incoming-migration
* side. This lets before_ram_iterate/after_ram_iterate add
diff --git a/migration/ram.c b/migration/ram.c
index c0110ca8cb..d29dd67d5f 100644
--- a/migration/ram.c
+++ b/migration/ram.c
@@ -4418,8 +4418,10 @@ static int ram_load_precopy(QEMUFile *f)
ret = -EINVAL;
}
}
- ram_control_load_hook(f, RAM_CONTROL_BLOCK_REG,
- block->idstr);
+ ret = rdma_block_notification_handle(f, block->idstr);
+ if (ret < 0) {
+ qemu_file_set_error(f, ret);
+ }
} else {
error_report("Unknown ramblock \"%s\", cannot "
"accept migration", id);
diff --git a/migration/rdma.c b/migration/rdma.c
index e0f41a9b97..a326606fd2 100644
--- a/migration/rdma.c
+++ b/migration/rdma.c
@@ -3808,20 +3808,22 @@ out:
}
/* Destination:
- * Called via a ram_control_load_hook during the initial RAM load section which
- * lists the RAMBlocks by name. This lets us know the order of the RAMBlocks
- * on the source.
- * We've already built our local RAMBlock list, but not yet sent the list to
- * the source.
+ * Called during the initial RAM load section which lists the
+ * RAMBlocks by name. This lets us know the order of the RAMBlocks on
+ * the source. We've already built our local RAMBlock list, but not
+ * yet sent the list to the source.
*/
-static int
-rdma_block_notification_handle(QEMUFile *f, const char *name)
+int rdma_block_notification_handle(QEMUFile *f, const char *name)
{
RDMAContext *rdma;
QIOChannelRDMA *rioc = QIO_CHANNEL_RDMA(qemu_file_get_ioc(f));
int curr;
int found = -1;
+ if (!migrate_rdma()) {
+ return 0;
+ }
+
RCU_READ_LOCK_GUARD();
rdma = qatomic_rcu_read(&rioc->rdmain);
@@ -3849,18 +3851,6 @@ rdma_block_notification_handle(QEMUFile *f, const char *name)
return 0;
}
-static int rdma_load_hook(QEMUFile *f, uint64_t flags, void *data)
-{
- switch (flags) {
- case RAM_CONTROL_BLOCK_REG:
- return rdma_block_notification_handle(f, data);
-
- default:
- /* Shouldn't be called with any other values */
- abort();
- }
-}
-
int qemu_rdma_registration_start(QEMUFile *f, uint64_t flags)
{
QIOChannelRDMA *rioc = QIO_CHANNEL_RDMA(qemu_file_get_ioc(f));
@@ -4007,7 +3997,6 @@ err:
}
static const QEMUFileHooks rdma_read_hooks = {
- .hook_ram_load = rdma_load_hook,
};
static const QEMUFileHooks rdma_write_hooks = {
diff --git a/migration/rdma.h b/migration/rdma.h
index 8d0253047c..1266a90e07 100644
--- a/migration/rdma.h
+++ b/migration/rdma.h
@@ -27,9 +27,11 @@ void rdma_start_incoming_migration(const char *host_port, Error **errp);
int qemu_rdma_registration_handle(QEMUFile *f);
int qemu_rdma_registration_start(QEMUFile *f, uint64_t flags);
int qemu_rdma_registration_stop(QEMUFile *f, uint64_t flags);
+int rdma_block_notification_handle(QEMUFile *f, const char *name);
#else
int qemu_rdma_registration_handle(QEMUFile *f) { return 0; }
int qemu_rdma_registration_start(QEMUFile *f, uint64_t flags) { return 0; }
int qemu_rdma_registration_stop(QEMUFile *f, uint64_t flags) { return 0; }
+int rdma_block_notification_handle(QEMUFile *f, const char *name) { return 0; }
#endif
#endif
--
2.40.0
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v2 11/16] migration/rdma: Make ram_control_save_page() use exported interfaces
2023-05-03 13:18 [PATCH v2 00/16] migration: Remove QEMUFileHooks Juan Quintela
` (9 preceding siblings ...)
2023-05-03 13:18 ` [PATCH v2 10/16] migration/rdma: Unfold hook_ram_load() Juan Quintela
@ 2023-05-03 13:18 ` Juan Quintela
2023-05-03 13:18 ` [PATCH v2 12/16] migration/rdma: Create rdma_control_save_page() Juan Quintela
` (4 subsequent siblings)
15 siblings, 0 replies; 20+ messages in thread
From: Juan Quintela @ 2023-05-03 13:18 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Xu, Juan Quintela, Leonardo Bras
Signed-off-by: Juan Quintela <quintela@redhat.com>
---
migration/qemu-file.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/migration/qemu-file.c b/migration/qemu-file.c
index 9d86900efe..17b3c2ea21 100644
--- a/migration/qemu-file.c
+++ b/migration/qemu-file.c
@@ -323,7 +323,7 @@ size_t ram_control_save_page(QEMUFile *f, ram_addr_t block_offset,
int ret = f->hooks->save_page(f, block_offset,
offset, size, bytes_sent);
if (ret != RAM_SAVE_CONTROL_NOT_SUPP) {
- f->rate_limit_used += size;
+ qemu_file_acct_rate_limit(f, size);
}
if (ret != RAM_SAVE_CONTROL_DELAYED &&
--
2.40.0
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v2 12/16] migration/rdma: Create rdma_control_save_page()
2023-05-03 13:18 [PATCH v2 00/16] migration: Remove QEMUFileHooks Juan Quintela
` (10 preceding siblings ...)
2023-05-03 13:18 ` [PATCH v2 11/16] migration/rdma: Make ram_control_save_page() use exported interfaces Juan Quintela
@ 2023-05-03 13:18 ` Juan Quintela
2023-05-03 13:18 ` [PATCH v2 13/16] qemu-file: Remove QEMUFileHooks Juan Quintela
` (3 subsequent siblings)
15 siblings, 0 replies; 20+ messages in thread
From: Juan Quintela @ 2023-05-03 13:18 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Xu, Juan Quintela, Leonardo Bras
The only user of ram_control_save_page() and save_page() hook was
rdma. Just move the function to rdma.c, rename it to
rdma_control_save_page().
Signed-off-by: Juan Quintela <quintela@redhat.com>
---
migration/qemu-file.c | 26 --------------------------
migration/qemu-file.h | 14 --------------
migration/ram.c | 4 ++--
migration/rdma.c | 26 +++++++++++++++++++++++++-
migration/rdma.h | 8 ++++++++
5 files changed, 35 insertions(+), 43 deletions(-)
diff --git a/migration/qemu-file.c b/migration/qemu-file.c
index 17b3c2ea21..8d3f33fe41 100644
--- a/migration/qemu-file.c
+++ b/migration/qemu-file.c
@@ -315,32 +315,6 @@ void qemu_fflush(QEMUFile *f)
f->iovcnt = 0;
}
-size_t ram_control_save_page(QEMUFile *f, ram_addr_t block_offset,
- ram_addr_t offset, size_t size,
- uint64_t *bytes_sent)
-{
- if (f->hooks && f->hooks->save_page) {
- int ret = f->hooks->save_page(f, block_offset,
- offset, size, bytes_sent);
- if (ret != RAM_SAVE_CONTROL_NOT_SUPP) {
- qemu_file_acct_rate_limit(f, size);
- }
-
- if (ret != RAM_SAVE_CONTROL_DELAYED &&
- ret != RAM_SAVE_CONTROL_NOT_SUPP) {
- if (bytes_sent && *bytes_sent > 0) {
- qemu_file_credit_transfer(f, *bytes_sent);
- } else if (ret < 0) {
- qemu_file_set_error(f, ret);
- }
- }
-
- return ret;
- }
-
- return RAM_SAVE_CONTROL_NOT_SUPP;
-}
-
/*
* Attempt to fill the buffer from the underlying file
* Returns the number of bytes read, or negative value for an error.
diff --git a/migration/qemu-file.h b/migration/qemu-file.h
index d69f5d65e8..ae3a704772 100644
--- a/migration/qemu-file.h
+++ b/migration/qemu-file.h
@@ -36,18 +36,7 @@
#define RAM_CONTROL_ROUND 1
#define RAM_CONTROL_FINISH 3
-/*
- * This function allows override of where the RAM page
- * is saved (such as RDMA, for example.)
- */
-typedef size_t (QEMURamSaveFunc)(QEMUFile *f,
- ram_addr_t block_offset,
- ram_addr_t offset,
- size_t size,
- uint64_t *bytes_sent);
-
typedef struct QEMUFileHooks {
- QEMURamSaveFunc *save_page;
} QEMUFileHooks;
QEMUFile *qemu_file_new_input(QIOChannel *ioc);
@@ -148,9 +137,6 @@ int qemu_file_get_to_fd(QEMUFile *f, int fd, size_t size);
#define RAM_SAVE_CONTROL_NOT_SUPP -1000
#define RAM_SAVE_CONTROL_DELAYED -2000
-size_t ram_control_save_page(QEMUFile *f, ram_addr_t block_offset,
- ram_addr_t offset, size_t size,
- uint64_t *bytes_sent);
QIOChannel *qemu_file_get_ioc(QEMUFile *file);
#endif
diff --git a/migration/ram.c b/migration/ram.c
index d29dd67d5f..a085ce8cae 100644
--- a/migration/ram.c
+++ b/migration/ram.c
@@ -1342,8 +1342,8 @@ static bool control_save_page(PageSearchStatus *pss, RAMBlock *block,
int ret;
*pages = -1;
- ret = ram_control_save_page(pss->pss_channel, block->offset, offset,
- TARGET_PAGE_SIZE, &bytes_xmit);
+ ret = rdma_control_save_page(pss->pss_channel, block->offset, offset,
+ TARGET_PAGE_SIZE, &bytes_xmit);
if (ret == RAM_SAVE_CONTROL_NOT_SUPP) {
return false;
}
diff --git a/migration/rdma.c b/migration/rdma.c
index a326606fd2..c984a2840a 100644
--- a/migration/rdma.c
+++ b/migration/rdma.c
@@ -3315,6 +3315,31 @@ err:
return ret;
}
+size_t rdma_control_save_page(QEMUFile *f, ram_addr_t block_offset,
+ ram_addr_t offset, size_t size,
+ uint64_t *bytes_sent)
+{
+ if (!migrate_rdma()) {
+ return RAM_SAVE_CONTROL_NOT_SUPP;
+ }
+
+ int ret = qemu_rdma_save_page(f, block_offset, offset, size, bytes_sent);
+ if (ret != RAM_SAVE_CONTROL_NOT_SUPP) {
+ qemu_file_acct_rate_limit(f, size);
+ }
+
+ if (ret != RAM_SAVE_CONTROL_DELAYED &&
+ ret != RAM_SAVE_CONTROL_NOT_SUPP) {
+ if (bytes_sent && *bytes_sent > 0) {
+ qemu_file_credit_transfer(f, *bytes_sent);
+ } else if (ret < 0) {
+ qemu_file_set_error(f, ret);
+ }
+ }
+ return ret;
+}
+
+
static void rdma_accept_incoming_migration(void *opaque);
static void rdma_cm_poll_handler(void *opaque)
@@ -4000,7 +4025,6 @@ static const QEMUFileHooks rdma_read_hooks = {
};
static const QEMUFileHooks rdma_write_hooks = {
- .save_page = qemu_rdma_save_page,
};
diff --git a/migration/rdma.h b/migration/rdma.h
index 1266a90e07..ed3650ef67 100644
--- a/migration/rdma.h
+++ b/migration/rdma.h
@@ -17,6 +17,8 @@
#ifndef QEMU_MIGRATION_RDMA_H
#define QEMU_MIGRATION_RDMA_H
+#include "exec/memory.h"
+
void rdma_start_outgoing_migration(void *opaque, const char *host_port,
Error **errp);
@@ -28,10 +30,16 @@ int qemu_rdma_registration_handle(QEMUFile *f);
int qemu_rdma_registration_start(QEMUFile *f, uint64_t flags);
int qemu_rdma_registration_stop(QEMUFile *f, uint64_t flags);
int rdma_block_notification_handle(QEMUFile *f, const char *name);
+size_t rdma_control_save_page(QEMUFile *f, ram_addr_t block_offset,
+ ram_addr_t offset, size_t size,
+ uint64_t *bytes_sent);
#else
int qemu_rdma_registration_handle(QEMUFile *f) { return 0; }
int qemu_rdma_registration_start(QEMUFile *f, uint64_t flags) { return 0; }
int qemu_rdma_registration_stop(QEMUFile *f, uint64_t flags) { return 0; }
int rdma_block_notification_handle(QEMUFile *f, const char *name) { return 0; }
+size_t rdma_control_save_page(QEMUFile *f, ram_addr_t block_offset,
+ ram_addr_t offset, size_t size,
+ uint64_t *bytes_sent) { return false; }
#endif
#endif
--
2.40.0
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v2 13/16] qemu-file: Remove QEMUFileHooks
2023-05-03 13:18 [PATCH v2 00/16] migration: Remove QEMUFileHooks Juan Quintela
` (11 preceding siblings ...)
2023-05-03 13:18 ` [PATCH v2 12/16] migration/rdma: Create rdma_control_save_page() Juan Quintela
@ 2023-05-03 13:18 ` Juan Quintela
2023-05-03 13:18 ` [PATCH v2 14/16] migration/rdma: Move rdma constants from qemu-file.h to rdma.h Juan Quintela
` (2 subsequent siblings)
15 siblings, 0 replies; 20+ messages in thread
From: Juan Quintela @ 2023-05-03 13:18 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Xu, Juan Quintela, Leonardo Bras
The only user was rdma, and its use is gone.
Signed-off-by: Juan Quintela <quintela@redhat.com>
---
migration/qemu-file.c | 6 ------
migration/qemu-file.h | 4 ----
migration/rdma.c | 9 ---------
3 files changed, 19 deletions(-)
diff --git a/migration/qemu-file.c b/migration/qemu-file.c
index 8d3f33fe41..c0c2195a6e 100644
--- a/migration/qemu-file.c
+++ b/migration/qemu-file.c
@@ -36,7 +36,6 @@
#define MAX_IOV_SIZE MIN_CONST(IOV_MAX, 64)
struct QEMUFile {
- const QEMUFileHooks *hooks;
QIOChannel *ioc;
bool is_writable;
@@ -160,11 +159,6 @@ QEMUFile *qemu_file_new_input(QIOChannel *ioc)
return qemu_file_new_impl(ioc, false);
}
-void qemu_file_set_hooks(QEMUFile *f, const QEMUFileHooks *hooks)
-{
- f->hooks = hooks;
-}
-
/*
* Get last error for stream f with optional Error*
*
diff --git a/migration/qemu-file.h b/migration/qemu-file.h
index ae3a704772..9c99914b21 100644
--- a/migration/qemu-file.h
+++ b/migration/qemu-file.h
@@ -36,12 +36,8 @@
#define RAM_CONTROL_ROUND 1
#define RAM_CONTROL_FINISH 3
-typedef struct QEMUFileHooks {
-} QEMUFileHooks;
-
QEMUFile *qemu_file_new_input(QIOChannel *ioc);
QEMUFile *qemu_file_new_output(QIOChannel *ioc);
-void qemu_file_set_hooks(QEMUFile *f, const QEMUFileHooks *hooks);
int qemu_fclose(QEMUFile *f);
/*
diff --git a/migration/rdma.c b/migration/rdma.c
index c984a2840a..78d8f5a199 100644
--- a/migration/rdma.c
+++ b/migration/rdma.c
@@ -4021,13 +4021,6 @@ err:
return ret;
}
-static const QEMUFileHooks rdma_read_hooks = {
-};
-
-static const QEMUFileHooks rdma_write_hooks = {
-};
-
-
static void qio_channel_rdma_finalize(Object *obj)
{
QIOChannelRDMA *rioc = QIO_CHANNEL_RDMA(obj);
@@ -4086,12 +4079,10 @@ static QEMUFile *qemu_fopen_rdma(RDMAContext *rdma, const char *mode)
rioc->file = qemu_file_new_output(QIO_CHANNEL(rioc));
rioc->rdmaout = rdma;
rioc->rdmain = rdma->return_path;
- qemu_file_set_hooks(rioc->file, &rdma_write_hooks);
} else {
rioc->file = qemu_file_new_input(QIO_CHANNEL(rioc));
rioc->rdmain = rdma;
rioc->rdmaout = rdma->return_path;
- qemu_file_set_hooks(rioc->file, &rdma_read_hooks);
}
return rioc->file;
--
2.40.0
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v2 14/16] migration/rdma: Move rdma constants from qemu-file.h to rdma.h
2023-05-03 13:18 [PATCH v2 00/16] migration: Remove QEMUFileHooks Juan Quintela
` (12 preceding siblings ...)
2023-05-03 13:18 ` [PATCH v2 13/16] qemu-file: Remove QEMUFileHooks Juan Quintela
@ 2023-05-03 13:18 ` Juan Quintela
2023-05-03 13:18 ` [PATCH v2 15/16] migration/rdma: Remove qemu_ prefix from exported functions Juan Quintela
2023-05-03 13:18 ` [PATCH v2 16/16] migration/rdma: If we are in postcopy don't do anything Juan Quintela
15 siblings, 0 replies; 20+ messages in thread
From: Juan Quintela @ 2023-05-03 13:18 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Xu, Juan Quintela, Leonardo Bras
Signed-off-by: Juan Quintela <quintela@redhat.com>
---
migration/qemu-file.h | 17 -----------------
migration/ram.c | 2 +-
migration/rdma.h | 16 ++++++++++++++++
3 files changed, 17 insertions(+), 18 deletions(-)
diff --git a/migration/qemu-file.h b/migration/qemu-file.h
index 9c99914b21..5129b6f196 100644
--- a/migration/qemu-file.h
+++ b/migration/qemu-file.h
@@ -29,13 +29,6 @@
#include "exec/cpu-common.h"
#include "io/channel.h"
-/*
- * Constants used by ram_control_* hooks
- */
-#define RAM_CONTROL_SETUP 0
-#define RAM_CONTROL_ROUND 1
-#define RAM_CONTROL_FINISH 3
-
QEMUFile *qemu_file_new_input(QIOChannel *ioc);
QEMUFile *qemu_file_new_output(QIOChannel *ioc);
int qemu_fclose(QEMUFile *f);
@@ -123,16 +116,6 @@ void qemu_fflush(QEMUFile *f);
void qemu_file_set_blocking(QEMUFile *f, bool block);
int qemu_file_get_to_fd(QEMUFile *f, int fd, size_t size);
-/* Whenever this is found in the data stream, the flags
- * will be passed to ram_control_load_hook in the incoming-migration
- * side. This lets before_ram_iterate/after_ram_iterate add
- * transport-specific sections to the RAM migration data.
- */
-#define RAM_SAVE_FLAG_HOOK 0x80
-
-#define RAM_SAVE_CONTROL_NOT_SUPP -1000
-#define RAM_SAVE_CONTROL_DELAYED -2000
-
QIOChannel *qemu_file_get_ioc(QEMUFile *file);
#endif
diff --git a/migration/ram.c b/migration/ram.c
index a085ce8cae..ac2296d740 100644
--- a/migration/ram.c
+++ b/migration/ram.c
@@ -86,7 +86,7 @@
#define RAM_SAVE_FLAG_EOS 0x10
#define RAM_SAVE_FLAG_CONTINUE 0x20
#define RAM_SAVE_FLAG_XBZRLE 0x40
-/* 0x80 is reserved in qemu-file.h for RAM_SAVE_FLAG_HOOK */
+/* 0x80 is reserved in rdma.h for RAM_SAVE_FLAG_HOOK */
#define RAM_SAVE_FLAG_COMPRESS_PAGE 0x100
#define RAM_SAVE_FLAG_MULTIFD_FLUSH 0x200
/* We can't use any flag that is bigger than 0x200 */
diff --git a/migration/rdma.h b/migration/rdma.h
index ed3650ef67..96ec2cc8f0 100644
--- a/migration/rdma.h
+++ b/migration/rdma.h
@@ -24,6 +24,22 @@ void rdma_start_outgoing_migration(void *opaque, const char *host_port,
void rdma_start_incoming_migration(const char *host_port, Error **errp);
+/*
+ * Constants used by rdma return codes
+ */
+#define RAM_CONTROL_SETUP 0
+#define RAM_CONTROL_ROUND 1
+#define RAM_CONTROL_FINISH 3
+
+/*
+ * Whenever this is found in the data stream, the flags
+ * will be passed to rdma functions in the incoming-migration
+ * side.
+ */
+#define RAM_SAVE_FLAG_HOOK 0x80
+
+#define RAM_SAVE_CONTROL_NOT_SUPP -1000
+#define RAM_SAVE_CONTROL_DELAYED -2000
#ifdef CONFIG_RDMA
int qemu_rdma_registration_handle(QEMUFile *f);
--
2.40.0
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v2 15/16] migration/rdma: Remove qemu_ prefix from exported functions
2023-05-03 13:18 [PATCH v2 00/16] migration: Remove QEMUFileHooks Juan Quintela
` (13 preceding siblings ...)
2023-05-03 13:18 ` [PATCH v2 14/16] migration/rdma: Move rdma constants from qemu-file.h to rdma.h Juan Quintela
@ 2023-05-03 13:18 ` Juan Quintela
2023-05-03 13:18 ` [PATCH v2 16/16] migration/rdma: If we are in postcopy don't do anything Juan Quintela
15 siblings, 0 replies; 20+ messages in thread
From: Juan Quintela @ 2023-05-03 13:18 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Xu, Juan Quintela, Leonardo Bras
Functions are long enough even without this.
Signed-off-by: Juan Quintela <quintela@redhat.com>
---
migration/ram.c | 14 +++++++-------
migration/rdma.c | 40 +++++++++++++++++++---------------------
migration/rdma.h | 12 ++++++------
migration/trace-events | 28 ++++++++++++++--------------
4 files changed, 46 insertions(+), 48 deletions(-)
diff --git a/migration/ram.c b/migration/ram.c
index ac2296d740..0694b9dfec 100644
--- a/migration/ram.c
+++ b/migration/ram.c
@@ -3278,12 +3278,12 @@ static int ram_save_setup(QEMUFile *f, void *opaque)
}
}
- ret = qemu_rdma_registration_start(f, RAM_CONTROL_SETUP);
+ ret = rdma_registration_start(f, RAM_CONTROL_SETUP);
if (ret < 0) {
qemu_file_set_error(f, ret);
}
- ret = qemu_rdma_registration_stop(f, RAM_CONTROL_SETUP);
+ ret = rdma_registration_stop(f, RAM_CONTROL_SETUP);
if (ret < 0) {
qemu_file_set_error(f, ret);
}
@@ -3345,7 +3345,7 @@ static int ram_save_iterate(QEMUFile *f, void *opaque)
/* Read version before ram_list.blocks */
smp_rmb();
- ret = qemu_rdma_registration_start(f, RAM_CONTROL_ROUND);
+ ret = rdma_registration_start(f, RAM_CONTROL_ROUND);
if (ret < 0) {
qemu_file_set_error(f, ret);
}
@@ -3405,7 +3405,7 @@ static int ram_save_iterate(QEMUFile *f, void *opaque)
* Must occur before EOS (or any QEMUFile operation)
* because of RDMA protocol.
*/
- ret = qemu_rdma_registration_stop(f, RAM_CONTROL_ROUND);
+ ret = rdma_registration_stop(f, RAM_CONTROL_ROUND);
if (ret < 0) {
qemu_file_set_error(f, ret);
}
@@ -3456,7 +3456,7 @@ static int ram_save_complete(QEMUFile *f, void *opaque)
migration_bitmap_sync_precopy(rs);
}
- ret = qemu_rdma_registration_start(f, RAM_CONTROL_FINISH);
+ ret = rdma_registration_start(f, RAM_CONTROL_FINISH);
if (ret < 0) {
qemu_file_set_error(f, ret);
}
@@ -3482,7 +3482,7 @@ static int ram_save_complete(QEMUFile *f, void *opaque)
flush_compressed_data(rs);
- int ret = qemu_rdma_registration_stop(f, RAM_CONTROL_FINISH);
+ int ret = rdma_registration_stop(f, RAM_CONTROL_FINISH);
if (ret < 0) {
qemu_file_set_error(f, ret);
}
@@ -4469,7 +4469,7 @@ static int ram_load_precopy(QEMUFile *f)
}
break;
case RAM_SAVE_FLAG_HOOK:
- ret = qemu_rdma_registration_handle(f);
+ ret = rdma_registration_handle(f);
if (ret < 0) {
qemu_file_set_error(f, ret);
}
diff --git a/migration/rdma.c b/migration/rdma.c
index 78d8f5a199..d6b4398620 100644
--- a/migration/rdma.c
+++ b/migration/rdma.c
@@ -3552,7 +3552,7 @@ static int dest_ram_sort_func(const void *a, const void *b)
*
* Keep doing this until the source tells us to stop.
*/
-int qemu_rdma_registration_handle(QEMUFile *f)
+int rdma_registration_handle(QEMUFile *f)
{
RDMAControlHeader reg_resp = { .len = sizeof(RDMARegisterResult),
.type = RDMA_CONTROL_REGISTER_RESULT,
@@ -3594,7 +3594,7 @@ int qemu_rdma_registration_handle(QEMUFile *f)
local = &rdma->local_ram_blocks;
do {
- trace_qemu_rdma_registration_handle_wait();
+ trace_rdma_registration_handle_wait();
ret = qemu_rdma_exchange_recv(rdma, &head, RDMA_CONTROL_NONE);
@@ -3614,9 +3614,9 @@ int qemu_rdma_registration_handle(QEMUFile *f)
comp = (RDMACompress *) rdma->wr_data[idx].control_curr;
network_to_compress(comp);
- trace_qemu_rdma_registration_handle_compress(comp->length,
- comp->block_idx,
- comp->offset);
+ trace_rdma_registration_handle_compress(comp->length,
+ comp->block_idx,
+ comp->offset);
if (comp->block_idx >= rdma->local_ram_blocks.nb_blocks) {
error_report("rdma: 'compress' bad block index %u (vs %d)",
(unsigned int)comp->block_idx,
@@ -3633,11 +3633,11 @@ int qemu_rdma_registration_handle(QEMUFile *f)
break;
case RDMA_CONTROL_REGISTER_FINISHED:
- trace_qemu_rdma_registration_handle_finished();
+ trace_rdma_registration_handle_finished();
goto out;
case RDMA_CONTROL_RAM_BLOCKS_REQUEST:
- trace_qemu_rdma_registration_handle_ram_blocks();
+ trace_rdma_registration_handle_ram_blocks();
/* Sort our local RAM Block list so it's the same as the source,
* we can do this since we've filled in a src_index in the list
@@ -3677,7 +3677,7 @@ int qemu_rdma_registration_handle(QEMUFile *f)
rdma->dest_blocks[i].length = local->block[i].length;
dest_block_to_network(&rdma->dest_blocks[i]);
- trace_qemu_rdma_registration_handle_ram_blocks_loop(
+ trace_rdma_registration_handle_ram_blocks_loop(
local->block[i].block_name,
local->block[i].offset,
local->block[i].length,
@@ -3699,7 +3699,7 @@ int qemu_rdma_registration_handle(QEMUFile *f)
break;
case RDMA_CONTROL_REGISTER_REQUEST:
- trace_qemu_rdma_registration_handle_register(head.repeat);
+ trace_rdma_registration_handle_register(head.repeat);
reg_resp.repeat = head.repeat;
registers = (RDMARegister *) rdma->wr_data[idx].control_curr;
@@ -3713,7 +3713,7 @@ int qemu_rdma_registration_handle(QEMUFile *f)
reg_result = &results[count];
- trace_qemu_rdma_registration_handle_register_loop(count,
+ trace_rdma_registration_handle_register_loop(count,
reg->current_index, reg->key.current_addr, reg->chunks);
if (reg->current_index >= rdma->local_ram_blocks.nb_blocks) {
@@ -3765,8 +3765,7 @@ int qemu_rdma_registration_handle(QEMUFile *f)
reg_result->host_addr = (uintptr_t)block->local_host_addr;
- trace_qemu_rdma_registration_handle_register_rkey(
- reg_result->rkey);
+ trace_rdma_registration_handle_register_rkey(reg_result->rkey);
result_to_network(reg_result);
}
@@ -3780,7 +3779,7 @@ int qemu_rdma_registration_handle(QEMUFile *f)
}
break;
case RDMA_CONTROL_UNREGISTER_REQUEST:
- trace_qemu_rdma_registration_handle_unregister(head.repeat);
+ trace_rdma_registration_handle_unregister(head.repeat);
unreg_resp.repeat = head.repeat;
registers = (RDMARegister *) rdma->wr_data[idx].control_curr;
@@ -3788,7 +3787,7 @@ int qemu_rdma_registration_handle(QEMUFile *f)
reg = ®isters[count];
network_to_register(reg);
- trace_qemu_rdma_registration_handle_unregister_loop(count,
+ trace_rdma_registration_handle_unregister_loop(count,
reg->current_index, reg->key.chunk);
block = &(rdma->local_ram_blocks.block[reg->current_index]);
@@ -3804,8 +3803,7 @@ int qemu_rdma_registration_handle(QEMUFile *f)
rdma->total_registrations--;
- trace_qemu_rdma_registration_handle_unregister_success(
- reg->key.chunk);
+ trace_rdma_registration_handle_unregister_success(reg->key.chunk);
}
ret = qemu_rdma_post_send_control(rdma, NULL, &unreg_resp);
@@ -3876,7 +3874,7 @@ int rdma_block_notification_handle(QEMUFile *f, const char *name)
return 0;
}
-int qemu_rdma_registration_start(QEMUFile *f, uint64_t flags)
+int rdma_registration_start(QEMUFile *f, uint64_t flags)
{
QIOChannelRDMA *rioc = QIO_CHANNEL_RDMA(qemu_file_get_ioc(f));
RDMAContext *rdma;
@@ -3897,7 +3895,7 @@ int qemu_rdma_registration_start(QEMUFile *f, uint64_t flags)
return 0;
}
- trace_qemu_rdma_registration_start(flags);
+ trace_rdma_registration_start(flags);
qemu_put_be64(f, RAM_SAVE_FLAG_HOOK);
qemu_fflush(f);
@@ -3908,7 +3906,7 @@ int qemu_rdma_registration_start(QEMUFile *f, uint64_t flags)
* Inform dest that dynamic registrations are done for now.
* First, flush writes, if any.
*/
-int qemu_rdma_registration_stop(QEMUFile *f, uint64_t flags)
+int rdma_registration_stop(QEMUFile *f, uint64_t flags)
{
QIOChannelRDMA *rioc = QIO_CHANNEL_RDMA(qemu_file_get_ioc(f));
RDMAContext *rdma;
@@ -3944,7 +3942,7 @@ int qemu_rdma_registration_stop(QEMUFile *f, uint64_t flags)
int reg_result_idx, i, nb_dest_blocks;
head.type = RDMA_CONTROL_RAM_BLOCKS_REQUEST;
- trace_qemu_rdma_registration_stop_ram();
+ trace_rdma_registration_stop_ram();
/*
* Make sure that we parallelize the pinning on both sides.
@@ -4006,7 +4004,7 @@ int qemu_rdma_registration_stop(QEMUFile *f, uint64_t flags)
}
}
- trace_qemu_rdma_registration_stop(flags);
+ trace_rdma_registration_stop(flags);
head.type = RDMA_CONTROL_REGISTER_FINISHED;
ret = qemu_rdma_exchange_send(rdma, &head, NULL, NULL, NULL, NULL);
diff --git a/migration/rdma.h b/migration/rdma.h
index 96ec2cc8f0..982063abc0 100644
--- a/migration/rdma.h
+++ b/migration/rdma.h
@@ -42,17 +42,17 @@ void rdma_start_incoming_migration(const char *host_port, Error **errp);
#define RAM_SAVE_CONTROL_DELAYED -2000
#ifdef CONFIG_RDMA
-int qemu_rdma_registration_handle(QEMUFile *f);
-int qemu_rdma_registration_start(QEMUFile *f, uint64_t flags);
-int qemu_rdma_registration_stop(QEMUFile *f, uint64_t flags);
+int rdma_registration_handle(QEMUFile *f);
+int rdma_registration_start(QEMUFile *f, uint64_t flags);
+int rdma_registration_stop(QEMUFile *f, uint64_t flags);
int rdma_block_notification_handle(QEMUFile *f, const char *name);
size_t rdma_control_save_page(QEMUFile *f, ram_addr_t block_offset,
ram_addr_t offset, size_t size,
uint64_t *bytes_sent);
#else
-int qemu_rdma_registration_handle(QEMUFile *f) { return 0; }
-int qemu_rdma_registration_start(QEMUFile *f, uint64_t flags) { return 0; }
-int qemu_rdma_registration_stop(QEMUFile *f, uint64_t flags) { return 0; }
+int rdma_registration_handle(QEMUFile *f) { return 0; }
+int rdma_registration_start(QEMUFile *f, uint64_t flags) { return 0; }
+int rdma_registration_stop(QEMUFile *f, uint64_t flags) { return 0; }
int rdma_block_notification_handle(QEMUFile *f, const char *name) { return 0; }
size_t rdma_control_save_page(QEMUFile *f, ram_addr_t block_offset,
ram_addr_t offset, size_t size,
diff --git a/migration/trace-events b/migration/trace-events
index 92161eeac5..7aa6d2b2fc 100644
--- a/migration/trace-events
+++ b/migration/trace-events
@@ -221,20 +221,6 @@ qemu_rdma_post_send_control(const char *desc) "CONTROL: sending %s.."
qemu_rdma_register_and_get_keys(uint64_t len, void *start) "Registering %" PRIu64 " bytes @ %p"
qemu_rdma_register_odp_mr(const char *name) "Try to register On-Demand Paging memory region: %s"
qemu_rdma_advise_mr(const char *name, uint32_t len, uint64_t addr, const char *res) "Try to advise block %s prefetch at %" PRIu32 "@0x%" PRIx64 ": %s"
-qemu_rdma_registration_handle_compress(int64_t length, int index, int64_t offset) "Zapping zero chunk: %" PRId64 " bytes, index %d, offset %" PRId64
-qemu_rdma_registration_handle_finished(void) ""
-qemu_rdma_registration_handle_ram_blocks(void) ""
-qemu_rdma_registration_handle_ram_blocks_loop(const char *name, uint64_t offset, uint64_t length, void *local_host_addr, unsigned int src_index) "%s: @0x%" PRIx64 "/%" PRIu64 " host:@%p src_index: %u"
-qemu_rdma_registration_handle_register(int requests) "%d requests"
-qemu_rdma_registration_handle_register_loop(int req, int index, uint64_t addr, uint64_t chunks) "Registration request (%d): index %d, current_addr %" PRIu64 " chunks: %" PRIu64
-qemu_rdma_registration_handle_register_rkey(int rkey) "0x%x"
-qemu_rdma_registration_handle_unregister(int requests) "%d requests"
-qemu_rdma_registration_handle_unregister_loop(int count, int index, uint64_t chunk) "Unregistration request (%d): index %d, chunk %" PRIu64
-qemu_rdma_registration_handle_unregister_success(uint64_t chunk) "%" PRIu64
-qemu_rdma_registration_handle_wait(void) ""
-qemu_rdma_registration_start(uint64_t flags) "%" PRIu64
-qemu_rdma_registration_stop(uint64_t flags) "%" PRIu64
-qemu_rdma_registration_stop_ram(void) ""
qemu_rdma_resolve_host_trying(const char *host, const char *ip) "Trying %s => %s"
qemu_rdma_signal_unregister_append(uint64_t chunk, int pos) "Appending unregister chunk %" PRIu64 " at position %d"
qemu_rdma_signal_unregister_already(uint64_t chunk) "Unregister chunk %" PRIu64 " already in queue"
@@ -253,6 +239,20 @@ qemu_rdma_write_one_zero(uint64_t chunk, int len, int index, int64_t offset) "En
rdma_add_block(const char *block_name, int block, uint64_t addr, uint64_t offset, uint64_t len, uint64_t end, uint64_t bits, int chunks) "Added Block: '%s':%d, addr: %" PRIu64 ", offset: %" PRIu64 " length: %" PRIu64 " end: %" PRIu64 " bits %" PRIu64 " chunks %d"
rdma_block_notification_handle(const char *name, int index) "%s at %d"
rdma_delete_block(void *block, uint64_t addr, uint64_t offset, uint64_t len, uint64_t end, uint64_t bits, int chunks) "Deleted Block: %p, addr: %" PRIu64 ", offset: %" PRIu64 " length: %" PRIu64 " end: %" PRIu64 " bits %" PRIu64 " chunks %d"
+rdma_registration_handle_compress(int64_t length, int index, int64_t offset) "Zapping zero chunk: %" PRId64 " bytes, index %d, offset %" PRId64
+rdma_registration_handle_finished(void) ""
+rdma_registration_handle_ram_blocks(void) ""
+rdma_registration_handle_ram_blocks_loop(const char *name, uint64_t offset, uint64_t length, void *local_host_addr, unsigned int src_index) "%s: @0x%" PRIx64 "/%" PRIu64 " host:@%p src_index: %u"
+rdma_registration_handle_register(int requests) "%d requests"
+rdma_registration_handle_register_loop(int req, int index, uint64_t addr, uint64_t chunks) "Registration request (%d): index %d, current_addr %" PRIu64 " chunks: %" PRIu64
+rdma_registration_handle_register_rkey(int rkey) "0x%x"
+rdma_registration_handle_unregister(int requests) "%d requests"
+rdma_registration_handle_unregister_loop(int count, int index, uint64_t chunk) "Unregistration request (%d): index %d, chunk %" PRIu64
+rdma_registration_handle_unregister_success(uint64_t chunk) "%" PRIu64
+rdma_registration_handle_wait(void) ""
+rdma_registration_start(uint64_t flags) "%" PRIu64
+rdma_registration_stop(uint64_t flags) "%" PRIu64
+rdma_registration_stop_ram(void) ""
rdma_start_incoming_migration(void) ""
rdma_start_incoming_migration_after_dest_init(void) ""
rdma_start_incoming_migration_after_rdma_listen(void) ""
--
2.40.0
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v2 16/16] migration/rdma: If we are in postcopy don't do anything
2023-05-03 13:18 [PATCH v2 00/16] migration: Remove QEMUFileHooks Juan Quintela
` (14 preceding siblings ...)
2023-05-03 13:18 ` [PATCH v2 15/16] migration/rdma: Remove qemu_ prefix from exported functions Juan Quintela
@ 2023-05-03 13:18 ` Juan Quintela
15 siblings, 0 replies; 20+ messages in thread
From: Juan Quintela @ 2023-05-03 13:18 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Xu, Juan Quintela, Leonardo Bras
Signed-off-by: Juan Quintela <quintela@redhat.com>
---
migration/rdma.c | 24 ++++++++++++------------
1 file changed, 12 insertions(+), 12 deletions(-)
diff --git a/migration/rdma.c b/migration/rdma.c
index d6b4398620..4bc9c5cb91 100644
--- a/migration/rdma.c
+++ b/migration/rdma.c
@@ -3243,10 +3243,6 @@ static size_t qemu_rdma_save_page(QEMUFile *f,
CHECK_ERROR_STATE();
- if (migration_in_postcopy()) {
- return RAM_SAVE_CONTROL_NOT_SUPP;
- }
-
qemu_fflush(f);
/*
@@ -3323,6 +3319,10 @@ size_t rdma_control_save_page(QEMUFile *f, ram_addr_t block_offset,
return RAM_SAVE_CONTROL_NOT_SUPP;
}
+ if (migration_in_postcopy()) {
+ return RAM_SAVE_CONTROL_NOT_SUPP;
+ }
+
int ret = qemu_rdma_save_page(f, block_offset, offset, size, bytes_sent);
if (ret != RAM_SAVE_CONTROL_NOT_SUPP) {
qemu_file_acct_rate_limit(f, size);
@@ -3883,6 +3883,10 @@ int rdma_registration_start(QEMUFile *f, uint64_t flags)
return 0;
}
+ if (migration_in_postcopy()) {
+ return 0;
+ }
+
RCU_READ_LOCK_GUARD();
rdma = qatomic_rcu_read(&rioc->rdmaout);
if (!rdma) {
@@ -3891,10 +3895,6 @@ int rdma_registration_start(QEMUFile *f, uint64_t flags)
CHECK_ERROR_STATE();
- if (migration_in_postcopy()) {
- return 0;
- }
-
trace_rdma_registration_start(flags);
qemu_put_be64(f, RAM_SAVE_FLAG_HOOK);
qemu_fflush(f);
@@ -3917,6 +3917,10 @@ int rdma_registration_stop(QEMUFile *f, uint64_t flags)
return 0;
}
+ if (migration_in_postcopy()) {
+ return 0;
+ }
+
RCU_READ_LOCK_GUARD();
rdma = qatomic_rcu_read(&rioc->rdmaout);
if (!rdma) {
@@ -3925,10 +3929,6 @@ int rdma_registration_stop(QEMUFile *f, uint64_t flags)
CHECK_ERROR_STATE();
- if (migration_in_postcopy()) {
- return 0;
- }
-
qemu_fflush(f);
ret = qemu_rdma_drain_cq(f, rdma);
--
2.40.0
^ permalink raw reply related [flat|nested] 20+ messages in thread
* Re: [PATCH v2 01/16] migration: Create migrate_rdma()
2023-05-03 13:18 ` [PATCH v2 01/16] migration: Create migrate_rdma() Juan Quintela
@ 2023-05-03 13:34 ` Daniel P. Berrangé
2023-05-03 14:01 ` Juan Quintela
0 siblings, 1 reply; 20+ messages in thread
From: Daniel P. Berrangé @ 2023-05-03 13:34 UTC (permalink / raw)
To: Juan Quintela; +Cc: qemu-devel, Peter Xu, Leonardo Bras
On Wed, May 03, 2023 at 03:18:32PM +0200, Juan Quintela wrote:
> Helper to say if we are doing a migration over rdma.
>
> Signed-off-by: Juan Quintela <quintela@redhat.com>
> ---
> migration/migration.h | 3 +++
> migration/options.c | 7 +++++++
> migration/options.h | 1 +
> migration/rdma.c | 4 +++-
> 4 files changed, 14 insertions(+), 1 deletion(-)
>
> diff --git a/migration/migration.h b/migration/migration.h
> index 3a918514e7..47fe116167 100644
> --- a/migration/migration.h
> +++ b/migration/migration.h
> @@ -432,6 +432,9 @@ struct MigrationState {
>
> /* QEMU_VM_VMDESCRIPTION content filled for all non-iterable devices. */
> JSONWriter *vmdesc;
> +
> + /* Is this a rdma migration */
> + bool rdma_migration;
> };
>
> void migrate_set_state(int *state, int old_state, int new_state);
> diff --git a/migration/options.c b/migration/options.c
> index 53b7fc5d5d..39843f9325 100644
> --- a/migration/options.c
> +++ b/migration/options.c
> @@ -349,6 +349,13 @@ bool migrate_postcopy(void)
> return migrate_postcopy_ram() || migrate_dirty_bitmaps();
> }
>
> +bool migrate_rdma(void)
> +{
> + MigrationState *s = migrate_get_current();
> +
> + return s->rdma_migration;
> +}
> +
> bool migrate_tls(void)
> {
> MigrationState *s = migrate_get_current();
> diff --git a/migration/options.h b/migration/options.h
> index 3c322867cd..3c555e28c7 100644
> --- a/migration/options.h
> +++ b/migration/options.h
> @@ -61,6 +61,7 @@ bool migrate_zero_copy_send(void);
>
> bool migrate_multifd_flush_after_each_section(void);
> bool migrate_postcopy(void);
> +bool migrate_rdma(void);
> bool migrate_tls(void);
>
> /* capabilities helpers */
> diff --git a/migration/rdma.c b/migration/rdma.c
> index 7e747b2595..b026e98519 100644
> --- a/migration/rdma.c
> +++ b/migration/rdma.c
> @@ -4119,6 +4119,7 @@ void rdma_start_incoming_migration(const char *host_port, Error **errp)
> int ret;
> RDMAContext *rdma;
> Error *local_err = NULL;
> + MigrationState *s = migrate_get_current();
>
> trace_rdma_start_incoming_migration();
>
> @@ -4149,7 +4150,7 @@ void rdma_start_incoming_migration(const char *host_port, Error **errp)
> }
>
> trace_rdma_start_incoming_migration_after_rdma_listen();
> -
> + s->rdma_migration = true;
> qemu_set_fd_handler(rdma->channel->fd, rdma_accept_incoming_migration,
> NULL, (void *)(intptr_t)rdma);
> return;
> @@ -4225,6 +4226,7 @@ void rdma_start_outgoing_migration(void *opaque,
>
> trace_rdma_start_outgoing_migration_after_rdma_connect();
>
> + s->rdma_migration = true;
> s->to_dst_file = qemu_fopen_rdma(rdma, "wb");
> migrate_fd_connect(s, NULL);
> return;
Is the "MigrationState" allocated freshly for every incoming
or outgoing migration ? If it is reused, then something
needs to set 's->rdma_migration = false' in non-RDMA code
paths.
With regards,
Daniel
--
|: https://berrange.com -o- https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o- https://fstop138.berrange.com :|
|: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH v2 05/16] migration/rdma: Don't pass the QIOChannelRDMA as an opaque
2023-05-03 13:18 ` [PATCH v2 05/16] migration/rdma: Don't pass the QIOChannelRDMA as an opaque Juan Quintela
@ 2023-05-03 13:35 ` Daniel P. Berrangé
0 siblings, 0 replies; 20+ messages in thread
From: Daniel P. Berrangé @ 2023-05-03 13:35 UTC (permalink / raw)
To: Juan Quintela; +Cc: qemu-devel, Peter Xu, Leonardo Bras
On Wed, May 03, 2023 at 03:18:36PM +0200, Juan Quintela wrote:
> We can calculate it from the QEMUFile like the caller.
>
> Signed-off-by: Juan Quintela <quintela@redhat.com>
> ---
> migration/rdma.c | 6 +++---
> 1 file changed, 3 insertions(+), 3 deletions(-)
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
With regards,
Daniel
--
|: https://berrange.com -o- https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o- https://fstop138.berrange.com :|
|: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH v2 01/16] migration: Create migrate_rdma()
2023-05-03 13:34 ` Daniel P. Berrangé
@ 2023-05-03 14:01 ` Juan Quintela
0 siblings, 0 replies; 20+ messages in thread
From: Juan Quintela @ 2023-05-03 14:01 UTC (permalink / raw)
To: Daniel P. Berrangé; +Cc: qemu-devel, Peter Xu, Leonardo Bras
Daniel P. Berrangé <berrange@redhat.com> wrote:
> On Wed, May 03, 2023 at 03:18:32PM +0200, Juan Quintela wrote:
>> Helper to say if we are doing a migration over rdma.
>
> Is the "MigrationState" allocated freshly for every incoming
> or outgoing migration ? If it is reused, then something
> needs to set 's->rdma_migration = false' in non-RDMA code
> paths.
for (i = 0; i < 1000; i++)
printf("never trust memory, check the code.\n");
You are right, the function that we call is:
migrate_init()
but we clear each statistic by hand, not a memset().
And now I have to review that we are not missing any other field to
reset.
Thanks, Juan.
^ permalink raw reply [flat|nested] 20+ messages in thread
end of thread, other threads:[~2023-05-03 14:01 UTC | newest]
Thread overview: 20+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-05-03 13:18 [PATCH v2 00/16] migration: Remove QEMUFileHooks Juan Quintela
2023-05-03 13:18 ` [PATCH v2 01/16] migration: Create migrate_rdma() Juan Quintela
2023-05-03 13:34 ` Daniel P. Berrangé
2023-05-03 14:01 ` Juan Quintela
2023-05-03 13:18 ` [PATCH v2 02/16] migration/rdma: Unfold ram_control_before_iterate() Juan Quintela
2023-05-03 13:18 ` [PATCH v2 03/16] migration/rdma: Unfold ram_control_after_iterate() Juan Quintela
2023-05-03 13:18 ` [PATCH v2 04/16] migration/rdma: simplify ram_control_load_hook() Juan Quintela
2023-05-03 13:18 ` [PATCH v2 05/16] migration/rdma: Don't pass the QIOChannelRDMA as an opaque Juan Quintela
2023-05-03 13:35 ` Daniel P. Berrangé
2023-05-03 13:18 ` [PATCH v2 06/16] migration/rdma: We can calculate the rioc from the QEMUFile Juan Quintela
2023-05-03 13:18 ` [PATCH v2 07/16] migration/rdma: It makes no sense to recive that flag without RDMA Juan Quintela
2023-05-03 13:18 ` [PATCH v2 08/16] migration: Make RAM_SAVE_FLAG_HOOK a normal case entry Juan Quintela
2023-05-03 13:18 ` [PATCH v2 09/16] migration/rdma: Remove all uses of RAM_CONTROL_HOOK Juan Quintela
2023-05-03 13:18 ` [PATCH v2 10/16] migration/rdma: Unfold hook_ram_load() Juan Quintela
2023-05-03 13:18 ` [PATCH v2 11/16] migration/rdma: Make ram_control_save_page() use exported interfaces Juan Quintela
2023-05-03 13:18 ` [PATCH v2 12/16] migration/rdma: Create rdma_control_save_page() Juan Quintela
2023-05-03 13:18 ` [PATCH v2 13/16] qemu-file: Remove QEMUFileHooks Juan Quintela
2023-05-03 13:18 ` [PATCH v2 14/16] migration/rdma: Move rdma constants from qemu-file.h to rdma.h Juan Quintela
2023-05-03 13:18 ` [PATCH v2 15/16] migration/rdma: Remove qemu_ prefix from exported functions Juan Quintela
2023-05-03 13:18 ` [PATCH v2 16/16] migration/rdma: If we are in postcopy don't do anything Juan Quintela
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.