* Peter Xu (pet...@redhat.com) wrote: > The old incoming migration is running in main thread and default > gcontext. With the new qio_channel_add_watch_full() we can now let it > run in the thread's own gcontext (if there is one). > > Currently this patch does nothing alone. But when any of the incoming > migration is run in another iothread (e.g., the upcoming migrate-recover > command), this patch will bind the incoming logic to the iothread > instead of the main thread (which may already get page faulted and > hanged). > > RDMA is not considered for now since it's not even using the QIO watch > framework at all.
> CC: Juan Quintela <quint...@redhat.com> > CC: Dr. David Alan Gilbert <dgilb...@redhat.com> > CC: Laurent Vivier <lviv...@redhat.com> > Signed-off-by: Peter Xu <pet...@redhat.com> Reviewed-by: Dr. David Alan Gilbert <dgilb...@redhat.com> > --- > migration/exec.c | 9 ++++----- > migration/fd.c | 9 ++++----- > migration/socket.c | 10 +++++----- > 3 files changed, 13 insertions(+), 15 deletions(-) > > diff --git a/migration/exec.c b/migration/exec.c > index 0bc5a427dd..9d0f82f1f0 100644 > --- a/migration/exec.c > +++ b/migration/exec.c > @@ -65,9 +65,8 @@ void exec_start_incoming_migration(const char *command, > Error **errp) > } > > qio_channel_set_name(ioc, "migration-exec-incoming"); > - qio_channel_add_watch(ioc, > - G_IO_IN, > - exec_accept_incoming_migration, > - NULL, > - NULL); > + qio_channel_add_watch_full(ioc, G_IO_IN, > + exec_accept_incoming_migration, > + NULL, NULL, > + g_main_context_get_thread_default()); > } > diff --git a/migration/fd.c b/migration/fd.c > index cd06182d1e..9a380bbbc4 100644 > --- a/migration/fd.c > +++ b/migration/fd.c > @@ -66,9 +66,8 @@ void fd_start_incoming_migration(const char *infd, Error > **errp) > } > > qio_channel_set_name(QIO_CHANNEL(ioc), "migration-fd-incoming"); > - qio_channel_add_watch(ioc, > - G_IO_IN, > - fd_accept_incoming_migration, > - NULL, > - NULL); > + qio_channel_add_watch_full(ioc, G_IO_IN, > + fd_accept_incoming_migration, > + NULL, NULL, > + g_main_context_get_thread_default()); > } > diff --git a/migration/socket.c b/migration/socket.c > index 8a93fb1af5..91071b06ef 100644 > --- a/migration/socket.c > +++ b/migration/socket.c > @@ -174,11 +174,11 @@ static void > socket_start_incoming_migration(SocketAddress *saddr, > return; > } > > - qio_channel_add_watch(QIO_CHANNEL(listen_ioc), > - G_IO_IN, > - socket_accept_incoming_migration, > - listen_ioc, > - (GDestroyNotify)object_unref); > + qio_channel_add_watch_full(QIO_CHANNEL(listen_ioc), G_IO_IN, > + socket_accept_incoming_migration, > + listen_ioc, > + (GDestroyNotify)object_unref, > + g_main_context_get_thread_default()); > } > > void tcp_start_incoming_migration(const char *host_port, Error **errp) > -- > 2.14.3 > -- Dr. David Alan Gilbert / dgilb...@redhat.com / Manchester, UK