Register a cpr-luo migration notifier that closes an active source LUO
session after migration failure.

Signed-off-by: Dongli Zhang <[email protected]>
---
 include/migration/cpr.h  |  1 +
 migration/cpr-luo-stub.c |  4 ++++
 migration/cpr-luo.c      | 20 ++++++++++++++++++++
 migration/migration.c    |  1 +
 4 files changed, 26 insertions(+)

diff --git a/include/migration/cpr.h b/include/migration/cpr.h
index 96529ab3a1..239cddf352 100644
--- a/include/migration/cpr.h
+++ b/include/migration/cpr.h
@@ -97,5 +97,6 @@ bool cpr_luo_retrieve_fds(Error **errp);
 bool cpr_luo_save(QEMUFile *f, Error **errp);
 QEMUFile *cpr_luo_load(Error **errp);
 void cpr_luo_incoming_finish(void);
+void cpr_luo_init(void);
 void cpr_luo_abort(void);
 #endif
diff --git a/migration/cpr-luo-stub.c b/migration/cpr-luo-stub.c
index 22a7037c20..4eb14ccbbc 100644
--- a/migration/cpr-luo-stub.c
+++ b/migration/cpr-luo-stub.c
@@ -69,6 +69,10 @@ void cpr_luo_incoming_finish(void)
 {
 }
 
+void cpr_luo_init(void)
+{
+}
+
 void cpr_luo_abort(void)
 {
 }
diff --git a/migration/cpr-luo.c b/migration/cpr-luo.c
index d9aba3bfc5..02ca947507 100644
--- a/migration/cpr-luo.c
+++ b/migration/cpr-luo.c
@@ -11,6 +11,7 @@
 #include "io/channel-file.h"
 #include "linux-headers/linux/liveupdate.h"
 #include "migration/cpr.h"
+#include "migration/migration.h"
 #include "migration/qemu-file.h"
 #include "qapi/error.h"
 #include "qemu/error-report.h"
@@ -296,6 +297,25 @@ void cpr_luo_incoming_finish(void)
     cpr_state.luo_session_fd = -1;
 }
 
+static int cpr_luo_notifier(NotifierWithReturn *notifier,
+                            MigrationEvent *e, Error **errp)
+{
+
+    if (e->type == MIG_EVENT_FAILED && cpr_state.luo_session_fd >= 0) {
+        cpr_luo_abort();
+    }
+
+    return 0;
+}
+
+void cpr_luo_init(void)
+{
+    static NotifierWithReturn luo_notifier;
+
+    migration_add_notifier_mode(&luo_notifier, cpr_luo_notifier,
+                                MIG_MODE_CPR_LUO);
+}
+
 void cpr_luo_abort(void)
 {
     int session_fd = cpr_state.luo_session_fd;
diff --git a/migration/migration.c b/migration/migration.c
index 7c2bb982a5..a9503607d5 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -340,6 +340,7 @@ void migration_object_init(void)
     ram_mig_init();
     dirty_bitmap_mig_init();
     cpr_exec_init();
+    cpr_luo_init();
 
     /* Initialize cpu throttle timers */
     cpu_throttle_init();
-- 
2.43.5


Reply via email to