From: Markus Armbruster <armbru@redhat.com>
To: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
Cc: jasowang@redhat.com, mst@redhat.com, peterx@redhat.com,
farosas@suse.de, raphael.s.norwitz@gmail.com,
bchaney@akamai.com, qemu-devel@nongnu.org, berrange@redhat.com,
pbonzini@redhat.com, yc-core@yandex-team.ru,
mark.caveayland@nutanix.com, Eric Blake <eblake@redhat.com>
Subject: Re: [PATCH v20 09/15] qapi: add local migration parameter
Date: Wed, 29 Jul 2026 13:10:51 +0200 [thread overview]
Message-ID: <87se52qcec.fsf@pond.sub.org> (raw)
In-Reply-To: <20260729091334.1863155-10-vsementsov@yandex-team.ru> (Vladimir Sementsov-Ogievskiy's message of "Wed, 29 Jul 2026 12:12:47 +0300")
Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru> writes:
> We are going to implement local-migration feature: some devices will be
> able to transfer open file descriptors through migration stream (which
> must UNIX domain socket for that purpose). This allows to transfer the
> whole backend state without reconnecting and restarting the backend
> service. For example, virtio-net will migrate its attached TAP netdev,
> together with its connected file descriptors.
>
> In this commit we introduce a migration parameter, which enables
> the feature for devices that support it (none at the moment).
>
> We can't simply auto-detect local migration by checking whether the
> migration channel is a UNIX domain socket: the UNIX socket may be only
> the first part of the transfer channel to a remote target. Hence an
> explicit parameter is needed. More over, "local" migration parameter
Moreover
> may be useful in cpr-exec mode, when FDs are passed through exec
> instead of UNIX socket.
>
> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
> ---
> include/migration/misc.h | 2 ++
> migration/options.c | 18 +++++++++++++++++-
> qapi/migration.json | 22 ++++++++++++++++++----
> 3 files changed, 37 insertions(+), 5 deletions(-)
>
> diff --git a/include/migration/misc.h b/include/migration/misc.h
> index 2b2fbb59a40..019717f4cda 100644
> --- a/include/migration/misc.h
> +++ b/include/migration/misc.h
> @@ -161,4 +161,6 @@ bool multifd_join_device_state_save_threads(void);
>
> void migration_request_switchover_ack_legacy(const char *requester);
>
> +bool migrate_local(void);
> +
> #endif
> diff --git a/migration/options.c b/migration/options.c
> index dfce19405d4..5c439f6d724 100644
> --- a/migration/options.c
> +++ b/migration/options.c
> @@ -14,6 +14,7 @@
> #include "qemu/osdep.h"
> #include "qemu/error-report.h"
> #include "qemu/units.h"
> +#include "qapi/util.h"
> #include "exec/target_page.h"
> #include "qapi/clone-visitor.h"
> #include "qapi/error.h"
> @@ -25,6 +26,7 @@
> #include "migration/colo.h"
> #include "migration/cpr.h"
> #include "migration/misc.h"
> +#include "migration/options.h"
> #include "migration.h"
> #include "migration-stats.h"
> #include "qemu-file.h"
> @@ -350,6 +352,12 @@ bool migrate_mapped_ram(void)
> return s->capabilities[MIGRATION_CAPABILITY_MAPPED_RAM];
> }
>
> +bool migrate_local(void)
> +{
> + MigrationState *s = migrate_get_current();
> + return s->parameters.local;
> +}
> +
> bool migrate_ignore_shared(void)
> {
> MigrationState *s = migrate_get_current();
> @@ -1085,7 +1093,7 @@ static void migrate_mark_all_params_present(MigrationParameters *p)
> &p->has_announce_step, &p->has_block_bitmap_mapping,
> &p->has_x_vcpu_dirty_limit_period, &p->has_vcpu_dirty_limit,
> &p->has_mode, &p->has_zero_page_detection, &p->has_direct_io,
> - &p->has_x_rdma_chunk_size, &p->has_cpr_exec_command,
> + &p->has_x_rdma_chunk_size, &p->has_cpr_exec_command, &p->has_local,
> };
>
> len = ARRAY_SIZE(has_fields);
> @@ -1433,6 +1441,10 @@ static void migrate_params_test_apply(MigrationParameters *params,
> qapi_free_strList(dest->cpr_exec_command);
> dest->cpr_exec_command = QAPI_CLONE(strList, params->cpr_exec_command);
> }
> +
> + if (params->has_local) {
> + dest->local = params->local;
> + }
> }
>
> static void migrate_params_apply(MigrationParameters *params)
> @@ -1565,6 +1577,10 @@ static void migrate_params_apply(MigrationParameters *params)
> s->parameters.cpr_exec_command =
> QAPI_CLONE(strList, params->cpr_exec_command);
> }
> +
> + if (params->has_local) {
> + s->parameters.local = params->local;
> + }
> }
>
> void qmp_migrate_set_parameters(MigrationParameters *params, Error **errp)
> diff --git a/qapi/migration.json b/qapi/migration.json
> index b1eaf7b0545..bb744f134ce 100644
> --- a/qapi/migration.json
> +++ b/qapi/migration.json
> @@ -830,7 +830,8 @@
> 'zero-page-detection',
> 'direct-io',
> { 'name': 'x-rdma-chunk-size', 'features': [ 'unstable' ] },
> - 'cpr-exec-command'] }
> + 'cpr-exec-command',
> + 'local'] }
>
> ##
> # @migrate-set-parameters:
> @@ -1012,10 +1013,21 @@
> # Must be set to the same value on both source and destination
> # before migration starts. (Since 11.1)
> #
> +# @local: Permit the use of optimizations for local migration.
> +# This must only be set when either both the source and
> +# destination QEMU processes are directly connected with a UNIX
> +# domain socket as the migration channel (to enable use of file
> +# descriptor passing) or cpr-exec migration mode is enabled
> +# (this way file descriptors are inherited by new process).
> +# Individual device backends may need additional configuration
> +# flags set to enable local migration optimizations.
Extra space between "set" and "to".
> +# This will be documented against the device
> +# backends where it applies. (Since 11.2)
Reflow while there:
# @local: Permit the use of optimizations for local migration. This
# must only be set when either both the source and destination
# QEMU processes are directly connected with a UNIX domain socket
# as the migration channel (to enable use of file descriptor
# passing) or cpr-exec migration mode is enabled (this way file
# descriptors are inherited by new process). Individual device
# backends may need additional configuration flags set to enable
# local migration optimizations. This will be documented against
# the device backends where it applies. (Since 11.2)
> +#
> # Features:
> #
> -# @unstable: Members @x-checkpoint-delay, @x-rdma-chunk-size, and
> -# @x-vcpu-dirty-limit-period are experimental.
> +# @unstable: Members @local, @x-checkpoint-delay, @x-rdma-chunk-size,
> +# and @x-vcpu-dirty-limit-period are experimental.
> #
> # Since: 2.4
> ##
> @@ -1053,7 +1065,9 @@
> '*direct-io': 'bool',
> '*x-rdma-chunk-size': { 'type': 'uint64',
> 'features': [ 'unstable' ] },
> - '*cpr-exec-command': [ 'str' ]} }
> + '*cpr-exec-command': [ 'str' ],
> + '*local': { 'type': 'bool',
> + 'features': [ 'unstable' ] } } }
>
> ##
> # @query-migrate-parameters:
With these cosmetic tweaks
Acked-by: Markus Armbruster <armbru@redhat.com>
next prev parent reply other threads:[~2026-07-29 11:11 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-29 9:12 [PATCH v20 00/15] virtio-net: live-TAP local migration Vladimir Sementsov-Ogievskiy
2026-07-29 9:12 ` [PATCH v20 01/15] net/tap: rework tap_parse_script Vladimir Sementsov-Ogievskiy
2026-07-29 9:12 ` [PATCH v20 02/15] net/tap: improve script/downscript options documentation Vladimir Sementsov-Ogievskiy
2026-07-29 9:12 ` [PATCH v20 03/15] net/tap: deprecate "no" as special value for script/downscript Vladimir Sementsov-Ogievskiy
2026-07-29 9:12 ` [PATCH v20 04/15] net/tap: move vhost-net open() calls to tap_parse_vhost_fds() Vladimir Sementsov-Ogievskiy
2026-07-29 9:12 ` [PATCH v20 05/15] net/tap: move vhost initialization to tap_setup_vhost() Vladimir Sementsov-Ogievskiy
2026-07-29 9:12 ` [PATCH v20 06/15] net/tap: use container_of instead of DO_UPCAST Vladimir Sementsov-Ogievskiy
2026-07-29 9:12 ` [PATCH v20 07/15] net/tap: QOMify tap backend Vladimir Sementsov-Ogievskiy
2026-07-29 9:12 ` [PATCH v20 08/15] net/tap: add TYPE_VMSTATE_IF interface Vladimir Sementsov-Ogievskiy
2026-07-29 9:12 ` [PATCH v20 09/15] qapi: add local migration parameter Vladimir Sementsov-Ogievskiy
2026-07-29 11:10 ` Markus Armbruster [this message]
2026-07-29 14:05 ` Peter Xu
2026-07-29 9:12 ` [PATCH v20 10/15] migration/channel: check that transfer is UNIX socket when "local" set Vladimir Sementsov-Ogievskiy
2026-07-29 14:09 ` Peter Xu
2026-07-29 17:53 ` Vladimir Sementsov-Ogievskiy
2026-07-29 9:12 ` [PATCH v20 11/15] virtio-net: support local migration of backend Vladimir Sementsov-Ogievskiy
2026-07-29 9:12 ` [PATCH v20 12/15] net/tap: disable read polling for stopped VM Vladimir Sementsov-Ogievskiy
2026-07-29 9:12 ` [PATCH v20 13/15] net/tap: support local migration with virtio-net Vladimir Sementsov-Ogievskiy
2026-07-29 11:30 ` Markus Armbruster
2026-07-29 12:25 ` Vladimir Sementsov-Ogievskiy
2026-07-29 12:45 ` Markus Armbruster
2026-07-29 9:12 ` [PATCH v20 14/15] tests/functional: add skipWithoutSudo() decorator Vladimir Sementsov-Ogievskiy
2026-07-29 9:12 ` [PATCH v20 15/15] tests/functional: add test_tap_migration Vladimir Sementsov-Ogievskiy
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87se52qcec.fsf@pond.sub.org \
--to=armbru@redhat.com \
--cc=bchaney@akamai.com \
--cc=berrange@redhat.com \
--cc=eblake@redhat.com \
--cc=farosas@suse.de \
--cc=jasowang@redhat.com \
--cc=mark.caveayland@nutanix.com \
--cc=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=peterx@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=raphael.s.norwitz@gmail.com \
--cc=vsementsov@yandex-team.ru \
--cc=yc-core@yandex-team.ru \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.