]> Zhao Yanbai Git Server - minix.git/commitdiff
SMP - do_update fix
authorTomas Hruby <thruby@few.vu.nl>
Sun, 16 Oct 2011 22:05:40 +0000 (22:05 +0000)
committerTomas Hruby <tom@minix3.org>
Fri, 13 Jan 2012 11:30:00 +0000 (11:30 +0000)
- adjust_proc_slot() must preserve scheduling info, for example
  on which cpu the process should run

- do_update() - consitency check

kernel/system/do_update.c

index 5cdd3cb5ede083db9660eb8585b60d779df56398..4833d47741594c194ffe15ea90f124fe8962c4b9 100644 (file)
@@ -9,6 +9,7 @@
 #include "kernel/system.h"
 #include "kernel/ipc.h"
 #include <string.h>
+#include <assert.h>
 
 #if USE_UPDATE
 
@@ -64,6 +65,8 @@ PUBLIC int do_update(struct proc * caller, message * m_ptr)
       return EPERM;
   }
 
+  assert(!proc_is_runnable(src_rp) && !proc_is_runnable(dst_rp));
+
   /* Check if processes are updatable. */
   if(!proc_is_updatable(src_rp) || !proc_is_updatable(dst_rp)) {
       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;
   priv(rp)->s_proc_nr = from_rp->p_nr;
   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
 }
 
 /*===========================================================================*