[libvirt] [PATCH 2/2] qemu: Remove unnecessary calculations in qemuDomainSaveMemory

Peter Krempa pkrempa at redhat.com
Wed Feb 17 12:35:52 UTC 2016


Now that the file migration doesn't require us to use 'dd' and other
legacy stuff for too old qemus we don't even have to calcuate the
offsets and other stuff.
---
 src/qemu/qemu_driver.c  | 30 ++----------------------------
 src/qemu/qemu_monitor.h | 10 ----------
 2 files changed, 2 insertions(+), 38 deletions(-)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 77f4baa..2ca6700 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -3128,38 +3128,13 @@ qemuDomainSaveMemory(virQEMUDriverPtr driver,
     int directFlag = 0;
     virFileWrapperFdPtr wrapperFd = NULL;
     unsigned int wrapperFlags = VIR_FILE_WRAPPER_NON_BLOCKING;
-    unsigned long long pad;
-    unsigned long long offset;
-    size_t len;
-    char *xml = NULL;

     memset(&header, 0, sizeof(header));
     memcpy(header.magic, QEMU_SAVE_PARTIAL, sizeof(header.magic));
     header.version = QEMU_SAVE_VERSION;
     header.was_running = was_running ? 1 : 0;
-
     header.compressed = compressed;
-
-    len = strlen(domXML) + 1;
-    offset = sizeof(header) + len;
-
-    /* Due to way we append QEMU state on our header with dd,
-     * we need to ensure there's a 512 byte boundary. Unfortunately
-     * we don't have an explicit offset in the header, so we fake
-     * it by padding the XML string with NUL bytes.  Additionally,
-     * we want to ensure that virDomainSaveImageDefineXML can supply
-     * slightly larger XML, so we add a minimum padding prior to
-     * rounding out to page boundaries.
-     */
-    pad = 1024;
-    pad += (QEMU_MONITOR_MIGRATE_TO_FILE_BS -
-            ((offset + pad) % QEMU_MONITOR_MIGRATE_TO_FILE_BS));
-    if (VIR_ALLOC_N(xml, len + pad) < 0)
-        goto cleanup;
-    strcpy(xml, domXML);
-
-    offset += pad;
-    header.xml_len = len;
+    header.xml_len = strlen(domXML) + 1;

     /* Obtain the file handle.  */
     if ((flags & VIR_DOMAIN_SAVE_BYPASS_CACHE)) {
@@ -3184,7 +3159,7 @@ qemuDomainSaveMemory(virQEMUDriverPtr driver,
         goto cleanup;

     /* Write header to file, followed by XML */
-    if (qemuDomainSaveHeader(fd, path, xml, &header) < 0)
+    if (qemuDomainSaveHeader(fd, path, domXML, &header) < 0)
         goto cleanup;

     /* Perform the migration */
@@ -3226,7 +3201,6 @@ qemuDomainSaveMemory(virQEMUDriverPtr driver,
  cleanup:
     VIR_FORCE_CLOSE(fd);
     virFileWrapperFdFree(wrapperFd);
-    VIR_FREE(xml);

     if (ret < 0 && needUnlink)
         unlink(path);
diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
index d731344..134cbb6 100644
--- a/src/qemu/qemu_monitor.h
+++ b/src/qemu/qemu_monitor.h
@@ -560,16 +560,6 @@ int qemuMonitorMigrateToCommand(qemuMonitorPtr mon,
                                 unsigned int flags,
                                 const char * const *argv);

-/* In general, BS is the smallest fundamental block size we can use to
- * access a block device; everything must be aligned to a multiple of
- * this.  Linux generally supports a BS as small as 512, but with
- * newer disks with 4k sectors, performance is better if we guarantee
- * alignment to the sector size.  However, operating on BS-sized
- * blocks is painfully slow, so we also have a transfer size that is
- * larger but only aligned to the smaller block size.
- */
-# define QEMU_MONITOR_MIGRATE_TO_FILE_BS (1024llu * 4)
-
 int qemuMonitorMigrateToUnix(qemuMonitorPtr mon,
                              unsigned int flags,
                              const char *unixfile);
-- 
2.6.2




More information about the libvir-list mailing list