One thing I was thinking about, beyond what is in this patch, is that for the QEMU driver we could save the number of channels used for the --parallel save in the qemu SaveImage header as well. This way, on restore libvirt would automatically know how many file it needs to load, and the user does not need to know beforehand which --parallel-connections NN to use. Still the --parallel on resume would be needed in the current design, but that could theoretically be dropped as well. However, I wonder if that would create issues for other hypervisors implementing this, ie I presume keeping the --parallel flag would be the safest option. Thanks, Claudio On 5/6/22 3:11 PM, Claudio Fontana wrote: > Signed-off-by: Claudio Fontana <cfontana@xxxxxxx> > --- > src/qemu/qemu_saveimage.c | 19 ++++++++++++++++++- > src/qemu/qemu_saveimage.h | 5 +++-- > 2 files changed, 21 insertions(+), 3 deletions(-) > > diff --git a/src/qemu/qemu_saveimage.c b/src/qemu/qemu_saveimage.c > index 35a75069e8..c0920c5baa 100644 > --- a/src/qemu/qemu_saveimage.c > +++ b/src/qemu/qemu_saveimage.c > @@ -67,6 +67,23 @@ VIR_ENUM_IMPL(qemuSaveCompression, > "lzop", > ); > > +typedef enum { > + QEMU_SAVE_MULTIFD_COMP_NONE = 0, > + QEMU_SAVE_MULTIFD_COMP_ZLIB = 1, > + QEMU_SAVE_MULTIFD_COMP_ZSTD = 2, > + > + /* used for the on-disk format, do not change/re-use numbers */ > + QEMU_SAVE_MULTIFD_COMP_LAST > +} virQEMUSaveMultiFdComp; > + > +VIR_ENUM_DECL(qemuSaveMultiFdComp); > +VIR_ENUM_IMPL(qemuSaveMultiFdComp, > + QEMU_SAVE_MULTIFD_COMP_LAST, > + "none", > + "zlib", > + "zstd", > +); > + > static inline void > qemuSaveImageBswapHeader(virQEMUSaveHeader *hdr) > { > @@ -882,7 +899,7 @@ qemuSaveImageStartVM(virConnectPtr conn, > virDomainXMLOptionGetSaveCookie(driver->xmlopt)) < 0) > goto cleanup; > > - if ((header->version == 2) && > + if ((header->version >= 2) && > (header->compressed != QEMU_SAVE_FORMAT_RAW)) { > if (!(cmd = qemuSaveImageGetCompressionCommand(header->compressed))) > goto cleanup; > diff --git a/src/qemu/qemu_saveimage.h b/src/qemu/qemu_saveimage.h > index ae7b3faa17..eb0734101e 100644 > --- a/src/qemu/qemu_saveimage.h > +++ b/src/qemu/qemu_saveimage.h > @@ -30,7 +30,7 @@ > */ > #define QEMU_SAVE_MAGIC "LibvirtQemudSave" > #define QEMU_SAVE_PARTIAL "LibvirtQemudPart" > -#define QEMU_SAVE_VERSION 2 > +#define QEMU_SAVE_VERSION 3 > > G_STATIC_ASSERT(sizeof(QEMU_SAVE_MAGIC) == sizeof(QEMU_SAVE_PARTIAL)); > > @@ -42,7 +42,8 @@ struct _virQEMUSaveHeader { > uint32_t was_running; > uint32_t compressed; > uint32_t cookieOffset; > - uint32_t unused[14]; > + uint32_t multifd_comp; > + uint32_t unused[13]; > }; > > >