get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/2177618/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 2177618,
    "url": "http://patchwork.ozlabs.org/api/patches/2177618/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20251226211930.27565-22-farosas@suse.de/",
    "project": {
        "id": 14,
        "url": "http://patchwork.ozlabs.org/api/projects/14/?format=api",
        "name": "QEMU Development",
        "link_name": "qemu-devel",
        "list_id": "qemu-devel.nongnu.org",
        "list_email": "qemu-devel@nongnu.org",
        "web_url": "",
        "scm_url": "",
        "webscm_url": "",
        "list_archive_url": "",
        "list_archive_url_format": "",
        "commit_url_format": ""
    },
    "msgid": "<20251226211930.27565-22-farosas@suse.de>",
    "list_archive_url": null,
    "date": "2025-12-26T21:19:23",
    "name": "[RFC,21/25] migration/channel: Cleanup early passing of MigrationState",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "7e166687cc04b98fbc7694afffd2163735729687",
    "submitter": {
        "id": 85343,
        "url": "http://patchwork.ozlabs.org/api/people/85343/?format=api",
        "name": "Fabiano Rosas",
        "email": "farosas@suse.de"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20251226211930.27565-22-farosas@suse.de/mbox/",
    "series": [
        {
            "id": 486505,
            "url": "http://patchwork.ozlabs.org/api/series/486505/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/list/?series=486505",
            "date": "2025-12-26T21:19:04",
            "name": "migration: Cleanup early connection code",
            "version": 1,
            "mbox": "http://patchwork.ozlabs.org/series/486505/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/2177618/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/2177618/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>",
        "X-Original-To": "incoming@patchwork.ozlabs.org",
        "Delivered-To": "patchwork-incoming@legolas.ozlabs.org",
        "Authentication-Results": [
            "legolas.ozlabs.org;\n\tdkim=pass (1024-bit key;\n unprotected) header.d=suse.de header.i=@suse.de header.a=rsa-sha256\n header.s=susede2_rsa header.b=tBNSfkeb;\n\tdkim=pass header.d=suse.de header.i=@suse.de header.a=ed25519-sha256\n header.s=susede2_ed25519 header.b=wOMLW15W;\n\tdkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de\n header.a=rsa-sha256 header.s=susede2_rsa header.b=H2AV6mwA;\n\tdkim=neutral header.d=suse.de header.i=@suse.de header.a=ed25519-sha256\n header.s=susede2_ed25519 header.b=vvRvfmei;\n\tdkim-atps=neutral",
            "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org\n (client-ip=209.51.188.17; helo=lists.gnu.org;\n envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n receiver=patchwork.ozlabs.org)",
            "smtp-out2.suse.de;\n dkim=pass header.d=suse.de header.s=susede2_rsa header.b=H2AV6mwA;\n dkim=pass header.d=suse.de header.s=susede2_ed25519 header.b=vvRvfmei"
        ],
        "Received": [
            "from lists.gnu.org (lists.gnu.org [209.51.188.17])\n\t(using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4ddJTQ0YwWz1y41\n\tfor <incoming@patchwork.ozlabs.org>; Sat, 27 Dec 2025 08:21:46 +1100 (AEDT)",
            "from localhost ([::1] helo=lists1p.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.90_1)\n\t(envelope-from <qemu-devel-bounces@nongnu.org>)\n\tid 1vZFF9-0003BS-Pj; Fri, 26 Dec 2025 16:21:03 -0500",
            "from eggs.gnu.org ([2001:470:142:3::10])\n by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <farosas@suse.de>) id 1vZFF8-00036C-4R\n for qemu-devel@nongnu.org; Fri, 26 Dec 2025 16:21:02 -0500",
            "from smtp-out2.suse.de ([2a07:de40:b251:101:10:150:64:2])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)\n (Exim 4.90_1) (envelope-from <farosas@suse.de>) id 1vZFF5-0004Kb-EW\n for qemu-devel@nongnu.org; Fri, 26 Dec 2025 16:21:01 -0500",
            "from imap1.dmz-prg2.suse.org (imap1.dmz-prg2.suse.org\n [IPv6:2a07:de40:b281:104:10:150:64:97])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest\n SHA256)\n (No client certificate requested)\n by smtp-out2.suse.de (Postfix) with ESMTPS id E907B5BCE9;\n Fri, 26 Dec 2025 21:20:09 +0000 (UTC)",
            "from imap1.dmz-prg2.suse.org (localhost [127.0.0.1])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest\n SHA256)\n (No client certificate requested)\n by imap1.dmz-prg2.suse.org (Postfix) with ESMTPS id 9F7793EA63;\n Fri, 26 Dec 2025 21:20:08 +0000 (UTC)",
            "from dovecot-director2.suse.de ([2a07:de40:b281:106:10:150:64:167])\n by imap1.dmz-prg2.suse.org with ESMTPSA id WOzfFwj8TmnwJwAAD6G6ig\n (envelope-from <farosas@suse.de>); Fri, 26 Dec 2025 21:20:08 +0000"
        ],
        "DKIM-Signature": [
            "v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de;\n s=susede2_rsa;\n t=1766784011;\n h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc:\n mime-version:mime-version:\n content-transfer-encoding:content-transfer-encoding:\n in-reply-to:in-reply-to:references:references;\n bh=jflGzj1VlA3/aYurEwO1N3ZJH8+WAr4qnfdqpovhE/c=;\n b=tBNSfkeb7nMpeW2CvuwDIAB0GMiEY3cCst7ndSQiO+YFAmI5+9y+jG9vDRKDqpzZqQdSND\n fipq4azF6C3AoWb2V9Z/efyZwlmyEj12acxfvVxpHxOVLsG+ipwrdxchSijaixibzNCadi\n yL3NbO6rHojvZYDNXhbXjolMoA91Bso=",
            "v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de;\n s=susede2_ed25519; t=1766784011;\n h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc:\n mime-version:mime-version:\n content-transfer-encoding:content-transfer-encoding:\n in-reply-to:in-reply-to:references:references;\n bh=jflGzj1VlA3/aYurEwO1N3ZJH8+WAr4qnfdqpovhE/c=;\n b=wOMLW15WA6kcaOPsfRO3gWJFn+YNLY/0jtdRt1yys/83UyjULM+senVuiYPmc7yE5jL7gH\n h2Ikn7iONuSN4zCA==",
            "v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de;\n s=susede2_rsa;\n t=1766784009;\n h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc:\n mime-version:mime-version:\n content-transfer-encoding:content-transfer-encoding:\n in-reply-to:in-reply-to:references:references;\n bh=jflGzj1VlA3/aYurEwO1N3ZJH8+WAr4qnfdqpovhE/c=;\n b=H2AV6mwA4fRxgZ68jTp7/ZR4dr6VdHbb5mwLpaXfWeRy2tloe14NgDlVwhin+YTV+ZlVQe\n YRpULoU7at0n/1Rg04tesIBWz/wvS04VXLgwyT2k/2iAiphq3Lmz3+NS2hMeVwwJoXC0U8\n xV37agExkP5Gp11J8DUpOw2J9A2j6Xw=",
            "v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de;\n s=susede2_ed25519; t=1766784009;\n h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc:\n mime-version:mime-version:\n content-transfer-encoding:content-transfer-encoding:\n in-reply-to:in-reply-to:references:references;\n bh=jflGzj1VlA3/aYurEwO1N3ZJH8+WAr4qnfdqpovhE/c=;\n b=vvRvfmeiTwsdmkzZsj/CB8ltSnFzWH/6JqG+5XLVcaYw08cdOJ6XfZwint3wSOkmvO3vH8\n nlV8YMx9OjFajkDw=="
        ],
        "From": "Fabiano Rosas <farosas@suse.de>",
        "To": "qemu-devel@nongnu.org",
        "Cc": "peterx@redhat.com,\n\tLi Zhijian <lizhijian@fujitsu.com>",
        "Subject": "[RFC PATCH 21/25] migration/channel: Cleanup early passing of\n MigrationState",
        "Date": "Fri, 26 Dec 2025 18:19:23 -0300",
        "Message-ID": "<20251226211930.27565-22-farosas@suse.de>",
        "X-Mailer": "git-send-email 2.51.0",
        "In-Reply-To": "<20251226211930.27565-1-farosas@suse.de>",
        "References": "<20251226211930.27565-1-farosas@suse.de>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "X-Spamd-Result": "default: False [-3.01 / 50.00]; BAYES_HAM(-3.00)[100.00%];\n MID_CONTAINS_FROM(1.00)[]; NEURAL_HAM_LONG(-1.00)[-1.000];\n R_MISSING_CHARSET(0.50)[];\n R_DKIM_ALLOW(-0.20)[suse.de:s=susede2_rsa,suse.de:s=susede2_ed25519];\n NEURAL_HAM_SHORT(-0.20)[-1.000]; MIME_GOOD(-0.10)[text/plain];\n MX_GOOD(-0.01)[];\n DBL_BLOCKED_OPENRESOLVER(0.00)[suse.de:email,suse.de:dkim,suse.de:mid,imap1.dmz-prg2.suse.org:helo,imap1.dmz-prg2.suse.org:rdns];\n FROM_HAS_DN(0.00)[]; ARC_NA(0.00)[]; MIME_TRACE(0.00)[0:+];\n SPAMHAUS_XBL(0.00)[2a07:de40:b281:104:10:150:64:97:from];\n TO_DN_SOME(0.00)[]; TO_MATCH_ENVRCPT_ALL(0.00)[];\n RCVD_VIA_SMTP_AUTH(0.00)[]; FROM_EQ_ENVFROM(0.00)[];\n DKIM_SIGNED(0.00)[suse.de:s=susede2_rsa,suse.de:s=susede2_ed25519];\n FUZZY_RATELIMITED(0.00)[rspamd.com]; RCVD_COUNT_TWO(0.00)[2];\n RCVD_TLS_ALL(0.00)[]; RCPT_COUNT_THREE(0.00)[3];\n DKIM_TRACE(0.00)[suse.de:+]",
        "X-Rspamd-Action": "no action",
        "X-Rspamd-Server": "rspamd2.dmz-prg2.suse.org",
        "X-Rspamd-Queue-Id": "E907B5BCE9",
        "X-Spam-Score": "-3.01",
        "Received-SPF": "pass client-ip=2a07:de40:b251:101:10:150:64:2;\n envelope-from=farosas@suse.de; helo=smtp-out2.suse.de",
        "X-Spam_score_int": "-20",
        "X-Spam_score": "-2.1",
        "X-Spam_bar": "--",
        "X-Spam_report": "(-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1,\n DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001,\n SPF_PASS=-0.001 autolearn=ham autolearn_force=no",
        "X-Spam_action": "no action",
        "X-BeenThere": "qemu-devel@nongnu.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "<qemu-devel.nongnu.org>",
        "List-Unsubscribe": "<https://lists.nongnu.org/mailman/options/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>",
        "List-Archive": "<https://lists.nongnu.org/archive/html/qemu-devel>",
        "List-Post": "<mailto:qemu-devel@nongnu.org>",
        "List-Help": "<mailto:qemu-devel-request@nongnu.org?subject=help>",
        "List-Subscribe": "<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=subscribe>",
        "Errors-To": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org",
        "Sender": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org"
    },
    "content": "MigrationState is being passed around quite a lot, but there are not\nmany actual users. Reduce the passing around by converting some key\nfunctions to use migrate_get_current(). Although this goes against the\ngeneral direction of not using migrate_get_current(), doing this helps\nto isolate the places that actually need MigrationState and could\nfacilitate future cleanups.\n\nIn the early connection code, qmp_migrate() needs MigrationState only\nto make sure it reaches:\n\n  migrate_prepare()\n  migrate_hup_add()\n  migration_start_outgoing()\n  migration_connect_error_propagate()\n\nThe first two are at the top level, so are trivial to change. The last\ntwo actually require passing 's' around between several functions,\nmaking the code way more complex than it needs to be.\n\nSigned-off-by: Fabiano Rosas <farosas@suse.de>\n---\n migration/channel.c   | 21 +++++++++----------\n migration/channel.h   |  5 ++---\n migration/exec.c      |  3 +--\n migration/exec.h      |  3 +--\n migration/fd.c        |  3 +--\n migration/fd.h        |  3 +--\n migration/file.c      |  3 +--\n migration/file.h      |  3 +--\n migration/migration.c | 49 +++++++++++++++++++++++--------------------\n migration/migration.h |  4 ++--\n migration/rdma.c      |  5 ++---\n migration/rdma.h      |  3 +--\n migration/socket.c    | 32 +++++++---------------------\n migration/socket.h    |  3 +--\n migration/tls.c       | 11 +++++-----\n migration/tls.h       |  2 +-\n 16 files changed, 63 insertions(+), 90 deletions(-)",
    "diff": "diff --git a/migration/channel.c b/migration/channel.c\nindex 2f33cb2653..042e01b224 100644\n--- a/migration/channel.c\n+++ b/migration/channel.c\n@@ -31,8 +31,7 @@\n #include \"trace.h\"\n #include \"yank_functions.h\"\n \n-bool migration_connect_outgoing(MigrationState *s, MigrationAddress *addr,\n-                                Error **errp)\n+bool migration_connect_outgoing(MigrationAddress *addr, Error **errp)\n {\n     g_autoptr(QIOChannel) ioc = NULL;\n     SocketAddress *saddr;\n@@ -45,7 +44,7 @@ bool migration_connect_outgoing(MigrationState *s, MigrationAddress *addr,\n         case SOCKET_ADDRESS_TYPE_INET:\n         case SOCKET_ADDRESS_TYPE_UNIX:\n         case SOCKET_ADDRESS_TYPE_VSOCK:\n-            socket_connect_outgoing(s, saddr, errp);\n+            socket_connect_outgoing(saddr, errp);\n             /*\n              * async: after the socket is connected, calls\n              * migration_channel_connect_outgoing() directly.\n@@ -53,7 +52,7 @@ bool migration_connect_outgoing(MigrationState *s, MigrationAddress *addr,\n             return true;\n             break;\n         case SOCKET_ADDRESS_TYPE_FD:\n-            ioc = fd_connect_outgoing(s, saddr->u.fd.str, errp);\n+            ioc = fd_connect_outgoing(saddr->u.fd.str, errp);\n             break;\n         default:\n             g_assert_not_reached();\n@@ -63,16 +62,16 @@ bool migration_connect_outgoing(MigrationState *s, MigrationAddress *addr,\n \n #ifdef CONFIG_RDMA\n     case MIGRATION_ADDRESS_TYPE_RDMA:\n-        ioc = rdma_connect_outgoing(s, &addr->u.rdma, errp);\n+        ioc = rdma_connect_outgoing(&addr->u.rdma, errp);\n         break;\n #endif\n \n     case MIGRATION_ADDRESS_TYPE_EXEC:\n-        ioc = exec_connect_outgoing(s, addr->u.exec.args, errp);\n+        ioc = exec_connect_outgoing(addr->u.exec.args, errp);\n         break;\n \n     case MIGRATION_ADDRESS_TYPE_FILE:\n-        ioc = file_connect_outgoing(s, &addr->u.file, errp);\n+        ioc = file_connect_outgoing(&addr->u.file, errp);\n         break;\n \n     default:\n@@ -84,7 +83,7 @@ bool migration_connect_outgoing(MigrationState *s, MigrationAddress *addr,\n         return false;\n     }\n \n-    migration_channel_connect_outgoing(s, ioc);\n+    migration_channel_connect_outgoing(ioc);\n     return true;\n }\n \n@@ -252,12 +251,12 @@ out:\n     }\n }\n \n-void migration_channel_connect_outgoing(MigrationState *s, QIOChannel *ioc)\n+void migration_channel_connect_outgoing(QIOChannel *ioc)\n {\n     trace_migration_set_outgoing_channel(ioc, object_get_typename(OBJECT(ioc)));\n \n     if (migrate_channel_requires_tls_upgrade(ioc)) {\n-        migration_tls_channel_connect(s, ioc);\n+        migration_tls_channel_connect(ioc);\n \n         /*\n          * async: the above will call back to this function after\n@@ -268,7 +267,7 @@ void migration_channel_connect_outgoing(MigrationState *s, QIOChannel *ioc)\n \n     migration_ioc_register_yank(ioc);\n     migration_outgoing_setup(ioc);\n-    migration_start_outgoing(s);\n+    migration_start_outgoing();\n }\n \n \ndiff --git a/migration/channel.h b/migration/channel.h\nindex 4851179ae6..8cf16bfda9 100644\n--- a/migration/channel.h\n+++ b/migration/channel.h\n@@ -29,7 +29,7 @@ enum {\n \n void migration_channel_process_incoming(QIOChannel *ioc);\n \n-void migration_channel_connect_outgoing(MigrationState *s, QIOChannel *ioc);\n+void migration_channel_connect_outgoing(QIOChannel *ioc);\n \n int migration_channel_read_peek(QIOChannel *ioc,\n                                 const char *buf,\n@@ -39,7 +39,6 @@ int migration_channel_read_peek(QIOChannel *ioc,\n bool migration_has_main_and_multifd_channels(void);\n bool migration_has_all_channels(void);\n \n-bool migration_connect_outgoing(MigrationState *s, MigrationAddress *addr,\n-                                Error **errp);\n+bool migration_connect_outgoing(MigrationAddress *addr, Error **errp);\n void migration_connect_incoming(MigrationAddress *addr, Error **errp);\n #endif\ndiff --git a/migration/exec.c b/migration/exec.c\nindex a1a7ede3b4..a62fc0d00b 100644\n--- a/migration/exec.c\n+++ b/migration/exec.c\n@@ -40,8 +40,7 @@ const char *exec_get_cmd_path(void)\n }\n #endif\n \n-QIOChannel *exec_connect_outgoing(MigrationState *s, strList *command,\n-                                  Error **errp)\n+QIOChannel *exec_connect_outgoing(strList *command, Error **errp)\n {\n     QIOChannel *ioc = NULL;\n     g_auto(GStrv) argv = strv_from_str_list(command);\ndiff --git a/migration/exec.h b/migration/exec.h\nindex 3e39270dce..03c494b73c 100644\n--- a/migration/exec.h\n+++ b/migration/exec.h\n@@ -27,6 +27,5 @@ const char *exec_get_cmd_path(void);\n #endif\n void exec_connect_incoming(strList *host_port, Error **errp);\n \n-QIOChannel *exec_connect_outgoing(MigrationState *s, strList *host_port,\n-                                  Error **errp);\n+QIOChannel *exec_connect_outgoing(strList *host_port, Error **errp);\n #endif\ndiff --git a/migration/fd.c b/migration/fd.c\nindex bbf380d1a0..2480f48f2b 100644\n--- a/migration/fd.c\n+++ b/migration/fd.c\n@@ -49,8 +49,7 @@ static bool migration_fd_valid(int fd)\n     return false;\n }\n \n-QIOChannel *fd_connect_outgoing(MigrationState *s, const char *fdname,\n-                                Error **errp)\n+QIOChannel *fd_connect_outgoing(const char *fdname, Error **errp)\n {\n     QIOChannel *ioc = NULL;\n     int fd = monitor_get_fd(monitor_cur(), fdname, errp);\ndiff --git a/migration/fd.h b/migration/fd.h\nindex ce0b751273..dfadbf4cc5 100644\n--- a/migration/fd.h\n+++ b/migration/fd.h\n@@ -21,6 +21,5 @@\n \n void fd_connect_incoming(const char *fdname, Error **errp);\n \n-QIOChannel *fd_connect_outgoing(MigrationState *s, const char *fdname,\n-                                Error **errp);\n+QIOChannel *fd_connect_outgoing(const char *fdname, Error **errp);\n #endif\ndiff --git a/migration/file.c b/migration/file.c\nindex 5618aced49..9cdb55d94e 100644\n--- a/migration/file.c\n+++ b/migration/file.c\n@@ -93,8 +93,7 @@ out:\n     return ret;\n }\n \n-QIOChannel *file_connect_outgoing(MigrationState *s,\n-                                  FileMigrationArgs *file_args, Error **errp)\n+QIOChannel *file_connect_outgoing(FileMigrationArgs *file_args, Error **errp)\n {\n     QIOChannelFile *fioc = NULL;\n     g_autofree char *filename = g_strdup(file_args->filename);\ndiff --git a/migration/file.h b/migration/file.h\nindex 5936c64fea..74efd48abf 100644\n--- a/migration/file.h\n+++ b/migration/file.h\n@@ -16,8 +16,7 @@\n \n void file_connect_incoming(FileMigrationArgs *file_args, Error **errp);\n \n-QIOChannel *file_connect_outgoing(MigrationState *s,\n-                                  FileMigrationArgs *file_args, Error **errp);\n+QIOChannel *file_connect_outgoing(FileMigrationArgs *file_args, Error **errp);\n int file_parse_offset(char *filespec, uint64_t *offsetp, Error **errp);\n void file_cleanup_outgoing_migration(void);\n bool file_send_channel_create(gpointer opaque, Error **errp);\ndiff --git a/migration/migration.c b/migration/migration.c\nindex c75c2c7e52..c11cd4ebf6 100644\n--- a/migration/migration.c\n+++ b/migration/migration.c\n@@ -101,7 +101,7 @@ static bool migration_object_check(MigrationState *ms, Error **errp);\n static bool migration_switchover_start(MigrationState *s, Error **errp);\n static bool close_return_path_on_source(MigrationState *s);\n static void migration_completion_end(MigrationState *s);\n-static void migrate_hup_delete(MigrationState *s);\n+static void migrate_hup_delete(void);\n \n static void migration_downtime_start(MigrationState *s)\n {\n@@ -1372,7 +1372,7 @@ static void migration_cleanup(MigrationState *s)\n \n     qemu_savevm_state_cleanup();\n     cpr_state_close();\n-    migrate_hup_delete(s);\n+    migrate_hup_delete();\n \n     close_return_path_on_source(s);\n \n@@ -1454,8 +1454,9 @@ static void migrate_error_free(MigrationState *s)\n     }\n }\n \n-void migration_connect_error_propagate(MigrationState *s, Error *error)\n+void migration_connect_error_propagate(Error *error)\n {\n+    MigrationState *s = migrate_get_current();\n     MigrationStatus current = s->state;\n     MigrationStatus next = MIGRATION_STATUS_NONE;\n     bool resume = false;\n@@ -1555,7 +1556,7 @@ void migration_cancel(void)\n         migrate_set_state(&s->state, MIGRATION_STATUS_CANCELLING,\n                           MIGRATION_STATUS_CANCELLED);\n         cpr_state_close();\n-        migrate_hup_delete(s);\n+        migrate_hup_delete();\n     }\n }\n \n@@ -1961,8 +1962,10 @@ bool migration_is_blocked(Error **errp)\n }\n \n /* Returns true if continue to migrate, or false if error detected */\n-static bool migrate_prepare(MigrationState *s, bool resume, Error **errp)\n+static bool migrate_prepare(bool resume, Error **errp)\n {\n+    MigrationState *s = migrate_get_current();\n+\n     if (resume) {\n         if (s->state != MIGRATION_STATUS_POSTCOPY_PAUSED) {\n             error_setg(errp, \"Cannot resume if there is no \"\n@@ -2080,16 +2083,19 @@ static bool migrate_prepare(MigrationState *s, bool resume, Error **errp)\n \n static void qmp_migrate_finish(MigrationAddress *addr, Error **errp);\n \n-static void migrate_hup_add(MigrationState *s, QIOChannel *ioc, GSourceFunc cb,\n-                            void *opaque)\n+static void migrate_hup_add(QIOChannel *ioc, GSourceFunc cb, void *opaque)\n {\n-        s->hup_source = qio_channel_create_watch(ioc, G_IO_HUP);\n-        g_source_set_callback(s->hup_source, cb, opaque, NULL);\n-        g_source_attach(s->hup_source, NULL);\n+    MigrationState *s = migrate_get_current();\n+\n+    s->hup_source = qio_channel_create_watch(ioc, G_IO_HUP);\n+    g_source_set_callback(s->hup_source, cb, opaque, NULL);\n+    g_source_attach(s->hup_source, NULL);\n }\n \n-static void migrate_hup_delete(MigrationState *s)\n+static void migrate_hup_delete(void)\n {\n+    MigrationState *s = migrate_get_current();\n+\n     if (s->hup_source) {\n         g_source_destroy(s->hup_source);\n         g_source_unref(s->hup_source);\n@@ -2101,19 +2107,18 @@ static gboolean qmp_migrate_finish_cb(QIOChannel *channel,\n                                       GIOCondition cond,\n                                       void *opaque)\n {\n-    MigrationState *s = migrate_get_current();\n     MigrationAddress *addr = opaque;\n     Error *local_err = NULL;\n \n     qmp_migrate_finish(addr, &local_err);\n \n     if (local_err) {\n-        migration_connect_error_propagate(s, local_err);\n+        migration_connect_error_propagate(local_err);\n     }\n \n \n     cpr_state_close();\n-    migrate_hup_delete(s);\n+    migrate_hup_delete();\n     qapi_free_MigrationAddress(addr);\n     return G_SOURCE_REMOVE;\n }\n@@ -2122,7 +2127,6 @@ void qmp_migrate(const char *uri, bool has_channels,\n                  MigrationChannelList *channels, bool has_detach, bool detach,\n                  bool has_resume, bool resume, Error **errp)\n {\n-    MigrationState *s = migrate_get_current();\n     g_autoptr(MigrationChannel) channel = NULL;\n     MigrationAddress *addr = NULL;\n     MigrationChannel *channelv[MIGRATION_CHANNEL_TYPE__MAX] = { NULL };\n@@ -2173,7 +2177,7 @@ void qmp_migrate(const char *uri, bool has_channels,\n         return;\n     }\n \n-    if (!migrate_prepare(s, has_resume && resume, errp)) {\n+    if (!migrate_prepare(has_resume && resume, errp)) {\n         /* Error detected, put into errp */\n         return;\n     }\n@@ -2200,7 +2204,7 @@ void qmp_migrate(const char *uri, bool has_channels,\n      * connection, so qmp_migrate_finish will fail to connect, and then recover.\n      */\n     if (migrate_mode() == MIG_MODE_CPR_TRANSFER) {\n-        migrate_hup_add(s, cpr_state_ioc(), (GSourceFunc)qmp_migrate_finish_cb,\n+        migrate_hup_add(cpr_state_ioc(), (GSourceFunc)qmp_migrate_finish_cb,\n                         QAPI_CLONE(MigrationAddress, addr));\n \n     } else {\n@@ -2209,16 +2213,14 @@ void qmp_migrate(const char *uri, bool has_channels,\n \n out:\n     if (local_err) {\n-        migration_connect_error_propagate(s, error_copy(local_err));\n+        migration_connect_error_propagate(error_copy(local_err));\n         error_propagate(errp, local_err);\n     }\n }\n \n static void qmp_migrate_finish(MigrationAddress *addr, Error **errp)\n {\n-    MigrationState *s = migrate_get_current();\n-\n-    migration_connect_outgoing(s, addr, errp);\n+    migration_connect_outgoing(addr, errp);\n }\n \n void qmp_migrate_cancel(Error **errp)\n@@ -3895,8 +3897,9 @@ fail_setup:\n     return NULL;\n }\n \n-void migration_start_outgoing(MigrationState *s)\n+void migration_start_outgoing(void)\n {\n+    MigrationState *s = migrate_get_current();\n     Error *local_err = NULL;\n     uint64_t rate_limit;\n     bool resume = (s->state == MIGRATION_STATUS_POSTCOPY_RECOVER_SETUP);\n@@ -3975,7 +3978,7 @@ void migration_start_outgoing(MigrationState *s)\n     return;\n \n fail:\n-    migration_connect_error_propagate(s, local_err);\n+    migration_connect_error_propagate(local_err);\n     if (s->error) {\n         error_report_err(error_copy(s->error));\n     }\ndiff --git a/migration/migration.h b/migration/migration.h\nindex 138831d7d9..1292c1ee3a 100644\n--- a/migration/migration.h\n+++ b/migration/migration.h\n@@ -529,11 +529,11 @@ void migrate_set_state(MigrationStatus *state, MigrationStatus old_state,\n void migration_outgoing_setup(QIOChannel *ioc);\n bool migration_incoming_setup(QIOChannel *ioc, uint8_t channel, Error **errp);\n \n-void migration_connect_error_propagate(MigrationState *s, Error *error);\n+void migration_connect_error_propagate(Error *error);\n void migrate_error_propagate(MigrationState *s, Error *error);\n bool migrate_has_error(MigrationState *s);\n \n-void migration_start_outgoing(MigrationState *s);\n+void migration_start_outgoing(void);\n void migration_start_incoming(void);\n \n int migration_call_notifiers(MigrationState *s, MigrationEventType type,\ndiff --git a/migration/rdma.c b/migration/rdma.c\nindex 3db3a89bdb..56e0ee8aa9 100644\n--- a/migration/rdma.c\n+++ b/migration/rdma.c\n@@ -3923,10 +3923,9 @@ err:\n     g_free(rdma);\n }\n \n-QIOChannel *rdma_connect_outgoing(void *opaque,\n-                                  InetSocketAddress *host_port, Error **errp)\n+QIOChannel *rdma_connect_outgoing(InetSocketAddress *host_port, Error **errp)\n {\n-    MigrationState *s = opaque;\n+    MigrationState *s = migrate_get_current();\n     RDMAContext *rdma_return_path = NULL;\n     RDMAContext *rdma;\n     int ret;\ndiff --git a/migration/rdma.h b/migration/rdma.h\nindex 8a6515f130..205184f244 100644\n--- a/migration/rdma.h\n+++ b/migration/rdma.h\n@@ -21,8 +21,7 @@\n \n #include \"system/memory.h\"\n \n-QIOChannel *rdma_connect_outgoing(void *opaque, InetSocketAddress *host_port,\n-                                  Error **errp);\n+QIOChannel *rdma_connect_outgoing(InetSocketAddress *host_port, Error **errp);\n \n void rdma_connect_incoming(InetSocketAddress *host_port, Error **errp);\n \ndiff --git a/migration/socket.c b/migration/socket.c\nindex ac3183d5d5..34ce7abbd3 100644\n--- a/migration/socket.c\n+++ b/migration/socket.c\n@@ -42,23 +42,8 @@ void socket_send_channel_create(QIOTaskFunc f, void *data)\n                                      f, data, NULL, NULL);\n }\n \n-struct SocketConnectData {\n-    MigrationState *s;\n-};\n-\n-static void socket_connect_data_free(void *opaque)\n+static void socket_outgoing_migration(QIOTask *task, gpointer opaque)\n {\n-    struct SocketConnectData *data = opaque;\n-    if (!data) {\n-        return;\n-    }\n-    g_free(data);\n-}\n-\n-static void socket_outgoing_migration(QIOTask *task,\n-                                      gpointer opaque)\n-{\n-    struct SocketConnectData *data = opaque;\n     g_autoptr(QIOChannel) sioc = QIO_CHANNEL(qio_task_get_source(task));\n     Error *err = NULL;\n \n@@ -73,22 +58,19 @@ static void socket_outgoing_migration(QIOTask *task,\n     }\n \n     trace_migration_socket_outgoing_connected();\n-    migration_channel_connect_outgoing(data->s, sioc);\n+    migration_channel_connect_outgoing(sioc);\n     return;\n err:\n     trace_migration_socket_outgoing_error(error_get_pretty(err));\n-    migration_connect_error_propagate(data->s, err);\n+    migration_connect_error_propagate(err);\n }\n \n-void socket_connect_outgoing(MigrationState *s, SocketAddress *saddr,\n-                             Error **errp)\n+void socket_connect_outgoing(SocketAddress *saddr, Error **errp)\n {\n+    MigrationState *s = migrate_get_current();\n     QIOChannelSocket *sioc = qio_channel_socket_new();\n-    struct SocketConnectData *data = g_new0(struct SocketConnectData, 1);\n     SocketAddress *addr = QAPI_CLONE(SocketAddress, saddr);\n \n-    data->s = s;\n-\n     /* in case previous migration leaked it */\n     qapi_free_SocketAddress(outgoing_args.saddr);\n     outgoing_args.saddr = addr;\n@@ -101,8 +83,8 @@ void socket_connect_outgoing(MigrationState *s, SocketAddress *saddr,\n     qio_channel_socket_connect_async(sioc,\n                                      saddr,\n                                      socket_outgoing_migration,\n-                                     data,\n-                                     socket_connect_data_free,\n+                                     NULL,\n+                                     NULL,\n                                      NULL);\n }\n \ndiff --git a/migration/socket.h b/migration/socket.h\nindex f0c89b64c7..0ddff7e9df 100644\n--- a/migration/socket.h\n+++ b/migration/socket.h\n@@ -25,8 +25,7 @@ void socket_send_channel_create(QIOTaskFunc f, void *data);\n \n void socket_connect_incoming(SocketAddress *saddr, Error **errp);\n \n-void socket_connect_outgoing(MigrationState *s,\n-                             SocketAddress *saddr, Error **errp);\n+void socket_connect_outgoing(SocketAddress *saddr, Error **errp);\n void socket_cleanup_outgoing_migration(void);\n \n #endif\ndiff --git a/migration/tls.c b/migration/tls.c\nindex f68e6a533b..d71d3f9ea6 100644\n--- a/migration/tls.c\n+++ b/migration/tls.c\n@@ -103,18 +103,17 @@ void migration_tls_channel_process_incoming(QIOChannel *ioc, Error **errp)\n static void migration_tls_outgoing_handshake(QIOTask *task,\n                                              gpointer opaque)\n {\n-    MigrationState *s = opaque;\n     g_autoptr(QIOChannel) ioc = QIO_CHANNEL(qio_task_get_source(task));\n     Error *err = NULL;\n \n     if (qio_task_propagate_error(task, &err)) {\n         trace_migration_tls_outgoing_handshake_error(error_get_pretty(err));\n-        migration_connect_error_propagate(s, err);\n+        migration_connect_error_propagate(err);\n         return;\n     }\n \n     trace_migration_tls_outgoing_handshake_complete();\n-    migration_channel_connect_outgoing(s, ioc);\n+    migration_channel_connect_outgoing(ioc);\n }\n \n QIOChannelTLS *migration_tls_client_create(QIOChannel *ioc,\n@@ -130,14 +129,14 @@ QIOChannelTLS *migration_tls_client_create(QIOChannel *ioc,\n     return qio_channel_tls_new_client(ioc, creds, migrate_tls_hostname(), errp);\n }\n \n-void migration_tls_channel_connect(MigrationState *s, QIOChannel *ioc)\n+void migration_tls_channel_connect(QIOChannel *ioc)\n {\n     QIOChannelTLS *tioc;\n     Error *local_err = NULL;\n \n     tioc = migration_tls_client_create(ioc, &local_err);\n     if (!tioc) {\n-        migration_connect_error_propagate(s, local_err);\n+        migration_connect_error_propagate(local_err);\n         return;\n     }\n \n@@ -150,7 +149,7 @@ void migration_tls_channel_connect(MigrationState *s, QIOChannel *ioc)\n     }\n     qio_channel_tls_handshake(tioc,\n                               migration_tls_outgoing_handshake,\n-                              s,\n+                              NULL,\n                               NULL,\n                               NULL);\n }\ndiff --git a/migration/tls.h b/migration/tls.h\nindex 7399c42edf..7ccd495f81 100644\n--- a/migration/tls.h\n+++ b/migration/tls.h\n@@ -29,7 +29,7 @@ void migration_tls_channel_process_incoming(QIOChannel *ioc, Error **errp);\n QIOChannelTLS *migration_tls_client_create(QIOChannel *ioc,\n                                            Error **errp);\n \n-void migration_tls_channel_connect(MigrationState *s, QIOChannel *ioc);\n+void migration_tls_channel_connect(QIOChannel *ioc);\n void migration_tls_channel_end(QIOChannel *ioc, Error **errp);\n /* Whether the QIO channel requires further TLS handshake? */\n bool migrate_channel_requires_tls_upgrade(QIOChannel *ioc);\n",
    "prefixes": [
        "RFC",
        "21/25"
    ]
}