Patchwork [v2,33/41] postcopy: introduce -postcopy and -postcopy-flags option

login
register
mail settings
Submitter Isaku Yamahata
Date June 4, 2012, 9:57 a.m.
Message ID <5083220e72337d11c2f340b520d03af426577790.1338802192.git.yamahata@valinux.co.jp>
Download mbox | patch
Permalink /patch/162771/
State New
Headers show

Comments

Isaku Yamahata - June 4, 2012, 9:57 a.m.
This patch prepares for postcopy livemigration.
It introduces -postcopy option and its internal flag, migration_postcopy.
It introduces -postcopy-flags for chaging the behavior of incoming postcopy
mainly for benchmark/debug.

Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
---
 migration.h     |    3 +++
 qemu-options.hx |   22 ++++++++++++++++++++++
 vl.c            |    8 ++++++++
 3 files changed, 33 insertions(+), 0 deletions(-)
Juan Quintela - June 8, 2012, 10:52 a.m.
Isaku Yamahata <yamahata@valinux.co.jp> wrote:
> This patch prepares for postcopy livemigration.
> It introduces -postcopy option and its internal flag, migration_postcopy.
> It introduces -postcopy-flags for chaging the behavior of incoming postcopy
> mainly for benchmark/debug.

Why do we need postcopy flag?  -incoming should be enough to detect that
we are doing postcopy.

    QLIST_HEAD(, LoadStateEntry) loadvm_handlers =
        QLIST_HEAD_INITIALIZER(loadvm_handlers);
    LoadStateEntry *le, *new_le;
    uint8_t section_type;
    unsigned int v;
    int ret;

    if (qemu_savevm_state_blocked(NULL)) {
        return -EINVAL;
    }

    v = qemu_get_be32(f);
    if (v != QEMU_VM_FILE_MAGIC)
        return -EINVAL;

    v = qemu_get_be32(f);
    if (v == QEMU_VM_FILE_VERSION_COMPAT) {
        fprintf(stderr, "SaveVM v2 format is obsolete and don't work anymore\n");
        return -ENOTSUP;
    }
    if (v != QEMU_VM_FILE_VERSION)
        return -ENOTSUP;

Shouldn't we be able to change some version field here and make the
"recognition of postcopy automatic"?  Having to hack around a new
command line option for each page is not going to be nice.  And about
postcopy flags, if they are for "incoming side", please consider just
sent that flags on the stream as a first field?

Thanks, Juan.
Isaku Yamahata - June 8, 2012, 4:07 p.m.
On Fri, Jun 08, 2012 at 12:52:54PM +0200, Juan Quintela wrote:
> Isaku Yamahata <yamahata@valinux.co.jp> wrote:
> > This patch prepares for postcopy livemigration.
> > It introduces -postcopy option and its internal flag, migration_postcopy.
> > It introduces -postcopy-flags for chaging the behavior of incoming postcopy
> > mainly for benchmark/debug.
> 
> Why do we need postcopy flag?  -incoming should be enough to detect that
> we are doing postcopy.
> 
>     QLIST_HEAD(, LoadStateEntry) loadvm_handlers =
>         QLIST_HEAD_INITIALIZER(loadvm_handlers);
>     LoadStateEntry *le, *new_le;
>     uint8_t section_type;
>     unsigned int v;
>     int ret;
> 
>     if (qemu_savevm_state_blocked(NULL)) {
>         return -EINVAL;
>     }
> 
>     v = qemu_get_be32(f);
>     if (v != QEMU_VM_FILE_MAGIC)
>         return -EINVAL;
> 
>     v = qemu_get_be32(f);
>     if (v == QEMU_VM_FILE_VERSION_COMPAT) {
>         fprintf(stderr, "SaveVM v2 format is obsolete and don't work anymore\n");
>         return -ENOTSUP;
>     }
>     if (v != QEMU_VM_FILE_VERSION)
>         return -ENOTSUP;
> 
> Shouldn't we be able to change some version field here and make the
> "recognition of postcopy automatic"?  Having to hack around a new
> command line option for each page is not going to be nice.  And about
> postcopy flags, if they are for "incoming side", please consider just
> sent that flags on the stream as a first field?

Yes, you are right.
If bumping version is allowed, -postcopy can be dropped with auto detection.
-postcopy-flags can be dropped because it is used only for benchmark purpose
to change incoming side behavior independent of outgoing side.

Patch

diff --git a/migration.h b/migration.h
index 59e6e68..4bbcf06 100644
--- a/migration.h
+++ b/migration.h
@@ -103,4 +103,7 @@  void migrate_add_blocker(Error *reason);
  */
 void migrate_del_blocker(Error *reason);
 
+extern bool incoming_postcopy;
+extern unsigned long incoming_postcopy_flags;
+
 #endif
diff --git a/qemu-options.hx b/qemu-options.hx
index 8b66264..a9af31e 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -2616,6 +2616,28 @@  STEXI
 Prepare for incoming migration, listen on @var{port}.
 ETEXI
 
+DEF("postcopy", 0, QEMU_OPTION_postcopy,
+    "-postcopy	postcopy incoming migration when -incoming is specified\n",
+    QEMU_ARCH_ALL)
+STEXI
+@item -postcopy
+@findex -postcopy
+start incoming migration in postcopy mode.
+ETEXI
+
+DEF("postcopy-flags", HAS_ARG, QEMU_OPTION_postcopy_flags,
+    "-postcopy-flags unsigned-int(flags)\n"
+    "	                flags for postcopy incoming migration\n"
+    "                   when -incoming and -postcopy are specified.\n"
+    "                   This is for benchmark/debug purpose (default: 0)\n",
+    QEMU_ARCH_ALL)
+STEXI
+@item -postcopy-flags int
+@findex -postcopy-flags
+Specify flags for incoming postcopy migration when -incoming and -postcopy are
+specified. This is for benchamrk/debug purpose. (default: 0)
+ETEXI
+
 DEF("nodefaults", 0, QEMU_OPTION_nodefaults, \
     "-nodefaults     don't create default devices\n", QEMU_ARCH_ALL)
 STEXI
diff --git a/vl.c b/vl.c
index 62dc343..1674abb 100644
--- a/vl.c
+++ b/vl.c
@@ -189,6 +189,8 @@  int mem_prealloc = 0; /* force preallocation of physical target memory */
 int nb_nics;
 NICInfo nd_table[MAX_NICS];
 int autostart;
+bool incoming_postcopy = false; /* When -incoming is specified, postcopy mode */
+unsigned long incoming_postcopy_flags = 0; /* flags for postcopy incoming mode */
 static int rtc_utc = 1;
 static int rtc_date_offset = -1; /* -1 means no change */
 QEMUClock *rtc_clock;
@@ -3115,6 +3117,12 @@  int main(int argc, char **argv, char **envp)
                 incoming = optarg;
                 runstate_set(RUN_STATE_INMIGRATE);
                 break;
+            case QEMU_OPTION_postcopy:
+                incoming_postcopy = true;
+                break;
+            case QEMU_OPTION_postcopy_flags:
+                incoming_postcopy_flags = strtoul(optarg, NULL, 0);
+                break;
             case QEMU_OPTION_nodefaults:
                 default_serial = 0;
                 default_parallel = 0;