diff mbox

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

Message ID 5083220e72337d11c2f340b520d03af426577790.1338802192.git.yamahata@valinux.co.jp
State New
Headers show

Commit Message

Isaku Yamahata June 4, 2012, 9:57 a.m. UTC
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(-)

Comments

Juan Quintela June 8, 2012, 10:52 a.m. UTC | #1
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. UTC | #2
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.
diff mbox

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;