Don't cache pcpui across potential kthread blocks
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 3 Jun 2011 18:55:41 +0000 (11:55 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:36:04 +0000 (17:36 -0700)
When you come back up the stack, you could be on a different core if
your kthread migrated, and your pcpui would be wrong.

kern/arch/i686/trap.c
kern/src/process.c
kern/src/syscall.c

index 6bcad7e..7f376d4 100644 (file)
@@ -416,6 +416,7 @@ void sysenter_callwrapper(struct trapframe *tf)
        /* Set up and run the async calls */
        prep_syscalls(current, (struct syscall*)tf->tf_regs.reg_eax,
                      tf->tf_regs.reg_esi);
+       /* If you use pcpui again, reread it, since you might have migrated */
        proc_restartcore();
 }
 
index 00b824a..f01aa2e 100644 (file)
@@ -597,7 +597,6 @@ void proc_restartcore(void)
                abandon_core();
                smp_idle();
        }
-       /* TODO: this is where we can decide to smp_idle() if there is no cur_tf */
        /* Need ints disabled when we return from processing (race) */
        disable_irq();
        /* Need to be current (set by the caller), in case a kmsg is there that
index c1f7d2f..bfc3a6f 100644 (file)
@@ -1423,6 +1423,8 @@ void run_local_syscall(struct syscall *sysc)
        pcpui->cur_sysc = sysc;                 /* let the core know which sysc it is */
        sysc->retval = syscall(pcpui->cur_proc, sysc->num, sysc->arg0, sysc->arg1,
                               sysc->arg2, sysc->arg3, sysc->arg4, sysc->arg5);
+       /* Need to re-load pcpui, in case we migrated */
+       pcpui = &per_cpu_info[core_id()];
        /* Atomically turn on the SC_DONE flag.  Need the atomics since we're racing
         * with userspace for the event_queue registration. */
        atomic_or(&sysc->flags, SC_DONE); 
@@ -1437,7 +1439,7 @@ void run_local_syscall(struct syscall *sysc)
 void prep_syscalls(struct proc *p, struct syscall *sysc, unsigned int nr_syscs)
 {
        int retval;
-       struct per_cpu_info *pcpui = &per_cpu_info[core_id()];
+       /* Careful with pcpui here, we could have migrated */
        if (!nr_syscs)
                return;
        /* For all after the first call, send ourselves a KMSG (TODO). */