On Tue, May 30, 2023 at 08:25:25PM +0200, Juan Quintela wrote: > Instead of going trhough ram_control_load_hook(), call > qemu_rdma_registration_handle() directly. > > Reviewed-by: Peter Xu <pet...@redhat.com> > Signed-off-by: Juan Quintela <quint...@redhat.com> > Message-Id: <20230509120700.78359-5-quint...@redhat.com> > --- > migration/qemu-file.h | 1 - > migration/rdma.h | 3 +++ > migration/ram.c | 5 ++++- > migration/rdma.c | 9 +++++---- > 4 files changed, 12 insertions(+), 6 deletions(-) > > diff --git a/migration/qemu-file.h b/migration/qemu-file.h > index 323af5682f..7cfc20825e 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/rdma.h b/migration/rdma.h > index c13b94c782..8bd277efb9 100644 > --- a/migration/rdma.h > +++ b/migration/rdma.h > @@ -24,10 +24,13 @@ 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 > static inline > +int qemu_rdma_registration_handle(QEMUFile *f) { return 0; } > +static inline > int qemu_rdma_registration_start(QEMUFile *f, uint64_t flags) { return 0; } > static inline > int qemu_rdma_registration_stop(QEMUFile *f, uint64_t flags) { return 0; } > diff --git a/migration/ram.c b/migration/ram.c > index c6fad7b0b3..6f0597814c 100644 > --- a/migration/ram.c > +++ b/migration/ram.c > @@ -4024,7 +4024,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 8001dcb960..a477985c6d 100644 > --- a/migration/rdma.c > +++ b/migration/rdma.c > @@ -3530,7 +3530,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, > @@ -3557,6 +3557,10 @@ static int qemu_rdma_registration_handle(QEMUFile *f)
A few lines above this diff contxt there is a call to QIOChannelRDMA *rioc = QIO_CHANNEL_RDMA(qemu_file_get_ioc(f)); which is likely unsafe given that.... > int count = 0; > int i = 0; > > + if (!migrate_rdma()) { ....we're only checking if this is RDMA here. > + return 0; > + } > + > RCU_READ_LOCK_GUARD(); > rdma = qatomic_rcu_read(&rioc->rdmain); > 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 :|