On 5/6/22 4:32 PM, Claudio Fontana wrote: > 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. , ... ie I presume keeping the --parallel flag as a mandatory parameter to the virsh restore command when restoring from a parallel saved image 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]; >> }; >> >> >> >