[pve-devel] [RFC qemu.git] add optional statesize to savevm-start

Dominik Csapak d.csapak at proxmox.com
Mon Mar 18 11:59:59 CET 2019


so that we can control the reserved size for the internal qemu state
from outside and the 30MiB are not hardcoded anymore

Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
---
this patch applies directly to a qemu repository with our patches applied,
instead of our pve-qemu repository

this way the patch is much more readable than sending a patch of a patch

 hmp-commands.hx |  7 ++++---
 hmp.c           |  3 ++-
 qapi/misc.json  |  6 +++++-
 savevm-async.c  | 11 +++++++++--
 4 files changed, 20 insertions(+), 7 deletions(-)

diff --git a/hmp-commands.hx b/hmp-commands.hx
index fe3d827e38..f4dc296479 100644
--- a/hmp-commands.hx
+++ b/hmp-commands.hx
@@ -1865,9 +1865,10 @@ ETEXI
 
     {
         .name       = "savevm-start",
-        .args_type  = "statefile:s?",
-        .params     = "[statefile]",
-        .help       = "Prepare for snapshot and halt VM. Save VM state to statefile.",
+        .args_type  = "statefile:s?,statesize:i?",
+        .params     = "[statefile] [statesize]",
+        .help       = "Prepare for snapshot and halt VM. Save VM state to statefile."
+                      "Statesize is the size reserved for the state in MiB.",
         .cmd = hmp_savevm_start,
     },
 
diff --git a/hmp.c b/hmp.c
index ad0f5954d3..6b3d6c4df7 100644
--- a/hmp.c
+++ b/hmp.c
@@ -2550,8 +2550,9 @@ void hmp_savevm_start(Monitor *mon, const QDict *qdict)
 {
     Error *errp = NULL;
     const char *statefile = qdict_get_try_str(qdict, "statefile");
+    uint32_t statesize = qdict_get_try_int(qdict, "statesize", -1);
 
-    qmp_savevm_start(statefile != NULL, statefile, &errp);
+    qmp_savevm_start(statefile != NULL, statefile, statesize != -1, statesize, &errp);
     hmp_handle_error(mon, &errp);
 }
 
diff --git a/qapi/misc.json b/qapi/misc.json
index b2fc2da955..a6e7256038 100644
--- a/qapi/misc.json
+++ b/qapi/misc.json
@@ -2482,9 +2482,13 @@
 # @savevm-start:
 #
 # Prepare for snapshot and halt VM. Save VM state to statefile.
+# 
+# @statefile: the statefile
+#
+# @statesize: the size reserved for the internal state
 #
 ##
-{ 'command': 'savevm-start', 'data': { '*statefile': 'str' } }
+{ 'command': 'savevm-start', 'data': { '*statefile': 'str', '*statesize': 'uint32' } }
 
 ##
 # @snapshot-drive:
diff --git a/savevm-async.c b/savevm-async.c
index 2a1d40842e..40265bb1a0 100644
--- a/savevm-async.c
+++ b/savevm-async.c
@@ -49,6 +49,7 @@ static struct SnapshotState {
     int64_t total_time;
     QEMUBH *cleanup_bh;
     QemuThread thread;
+    uint32_t statesize;
 } snap_state;
 
 SaveVMInfo *qmp_query_savevm(Error **errp)
@@ -237,7 +238,7 @@ static void *process_savevm_thread(void *opaque)
         qemu_savevm_state_pending(snap_state.file, 0, &pend_precopy, &pend_compatible, &pend_postcopy);
         pending_size = pend_precopy + pend_compatible + pend_postcopy;
 
-        maxlen = blk_getlength(snap_state.target) - 30*1024*1024;
+        maxlen = blk_getlength(snap_state.target) - snap_state.statesize*1024*1024;
 
         if (pending_size > 400000 && snap_state.bs_pos + pending_size < maxlen) {
             qemu_mutex_lock_iothread();
@@ -285,7 +286,7 @@ static void *process_savevm_thread(void *opaque)
     return NULL;
 }
 
-void qmp_savevm_start(bool has_statefile, const char *statefile, Error **errp)
+void qmp_savevm_start(bool has_statefile, const char *statefile, bool has_statesize, uint32_t statesize, Error **errp)
 {
     Error *local_err = NULL;
 
@@ -303,6 +304,12 @@ void qmp_savevm_start(bool has_statefile, const char *statefile, Error **errp)
     snap_state.total_time = qemu_clock_get_ms(QEMU_CLOCK_REALTIME);
     snap_state.blocker = NULL;
 
+    if (has_statesize) {
+	snap_state.statesize = statesize;
+    } else {
+	snap_state.statesize = 512;
+    }
+
     if (snap_state.error) {
         error_free(snap_state.error);
         snap_state.error = NULL;
-- 
2.11.0




More information about the pve-devel mailing list