Peter Xu <[email protected]> writes:
> On Fri, Dec 26, 2025 at 06:19:24PM -0300, Fabiano Rosas wrote:
>> Now that everything is in channel.c, it's easier to browse this code
>> if it's all in the same place. It's also easier to grasp what the
>> connection flow is if both sides of the connection are close together.
>>
>> Signed-off-by: Fabiano Rosas <[email protected]>
>> ---
>> migration/channel.c | 86 +++++++++++++++++++++++----------------------
>> migration/channel.h | 14 ++++++--
>> 2 files changed, 56 insertions(+), 44 deletions(-)
>>
>> diff --git a/migration/channel.c b/migration/channel.c
>> index 042e01b224..ba9aa1c58b 100644
>> --- a/migration/channel.c
>> +++ b/migration/channel.c
>> @@ -31,10 +31,11 @@
>> #include "trace.h"
>> #include "yank_functions.h"
>>
>> -bool migration_connect_outgoing(MigrationAddress *addr, Error **errp)
>> +bool migration_connect(MigrationAddress *addr, bool out, Error **errp)
>> {
>> g_autoptr(QIOChannel) ioc = NULL;
>> SocketAddress *saddr;
>> + ERRP_GUARD();
>>
>> switch (addr->transport) {
>> case MIGRATION_ADDRESS_TYPE_SOCKET:
>> @@ -44,15 +45,24 @@ bool migration_connect_outgoing(MigrationAddress *addr,
>> Error **errp)
>> case SOCKET_ADDRESS_TYPE_INET:
>> case SOCKET_ADDRESS_TYPE_UNIX:
>> case SOCKET_ADDRESS_TYPE_VSOCK:
>> - socket_connect_outgoing(saddr, errp);
>> - /*
>> - * async: after the socket is connected, calls
>> - * migration_channel_connect_outgoing() directly.
>> - */
>> - return true;
>> + if (out) {
>
> Personally I wouldn't suggest we merge the outgoing / incoming with
> migration_connect() then split paths once more in this exact function.
>
> I got this conclusion when I started to count how many "if (out)" are
> there.. When there're too much, it may imply we need to think more..
>
Well, compared to before, there 50% less "if (addr->transport == ...)",
this is top level programming! =D
This part of the series is highly subjective, if there's a patch you
don't like it we can drop it, let's not dwell on it.. Just read my words
below on the previous patch, which I think you may be mistaken about.
> This also answers part of my confusion when reading the previous patch - if
> that was only paving way for this one, IMHO it may not be as worthwhile,
> and I would tend to avoid both.
>
Patch 21 is just a cleanup after patch 19 moves the call to
migration_channel_connect_outgoing from being inside the transport
routines to this top level here at migration_connect(), which moves the
places where MigrationState is used as well. So it removes unused
passing of MigrationState along with the SocketConnectionData.
> Thoughts?
>
>> + socket_connect_outgoing(saddr, errp);
>> + /*
>> + * async: after the socket is connected, calls
>> + * migration_channel_connect_outgoing() directly.
>> + */
>> + return true;
>> + } else {
>> + socket_connect_incoming(saddr, errp);
>> + }
>> +
>> break;
>> case SOCKET_ADDRESS_TYPE_FD:
>> - ioc = fd_connect_outgoing(saddr->u.fd.str, errp);
>> + if (out) {
>> + ioc = fd_connect_outgoing(saddr->u.fd.str, errp);
>> + } else {
>> + fd_connect_incoming(saddr->u.fd.str, errp);
>> + }
>> break;
>> default:
>> g_assert_not_reached();
>> @@ -62,16 +72,28 @@ bool migration_connect_outgoing(MigrationAddress *addr,
>> Error **errp)
>>
>> #ifdef CONFIG_RDMA
>> case MIGRATION_ADDRESS_TYPE_RDMA:
>> - ioc = rdma_connect_outgoing(&addr->u.rdma, errp);
>> + if (out) {
>> + ioc = rdma_connect_outgoing(&addr->u.rdma, errp);
>> + } else {
>> + rdma_connect_incoming(&addr->u.rdma, errp);
>> + }
>> break;
>> #endif
>>
>> case MIGRATION_ADDRESS_TYPE_EXEC:
>> - ioc = exec_connect_outgoing(addr->u.exec.args, errp);
>> + if (out) {
>> + ioc = exec_connect_outgoing(addr->u.exec.args, errp);
>> + } else {
>> + exec_connect_incoming(addr->u.exec.args, errp);
>> + }
>> break;
>>
>> case MIGRATION_ADDRESS_TYPE_FILE:
>> - ioc = file_connect_outgoing(&addr->u.file, errp);
>> + if (out) {
>> + ioc = file_connect_outgoing(&addr->u.file, errp);
>> + } else {
>> + file_connect_incoming(&addr->u.file, errp);
>> + }
>> break;
>>
>> default:
>> @@ -79,42 +101,22 @@ bool migration_connect_outgoing(MigrationAddress *addr,
>> Error **errp)
>> break;
>> }
>>
>> - if (!ioc) {
>> - return false;
>> - }
>> -
>> - migration_channel_connect_outgoing(ioc);
>> - return true;
>> -}
>> -
>> -void migration_connect_incoming(MigrationAddress *addr, Error **errp)
>> -{
>> - if (addr->transport == MIGRATION_ADDRESS_TYPE_SOCKET) {
>> - SocketAddress *saddr = &addr->u.socket;
>> - if (saddr->type == SOCKET_ADDRESS_TYPE_INET ||
>> - saddr->type == SOCKET_ADDRESS_TYPE_UNIX ||
>> - saddr->type == SOCKET_ADDRESS_TYPE_VSOCK) {
>> - socket_connect_incoming(saddr, errp);
>> - } else if (saddr->type == SOCKET_ADDRESS_TYPE_FD) {
>> - fd_connect_incoming(saddr->u.fd.str, errp);
>> + if (out) {
>> + if (!ioc) {
>> + return false;
>> }
>> -#ifdef CONFIG_RDMA
>> - } else if (addr->transport == MIGRATION_ADDRESS_TYPE_RDMA) {
>> - rdma_connect_incoming(&addr->u.rdma, errp);
>> -#endif
>> - } else if (addr->transport == MIGRATION_ADDRESS_TYPE_EXEC) {
>> - exec_connect_incoming(addr->u.exec.args, errp);
>> - } else if (addr->transport == MIGRATION_ADDRESS_TYPE_FILE) {
>> - file_connect_incoming(&addr->u.file, errp);
>> - } else {
>> - error_setg(errp, "unknown migration protocol");
>> +
>> + migration_channel_connect_outgoing(ioc);
>> + return true;
>> }
>>
>> /*
>> - * async: the above routines all wait for the incoming connection
>> - * and call back to migration_channel_process_incoming() to start
>> - * the migration.
>> + * async: on the incoming side all of the transport routines above
>> + * wait for the incoming connection and call back to
>> + * migration_channel_process_incoming() to start the migration.
>> */
>> +
>> + return !*errp;
>> }
>>
>> bool migration_has_main_and_multifd_channels(void)
>> diff --git a/migration/channel.h b/migration/channel.h
>> index 8cf16bfda9..86934fee38 100644
>> --- a/migration/channel.h
>> +++ b/migration/channel.h
>> @@ -39,6 +39,16 @@ int migration_channel_read_peek(QIOChannel *ioc,
>> bool migration_has_main_and_multifd_channels(void);
>> bool migration_has_all_channels(void);
>>
>> -bool migration_connect_outgoing(MigrationAddress *addr, Error **errp);
>> -void migration_connect_incoming(MigrationAddress *addr, Error **errp);
>> +bool migration_connect(MigrationAddress *addr, bool out, Error **errp);
>> +static inline bool migration_connect_outgoing(MigrationAddress *addr,
>> + Error **errp)
>> +{
>> + return migration_connect(addr, true, errp);
>> +}
>> +
>> +static inline bool migration_connect_incoming(MigrationAddress *addr,
>> + Error **errp)
>> +{
>> + return migration_connect(addr, false, errp);
>> +}
>> #endif
>> --
>> 2.51.0
>>