Re: [Qemu-devel] [PATCH COLO-Frame v9 06/32] migration: Integrate COLO checkpoint process into loadvm

2015-10-20 Thread zhanghailiang

On 2015/10/19 17:17, Dr. David Alan Gilbert wrote:

* zhanghailiang (zhang.zhanghaili...@huawei.com) wrote:

Switch from normal migration loadvm process into COLO checkpoint process if
COLO mode is enabled.
We add three new members to struct MigrationIncomingState, 
'have_colo_incoming_thread'
and 'colo_incoming_thread' record the colo related threads for secondary VM,
'migration_incoming_co' records the original migration incoming coroutine.

Signed-off-by: zhanghailiang 
Signed-off-by: Li Zhijian 
Signed-off-by: Yang Hongyang 


Mostly OK, some mostly minor comments, and one question below:


---
  include/migration/colo.h  |  7 +++
  include/migration/migration.h |  7 +++
  migration/colo-comm.c | 10 ++
  migration/colo.c  | 22 ++
  migration/migration.c | 33 +++--
  stubs/migration-colo.c| 10 ++
  trace-events  |  1 +
  7 files changed, 80 insertions(+), 10 deletions(-)

diff --git a/include/migration/colo.h b/include/migration/colo.h
index dface19..58849f7 100644
--- a/include/migration/colo.h
+++ b/include/migration/colo.h
@@ -15,6 +15,8 @@

  #include "qemu-common.h"
  #include "migration/migration.h"
+#include "block/coroutine.h"
+#include "qemu/thread.h"

  bool colo_supported(void);
  void colo_info_mig_init(void);
@@ -22,4 +24,9 @@ void colo_info_mig_init(void);
  void colo_init_checkpointer(MigrationState *s);
  bool migration_in_colo_state(void);

+/* loadvm */
+bool migration_incoming_enable_colo(void);
+void migration_incoming_exit_colo(void);
+void *colo_process_incoming_thread(void *opaque);
+bool migration_incoming_in_colo_state(void);
  #endif
diff --git a/include/migration/migration.h b/include/migration/migration.h
index a62068f..9cdd6b6 100644
--- a/include/migration/migration.h
+++ b/include/migration/migration.h
@@ -22,6 +22,7 @@
  #include "migration/vmstate.h"
  #include "qapi-types.h"
  #include "exec/cpu-common.h"
+#include "block/coroutine.h"

  #define QEMU_VM_FILE_MAGIC   0x5145564d
  #define QEMU_VM_FILE_VERSION_COMPAT  0x0002
@@ -51,6 +52,12 @@ struct MigrationIncomingState {
  QEMUFile *file;

  int state;
+
+bool have_colo_incoming_thread;
+QemuThread colo_incoming_thread;
+/* The coroutine we should enter (back) after failover */
+Coroutine *migration_incoming_co;
+
  /* See savevm.c */
  LoadStateEntry_Head loadvm_handlers;
  };
diff --git a/migration/colo-comm.c b/migration/colo-comm.c
index 4330bd8..0808d6c 100644
--- a/migration/colo-comm.c
+++ b/migration/colo-comm.c
@@ -52,3 +52,13 @@ void colo_info_mig_init(void)
  {
  vmstate_register(NULL, 0, _state, _info);
  }
+
+bool migration_incoming_enable_colo(void)
+{
+return colo_info.colo_requested;
+}
+
+void migration_incoming_exit_colo(void)
+{
+colo_info.colo_requested = 0;
+}
diff --git a/migration/colo.c b/migration/colo.c
index 97e64a3..a341eee 100644
--- a/migration/colo.c
+++ b/migration/colo.c
@@ -13,6 +13,7 @@
  #include "sysemu/sysemu.h"
  #include "migration/colo.h"
  #include "trace.h"
+#include "qemu/error-report.h"

  static QEMUBH *colo_bh;

@@ -28,6 +29,13 @@ bool migration_in_colo_state(void)
  return (s->state == MIGRATION_STATUS_COLO);
  }

+bool migration_incoming_in_colo_state(void)
+{
+MigrationIncomingState *mis = migration_incoming_get_current();
+
+return (mis && (mis->state == MIGRATION_STATUS_COLO));


Can remove outer brackets.



OK.


+}
+
  static void *colo_thread(void *opaque)
  {
  MigrationState *s = opaque;
@@ -74,3 +82,17 @@ void colo_init_checkpointer(MigrationState *s)
  colo_bh = qemu_bh_new(colo_start_checkpointer, s);
  qemu_bh_schedule(colo_bh);
  }
+
+void *colo_process_incoming_thread(void *opaque)
+{
+MigrationIncomingState *mis = opaque;
+
+migrate_set_state(>state, MIGRATION_STATUS_ACTIVE,
+  MIGRATION_STATUS_COLO);
+
+/* TODO: COLO checkpoint restore loop */
+
+migration_incoming_exit_colo();
+
+return NULL;
+}
diff --git a/migration/migration.c b/migration/migration.c
index bee61aa..241689f 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -280,7 +280,28 @@ static void process_incoming_migration_co(void *opaque)
MIGRATION_STATUS_ACTIVE);
  ret = qemu_loadvm_state(f);

-qemu_fclose(f);
+if (!ret) {
+/* Make sure all file formats flush their mutable metadata */
+bdrv_invalidate_cache_all(_err);
+if (local_err) {
+error_report_err(local_err);
+migrate_decompress_threads_join();
+exit(EXIT_FAILURE);
+}
+}
+/* we get colo info, and know if we are in colo mode */
+if (!ret && migration_incoming_enable_colo()) {
+mis->migration_incoming_co = qemu_coroutine_self();
+

Re: [Qemu-devel] [PATCH COLO-Frame v9 06/32] migration: Integrate COLO checkpoint process into loadvm

2015-10-19 Thread Dr. David Alan Gilbert
* zhanghailiang (zhang.zhanghaili...@huawei.com) wrote:
> Switch from normal migration loadvm process into COLO checkpoint process if
> COLO mode is enabled.
> We add three new members to struct MigrationIncomingState, 
> 'have_colo_incoming_thread'
> and 'colo_incoming_thread' record the colo related threads for secondary VM,
> 'migration_incoming_co' records the original migration incoming coroutine.
> 
> Signed-off-by: zhanghailiang 
> Signed-off-by: Li Zhijian 
> Signed-off-by: Yang Hongyang 

Mostly OK, some mostly minor comments, and one question below:

> ---
>  include/migration/colo.h  |  7 +++
>  include/migration/migration.h |  7 +++
>  migration/colo-comm.c | 10 ++
>  migration/colo.c  | 22 ++
>  migration/migration.c | 33 +++--
>  stubs/migration-colo.c| 10 ++
>  trace-events  |  1 +
>  7 files changed, 80 insertions(+), 10 deletions(-)
> 
> diff --git a/include/migration/colo.h b/include/migration/colo.h
> index dface19..58849f7 100644
> --- a/include/migration/colo.h
> +++ b/include/migration/colo.h
> @@ -15,6 +15,8 @@
>  
>  #include "qemu-common.h"
>  #include "migration/migration.h"
> +#include "block/coroutine.h"
> +#include "qemu/thread.h"
>  
>  bool colo_supported(void);
>  void colo_info_mig_init(void);
> @@ -22,4 +24,9 @@ void colo_info_mig_init(void);
>  void colo_init_checkpointer(MigrationState *s);
>  bool migration_in_colo_state(void);
>  
> +/* loadvm */
> +bool migration_incoming_enable_colo(void);
> +void migration_incoming_exit_colo(void);
> +void *colo_process_incoming_thread(void *opaque);
> +bool migration_incoming_in_colo_state(void);
>  #endif
> diff --git a/include/migration/migration.h b/include/migration/migration.h
> index a62068f..9cdd6b6 100644
> --- a/include/migration/migration.h
> +++ b/include/migration/migration.h
> @@ -22,6 +22,7 @@
>  #include "migration/vmstate.h"
>  #include "qapi-types.h"
>  #include "exec/cpu-common.h"
> +#include "block/coroutine.h"
>  
>  #define QEMU_VM_FILE_MAGIC   0x5145564d
>  #define QEMU_VM_FILE_VERSION_COMPAT  0x0002
> @@ -51,6 +52,12 @@ struct MigrationIncomingState {
>  QEMUFile *file;
>  
>  int state;
> +
> +bool have_colo_incoming_thread;
> +QemuThread colo_incoming_thread;
> +/* The coroutine we should enter (back) after failover */
> +Coroutine *migration_incoming_co;
> +
>  /* See savevm.c */
>  LoadStateEntry_Head loadvm_handlers;
>  };
> diff --git a/migration/colo-comm.c b/migration/colo-comm.c
> index 4330bd8..0808d6c 100644
> --- a/migration/colo-comm.c
> +++ b/migration/colo-comm.c
> @@ -52,3 +52,13 @@ void colo_info_mig_init(void)
>  {
>  vmstate_register(NULL, 0, _state, _info);
>  }
> +
> +bool migration_incoming_enable_colo(void)
> +{
> +return colo_info.colo_requested;
> +}
> +
> +void migration_incoming_exit_colo(void)
> +{
> +colo_info.colo_requested = 0;
> +}
> diff --git a/migration/colo.c b/migration/colo.c
> index 97e64a3..a341eee 100644
> --- a/migration/colo.c
> +++ b/migration/colo.c
> @@ -13,6 +13,7 @@
>  #include "sysemu/sysemu.h"
>  #include "migration/colo.h"
>  #include "trace.h"
> +#include "qemu/error-report.h"
>  
>  static QEMUBH *colo_bh;
>  
> @@ -28,6 +29,13 @@ bool migration_in_colo_state(void)
>  return (s->state == MIGRATION_STATUS_COLO);
>  }
>  
> +bool migration_incoming_in_colo_state(void)
> +{
> +MigrationIncomingState *mis = migration_incoming_get_current();
> +
> +return (mis && (mis->state == MIGRATION_STATUS_COLO));

Can remove outer brackets.

> +}
> +
>  static void *colo_thread(void *opaque)
>  {
>  MigrationState *s = opaque;
> @@ -74,3 +82,17 @@ void colo_init_checkpointer(MigrationState *s)
>  colo_bh = qemu_bh_new(colo_start_checkpointer, s);
>  qemu_bh_schedule(colo_bh);
>  }
> +
> +void *colo_process_incoming_thread(void *opaque)
> +{
> +MigrationIncomingState *mis = opaque;
> +
> +migrate_set_state(>state, MIGRATION_STATUS_ACTIVE,
> +  MIGRATION_STATUS_COLO);
> +
> +/* TODO: COLO checkpoint restore loop */
> +
> +migration_incoming_exit_colo();
> +
> +return NULL;
> +}
> diff --git a/migration/migration.c b/migration/migration.c
> index bee61aa..241689f 100644
> --- a/migration/migration.c
> +++ b/migration/migration.c
> @@ -280,7 +280,28 @@ static void process_incoming_migration_co(void *opaque)
>MIGRATION_STATUS_ACTIVE);
>  ret = qemu_loadvm_state(f);
>  
> -qemu_fclose(f);
> +if (!ret) {
> +/* Make sure all file formats flush their mutable metadata */
> +bdrv_invalidate_cache_all(_err);
> +if (local_err) {
> +error_report_err(local_err);
> +migrate_decompress_threads_join();
> +exit(EXIT_FAILURE);
> +}
> +}
> +/* we get colo 

[Qemu-devel] [PATCH COLO-Frame v9 06/32] migration: Integrate COLO checkpoint process into loadvm

2015-09-02 Thread zhanghailiang
Switch from normal migration loadvm process into COLO checkpoint process if
COLO mode is enabled.
We add three new members to struct MigrationIncomingState, 
'have_colo_incoming_thread'
and 'colo_incoming_thread' record the colo related threads for secondary VM,
'migration_incoming_co' records the original migration incoming coroutine.

Signed-off-by: zhanghailiang 
Signed-off-by: Li Zhijian 
Signed-off-by: Yang Hongyang 
---
 include/migration/colo.h  |  7 +++
 include/migration/migration.h |  7 +++
 migration/colo-comm.c | 10 ++
 migration/colo.c  | 22 ++
 migration/migration.c | 33 +++--
 stubs/migration-colo.c| 10 ++
 trace-events  |  1 +
 7 files changed, 80 insertions(+), 10 deletions(-)

diff --git a/include/migration/colo.h b/include/migration/colo.h
index dface19..58849f7 100644
--- a/include/migration/colo.h
+++ b/include/migration/colo.h
@@ -15,6 +15,8 @@
 
 #include "qemu-common.h"
 #include "migration/migration.h"
+#include "block/coroutine.h"
+#include "qemu/thread.h"
 
 bool colo_supported(void);
 void colo_info_mig_init(void);
@@ -22,4 +24,9 @@ void colo_info_mig_init(void);
 void colo_init_checkpointer(MigrationState *s);
 bool migration_in_colo_state(void);
 
+/* loadvm */
+bool migration_incoming_enable_colo(void);
+void migration_incoming_exit_colo(void);
+void *colo_process_incoming_thread(void *opaque);
+bool migration_incoming_in_colo_state(void);
 #endif
diff --git a/include/migration/migration.h b/include/migration/migration.h
index a62068f..9cdd6b6 100644
--- a/include/migration/migration.h
+++ b/include/migration/migration.h
@@ -22,6 +22,7 @@
 #include "migration/vmstate.h"
 #include "qapi-types.h"
 #include "exec/cpu-common.h"
+#include "block/coroutine.h"
 
 #define QEMU_VM_FILE_MAGIC   0x5145564d
 #define QEMU_VM_FILE_VERSION_COMPAT  0x0002
@@ -51,6 +52,12 @@ struct MigrationIncomingState {
 QEMUFile *file;
 
 int state;
+
+bool have_colo_incoming_thread;
+QemuThread colo_incoming_thread;
+/* The coroutine we should enter (back) after failover */
+Coroutine *migration_incoming_co;
+
 /* See savevm.c */
 LoadStateEntry_Head loadvm_handlers;
 };
diff --git a/migration/colo-comm.c b/migration/colo-comm.c
index 4330bd8..0808d6c 100644
--- a/migration/colo-comm.c
+++ b/migration/colo-comm.c
@@ -52,3 +52,13 @@ void colo_info_mig_init(void)
 {
 vmstate_register(NULL, 0, _state, _info);
 }
+
+bool migration_incoming_enable_colo(void)
+{
+return colo_info.colo_requested;
+}
+
+void migration_incoming_exit_colo(void)
+{
+colo_info.colo_requested = 0;
+}
diff --git a/migration/colo.c b/migration/colo.c
index 97e64a3..a341eee 100644
--- a/migration/colo.c
+++ b/migration/colo.c
@@ -13,6 +13,7 @@
 #include "sysemu/sysemu.h"
 #include "migration/colo.h"
 #include "trace.h"
+#include "qemu/error-report.h"
 
 static QEMUBH *colo_bh;
 
@@ -28,6 +29,13 @@ bool migration_in_colo_state(void)
 return (s->state == MIGRATION_STATUS_COLO);
 }
 
+bool migration_incoming_in_colo_state(void)
+{
+MigrationIncomingState *mis = migration_incoming_get_current();
+
+return (mis && (mis->state == MIGRATION_STATUS_COLO));
+}
+
 static void *colo_thread(void *opaque)
 {
 MigrationState *s = opaque;
@@ -74,3 +82,17 @@ void colo_init_checkpointer(MigrationState *s)
 colo_bh = qemu_bh_new(colo_start_checkpointer, s);
 qemu_bh_schedule(colo_bh);
 }
+
+void *colo_process_incoming_thread(void *opaque)
+{
+MigrationIncomingState *mis = opaque;
+
+migrate_set_state(>state, MIGRATION_STATUS_ACTIVE,
+  MIGRATION_STATUS_COLO);
+
+/* TODO: COLO checkpoint restore loop */
+
+migration_incoming_exit_colo();
+
+return NULL;
+}
diff --git a/migration/migration.c b/migration/migration.c
index bee61aa..241689f 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -280,7 +280,28 @@ static void process_incoming_migration_co(void *opaque)
   MIGRATION_STATUS_ACTIVE);
 ret = qemu_loadvm_state(f);
 
-qemu_fclose(f);
+if (!ret) {
+/* Make sure all file formats flush their mutable metadata */
+bdrv_invalidate_cache_all(_err);
+if (local_err) {
+error_report_err(local_err);
+migrate_decompress_threads_join();
+exit(EXIT_FAILURE);
+}
+}
+/* we get colo info, and know if we are in colo mode */
+if (!ret && migration_incoming_enable_colo()) {
+mis->migration_incoming_co = qemu_coroutine_self();
+qemu_thread_create(>colo_incoming_thread, "colo incoming",
+ colo_process_incoming_thread, mis, QEMU_THREAD_JOINABLE);
+mis->have_colo_incoming_thread = true;
+qemu_coroutine_yield();
+
+/* Wait checkpoint incoming thread exit before free resource */
+