On Mon, Oct 23, 2023 at 05:35:52PM -0300, Fabiano Rosas wrote:
> The fixed-ram migration format needs a channel that supports seeking
> to be able to write each page to an arbitrary offset in the migration
> stream.
>
> Signed-off-by: Fabiano Rosas <farosas@suse.de>
> ---
> migration/migration.c | 22 ++++++++++++++++++++--
> 1 file changed, 20 insertions(+), 2 deletions(-)
>
> diff --git a/migration/migration.c b/migration/migration.c
> index 692fbc5ad6..cabb3ad3a5 100644
> --- a/migration/migration.c
> +++ b/migration/migration.c
> @@ -106,22 +106,40 @@ static bool migration_needs_multiple_sockets(void)
> return migrate_multifd() || migrate_postcopy_preempt();
> }
>
> +static bool migration_needs_seekable_channel(void)
> +{
> + return migrate_fixed_ram();
> +}
> +
> static bool uri_supports_multi_channels(const char *uri)
> {
> return strstart(uri, "tcp:", NULL) || strstart(uri, "unix:", NULL) ||
> strstart(uri, "vsock:", NULL);
> }
>
> +static bool uri_supports_seeking(const char *uri)
> +{
> + return strstart(uri, "file:", NULL);
> +}
> +
> static bool
> migration_channels_and_uri_compatible(const char *uri, Error **errp)
> {
> + bool compatible = true;
> +
> + if (migration_needs_seekable_channel() &&
> + !uri_supports_seeking(uri)) {
> + error_setg(errp, "Migration requires seekable transport (e.g. file)");
> + compatible = false;
We may want to return directly after setting errp once, as error_setg() can
trigger assertion over "*errp==NULL" if below check will fail too.
> + }
> +
> if (migration_needs_multiple_sockets() &&
> !uri_supports_multi_channels(uri)) {
> error_setg(errp, "Migration requires multi-channel URIs (e.g. tcp)");
> - return false;
> + compatible = false;
> }
>
> - return true;
> + return compatible;
> }
>
> static bool migration_should_pause(const char *uri)
> --
> 2.35.3
>
--
Peter Xu