]> Zhao Yanbai Git Server - minix.git/commitdiff
VM: undo actions after live-update rollback 46/3146/1
authorDavid van Moolenbroek <david@minix3.org>
Tue, 14 Jul 2015 04:44:35 +0000 (06:44 +0200)
committerDavid van Moolenbroek <david@minix3.org>
Thu, 17 Sep 2015 14:00:32 +0000 (14:00 +0000)
During live update, the new instance of VM may make changes that,
after a rollback, have to be undone by the old instance of VM, in
particular because both instances share (read-write) all dynamically
allocated pages.

Change-Id: I2bcfa8e627ca6084b1991e0af7cccecc683894a2

minix/servers/vm/main.c

index 5fb5fb6a2b8a1e03a9774982fef4cf6d4576966c..6f37e676c1d7e22ad853e3d5dc8f40547499dab3 100644 (file)
@@ -194,6 +194,29 @@ int main(void)
   return(OK);
 }
 
+static void sef_cb_lu_state_changed(int old_state, int state)
+{
+/* Called whenever the live-update state changes. We need to restore certain
+ * state in the old VM instance after a live update has failed, because some
+ * but not all memory is shared between the two VM instances.
+ */
+  struct vmproc *vmp;
+
+  if (state == SEF_LU_STATE_NULL) {
+       /* Undo some of the changes that may have been made by the new VM
+        * instance.  If the new VM instance is us, nothing happens.
+        */
+       vmp = &vmproc[VM_PROC_NR];
+
+       /* Rebind page tables. */
+       pt_bind(&vmp->vm_pt, vmp);
+       pt_clearmapcache();
+
+       /* Readjust process references. */
+       adjust_proc_refs();
+  }
+}
+
 static void sef_local_startup(void)
 {
        /* Register init callbacks. */
@@ -206,6 +229,9 @@ static void sef_local_startup(void)
        if (__vm_init_fresh)
                sef_setcb_init_response(sef_cb_init_response_rs_asyn_once);
 
+       /* Register live update callbacks. */
+       sef_setcb_lu_state_changed(sef_cb_lu_state_changed);
+
        /* Register signal callbacks. */
        sef_setcb_signal_handler(sef_cb_signal_handler);