On Wed, Apr 27, 2022 at 11:13:25PM +0200, Claudio Fontana wrote: > add new API in order to be able to extend parameters to the domain > save operation. We will use it to fit the existing arguments of > VirDomainSaveFlags, and then add parallel saves functionality. > > Signed-off-by: Claudio Fontana <cfontana@xxxxxxx> > --- > include/libvirt/libvirt-domain.h | 45 ++++++++++++++++++++++++++++ > src/driver-hypervisor.h | 7 +++++ > src/libvirt-domain.c | 51 ++++++++++++++++++++++++++++++++ > src/libvirt_public.syms | 5 ++++ > 4 files changed, 108 insertions(+) > > diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h > index 9aa214f3df..b870a73b64 100644 > --- a/include/libvirt/libvirt-domain.h > +++ b/include/libvirt/libvirt-domain.h > @@ -1481,6 +1481,8 @@ typedef enum { > VIR_DOMAIN_SAVE_RUNNING = 1 << 1, /* Favor running over paused */ > VIR_DOMAIN_SAVE_PAUSED = 1 << 2, /* Favor paused over running */ > VIR_DOMAIN_SAVE_RESET_NVRAM = 1 << 3, /* Re-initialize NVRAM from template */ > + /** Since: v8.3.0 */ > + VIR_DOMAIN_SAVE_PARALLEL = 1 << 4, /* Parallel Save/Restore to multiple files */ > } virDomainSaveRestoreFlags; > > int virDomainSave (virDomainPtr domain, > @@ -1489,6 +1491,10 @@ int virDomainSaveFlags (virDomainPtr domain, > const char *to, > const char *dxml, > unsigned int flags); > +int virDomainSaveParametersFlags (virDomainPtr domain, > + virTypedParameterPtr params, > + int nparams, > + unsigned int flags); BTW, we don't need 'Flags' as a suffix here. We only add 'Flags' suffixes when we had an existing API that was missing flags and need a new unique name. I'd also probably shorten to 'Params', eg in this case, it is sufficient to have virDomainSaveParams and virDomainRestoreParams. > int virDomainRestore (virConnectPtr conn, > const char *from); > int virDomainRestoreFlags (virConnectPtr conn, > @@ -1496,6 +1502,45 @@ int virDomainRestoreFlags (virConnectPtr conn, > const char *dxml, > unsigned int flags); > > +/** > + * VIR_SAVE_PARAM_FILE: > + * > + * the parameter used to specify the savestate file to save to or restore from. > + * For parallel saves, this is the main file, with the extra connections adding suffix > + * .1 .2 .3 ... up to VIR_SAVE_PARAM_PARALLEL_CONNECTIONS. > + * > + * Since: v8.3.0 > + */ > +# define VIR_SAVE_PARAM_FILE "file" > + > +/** > + * VIR_SAVE_PARAM_DXML: > + * > + * an optional parameter used to adjust guest xml on restore. > + * If the hypervisor supports it, it can be used to alter > + * host-specific portions of the domain XML that will be used when > + * restoring an image. For example, it is possible to alter the > + * device while the domain is stopped. > + * > + * Since: v8.3.0 > + */ > +# define VIR_SAVE_PARAM_DXML "dxml" > + > +/** > + * VIR_SAVE_PARAM_PARALLEL_CONNECTIONS: > + * > + * this optional parameter mirrors the migration parameter > + * VIR_MIGRATE_PARAM_PARALLEL_CONNECTIONS. > + * > + * This parameter is used when saving or restoring state files > + * in parallel using the flag VIR_DOMAIN_SAVE_PARALLEL . > + * It specifies the number of extra files to save/restore > + * using parallel connections. > + * > + * Since: v8.3.0 > + */ > +# define VIR_SAVE_PARAM_PARALLEL_CONNECTIONS "parallel.connections" > + > /* See below for virDomainSaveImageXMLFlags */ > char * virDomainSaveImageGetXMLDesc (virConnectPtr conn, > const char *file, > diff --git a/src/driver-hypervisor.h b/src/driver-hypervisor.h > index 4423eb0885..a4e1d21e76 100644 > --- a/src/driver-hypervisor.h > +++ b/src/driver-hypervisor.h > @@ -240,6 +240,12 @@ typedef int > const char *dxml, > unsigned int flags); > > +typedef int > +(*virDrvDomainSaveParametersFlags)(virDomainPtr domain, > + virTypedParameterPtr params, > + int nparams, > + unsigned int flags); > + > typedef int > (*virDrvDomainRestore)(virConnectPtr conn, > const char *from); > @@ -1489,6 +1495,7 @@ struct _virHypervisorDriver { > virDrvDomainGetControlInfo domainGetControlInfo; > virDrvDomainSave domainSave; > virDrvDomainSaveFlags domainSaveFlags; > + virDrvDomainSaveParametersFlags domainSaveParametersFlags; > virDrvDomainRestore domainRestore; > virDrvDomainRestoreFlags domainRestoreFlags; > virDrvDomainSaveImageGetXMLDesc domainSaveImageGetXMLDesc; > diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c > index cbd7902d2d..9e4fcfd022 100644 > --- a/src/libvirt-domain.c > +++ b/src/libvirt-domain.c > @@ -959,6 +959,57 @@ virDomainSaveFlags(virDomainPtr domain, const char *to, > return -1; > } > > +/** > + * virDomainSaveParametersFlags: > + * @domain: a domain object > + * @params: save parameters > + * @nparams: number of save parameters > + * @flags: bitwise-OR of virDomainSaveRestoreFlags > + * > + * This method extends virDomainSaveFlags by adding parameters to Save. > + * > + * If @flags includes VIR_DOMAIN_SAVE_PARALLEL, then libvirt will > + * attempt to trigger a parallel transfer to multiple files, > + * where the number of extra files is determined by the parameter > + * VIR_SAVE_PARAM_PARALLEL_CONNECTIONS. > + * > + * Returns 0 in case of success and -1 in case of failure. > + */ > +int > +virDomainSaveParametersFlags(virDomainPtr domain, > + virTypedParameterPtr params, int nparams, > + unsigned int flags) > +{ > + virConnectPtr conn; > + > + VIR_DOMAIN_DEBUG(domain, "params=%p, nparams=%d, flags=0x%x", > + params, nparams, flags); > + VIR_TYPED_PARAMS_DEBUG(params, nparams); > + > + virResetLastError(); > + > + virCheckDomainReturn(domain, -1); > + conn = domain->conn; > + > + virCheckReadOnlyGoto(conn->flags, error); > + > + VIR_EXCLUSIVE_FLAGS_GOTO(VIR_DOMAIN_SAVE_RUNNING, > + VIR_DOMAIN_SAVE_PAUSED, > + error); > + > + if (conn->driver->domainSaveParametersFlags) { > + if (conn->driver->domainSaveParametersFlags(domain, params, nparams, flags) < 0) > + goto error; > + return 0; > + } > + > + virReportUnsupportedError(); > + > + error: > + virDispatchError(domain->conn); > + return -1; > +} > + > > /** > * virDomainRestore: > diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms > index f93692c427..eb3a7afb75 100644 > --- a/src/libvirt_public.syms > +++ b/src/libvirt_public.syms > @@ -916,4 +916,9 @@ LIBVIRT_8.0.0 { > virDomainSetLaunchSecurityState; > } LIBVIRT_7.8.0; > > +LIBVIRT_8.3.0 { > + global: > + virDomainSaveParametersFlags; > +} LIBVIRT_8.0.0; > + > # .... define new API here using predicted next version number .... > -- > 2.34.1 > With regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|