Removed unnecessary/fauly assert
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 15 Mar 2012 20:15:46 +0000 (13:15 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 15 Mar 2012 20:15:46 +0000 (13:15 -0700)
This safely trips if SCPs kthread and yield in a loop while waiting.
Here's what happens:
1) process causes a kthread (sys_block)
2) process yields, leaving the core (no longer current or owning)
3) timer interrupt goes off and unblocks the kthread, which sets current
(but not owning)
4) kthread does not clear current - that's done in the
restartcore/smp_idle path.
5) ksched's timer tick goes off, causing its work to be done in a
routine kmsg
6) proc_restartcore executes the kmsg before abanonding
&) ksched kmsg calls proc_run_s

We actually don't want to abandon early - it's better to stay in that
context til after we check messages (avoid an extra TLB flush).  The old
assert was probably important a long time ago (back when owning_proc and
current were the same thing), or at least a "this is weird, check it
out."

Note the process is current, but not the owning proc.

kern/src/process.c

index 746525a..3abf01e 100644 (file)
@@ -432,7 +432,6 @@ void proc_run_s(struct proc *p)
                        printk("[kernel] _S %d not starting due to async death\n", p->pid);
                        return;
                case (PROC_RUNNABLE_S):
-                       assert(current != p);
                        __proc_set_state(p, PROC_RUNNING_S);
                        /* We will want to know where this process is running, even if it is
                         * only in RUNNING_S.  can use the vcoremap, which makes death easy.