]> Zhao Yanbai Git Server - minix.git/commitdiff
sef: Support for LLVM ltckpt instrumentation. 15/3115/1
authorCristiano Giuffrida <giuffrida@cs.vu.nl>
Wed, 29 Oct 2014 22:18:38 +0000 (23:18 +0100)
committerDavid van Moolenbroek <david@minix3.org>
Thu, 17 Sep 2015 13:36:35 +0000 (13:36 +0000)
Change-Id: I86073bddc3a820ab3d7c5d016ea1348840b0260a

minix/include/minix/sef.h
minix/lib/libsys/sef_init.c
minix/lib/libsys/sef_llvm.c

index 5f9920eb4dfb1b5d81ad6238e1eae71f2e50c454..061502e1ecc6d143bf8766d59209768eb2bda927 100644 (file)
@@ -69,6 +69,7 @@ int sef_cb_init_fail(int type, sef_init_info_t *info);
 int sef_cb_init_reset(int type, sef_init_info_t *info);
 int sef_cb_init_crash(int type, sef_init_info_t *info);
 int sef_cb_init_timeout(int type, sef_init_info_t *info);
+int sef_cb_init_restart_generic(int type, sef_init_info_t *info);
 int sef_cb_init_identity_state_transfer(int type, sef_init_info_t *info);
 int sef_cb_init_lu_identity_as_restart(int type, sef_init_info_t *info);
 int sef_cb_init_lu_generic(int type, sef_init_info_t *info);
@@ -80,7 +81,7 @@ int sef_cb_init_response_rs_asyn_once(message *m_ptr);
 #define SEF_CB_INIT_LU_NULL             sef_cb_init_null
 #define SEF_CB_INIT_RESTART_NULL        sef_cb_init_null
 #define SEF_CB_INIT_RESPONSE_NULL       sef_cb_init_response_null
-#define SEF_CB_INIT_RESTART_STATEFUL    sef_cb_init_identity_state_transfer
+#define SEF_CB_INIT_RESTART_STATEFUL    sef_cb_init_restart_generic
 
 #define SEF_CB_INIT_FRESH_DEFAULT       sef_cb_init_null
 #define SEF_CB_INIT_LU_DEFAULT          sef_cb_init_lu_generic
@@ -375,6 +376,7 @@ int sef_llvm_ac_munmap(void *buf, size_t len);
 
 int sef_llvm_ltckpt_enabled(void);
 int sef_llvm_get_ltckpt_offset(void);
+int sef_llvm_ltckpt_restart(int type, sef_init_info_t *info);
 
 #if !defined(USE_LIVEUPDATE)
 #undef INTERCEPT_SEF_LU_REQUESTS
index 41ec8e68b082e78b9f1859d76eb02323f02be066..425727e6ce0b167e5d932502842269cf1a083e4d 100644 (file)
@@ -306,6 +306,25 @@ int sef_cb_init_timeout(int UNUSED(type), sef_init_info_t *UNUSED(info))
   return EBADCALL;
 }
 
+/*===========================================================================*
+ *                        sef_cb_init_restart_generic                       *
+ *===========================================================================*/
+int sef_cb_init_restart_generic(int type, sef_init_info_t *info)
+{
+  /* Always resort to simple identity transfer for self updates. */
+  if (type == SEF_INIT_LU && (info->flags & SEF_LU_SELF))
+      return sef_cb_init_identity_state_transfer(type, info);
+
+  /* Can only handle restart otherwise. */
+  if(type != SEF_INIT_RESTART) {
+      printf("sef_cb_init_restart_generic: init failed\n");
+      return ENOSYS;
+  }
+
+  /* Perform instrumentation-supported checkpoint-restart. */
+  return sef_llvm_ltckpt_restart(type, info);
+}
+
 /*===========================================================================*
  *                    sef_cb_init_identity_state_transfer                   *
  *===========================================================================*/
index 90eb3d5f133b2801e34039027d0bdb1f4ed1a301..f0ddd7dd7b1cca1febaff005006c64e12efde9eb 100644 (file)
@@ -209,8 +209,8 @@ int sef_llvm_ac_munmap(void *buf, size_t len)
  *===========================================================================*/
 int sef_llvm_ltckpt_enabled()
 {
-    extern int __attribute__((weak)) ltckpt_get_offset();
-    if (!ltckpt_get_offset)
+    extern int __attribute__((weak)) ltckpt_mechanism_enabled(void);
+    if (!sef_llvm_get_ltckpt_offset() || !ltckpt_mechanism_enabled())
         return 0;
     return 1;
 }
@@ -226,3 +226,17 @@ int sef_llvm_get_ltckpt_offset()
     return ltckpt_get_offset();
 }
 
+/*===========================================================================*
+ *                          sef_llvm_ltckpt_restart                         *
+ *===========================================================================*/
+int sef_llvm_ltckpt_restart(int type, sef_init_info_t *info)
+{
+    extern int __attribute__((weak)) ltckpt_restart(void *);
+
+    if(!sef_llvm_ltckpt_enabled())
+        return sef_cb_init_identity_state_transfer(type, info);
+
+    assert(ltckpt_restart);
+    return ltckpt_restart(info);
+}
+