Vladimir Sementsov-Ogievskiy <[email protected]> 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 <[email protected]> > --- > 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 <[email protected]>
