SMP - do_update fix
- adjust_proc_slot() must preserve scheduling info, for example on which cpu the process should run - do_update() - consitency check
This commit is contained in:
parent
192db70960
commit
0468fca72b
1 changed files with 11 additions and 0 deletions
|
@ -9,6 +9,7 @@
|
||||||
#include "kernel/system.h"
|
#include "kernel/system.h"
|
||||||
#include "kernel/ipc.h"
|
#include "kernel/ipc.h"
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
#if USE_UPDATE
|
#if USE_UPDATE
|
||||||
|
|
||||||
|
@ -64,6 +65,8 @@ PUBLIC int do_update(struct proc * caller, message * m_ptr)
|
||||||
return EPERM;
|
return EPERM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
assert(!proc_is_runnable(src_rp) && !proc_is_runnable(dst_rp));
|
||||||
|
|
||||||
/* Check if processes are updatable. */
|
/* Check if processes are updatable. */
|
||||||
if(!proc_is_updatable(src_rp) || !proc_is_updatable(dst_rp)) {
|
if(!proc_is_updatable(src_rp) || !proc_is_updatable(dst_rp)) {
|
||||||
return EBUSY;
|
return EBUSY;
|
||||||
|
@ -138,6 +141,14 @@ PRIVATE void adjust_proc_slot(struct proc *rp, struct proc *from_rp)
|
||||||
rp->p_priv = from_rp->p_priv;
|
rp->p_priv = from_rp->p_priv;
|
||||||
priv(rp)->s_proc_nr = from_rp->p_nr;
|
priv(rp)->s_proc_nr = from_rp->p_nr;
|
||||||
rp->p_caller_q = from_rp->p_caller_q;
|
rp->p_caller_q = from_rp->p_caller_q;
|
||||||
|
|
||||||
|
/* preserve scheduling */
|
||||||
|
rp->p_scheduler = from_rp->p_scheduler;
|
||||||
|
#ifdef CONFIG_SMP
|
||||||
|
rp->p_cpu = from_rp->p_cpu;
|
||||||
|
memcpy(rp->p_cpu_mask, from_rp->p_cpu_mask,
|
||||||
|
sizeof(bitchunk_t) * BITMAP_CHUNKS(CONFIG_MAX_CPUS));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*===========================================================================*
|
/*===========================================================================*
|
||||||
|
|
Loading…
Reference in a new issue