VM: undo actions after live-update rollback
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
This commit is contained in:
parent
40aba308a0
commit
5a4672e300
1 changed files with 26 additions and 0 deletions
|
@ -194,6 +194,29 @@ int main(void)
|
||||||
return(OK);
|
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)
|
static void sef_local_startup(void)
|
||||||
{
|
{
|
||||||
/* Register init callbacks. */
|
/* Register init callbacks. */
|
||||||
|
@ -206,6 +229,9 @@ static void sef_local_startup(void)
|
||||||
if (__vm_init_fresh)
|
if (__vm_init_fresh)
|
||||||
sef_setcb_init_response(sef_cb_init_response_rs_asyn_once);
|
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. */
|
/* Register signal callbacks. */
|
||||||
sef_setcb_signal_handler(sef_cb_signal_handler);
|
sef_setcb_signal_handler(sef_cb_signal_handler);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue