Track startup kthreads as ktasks
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 28 Sep 2015 22:11:27 +0000 (18:11 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 8 Oct 2015 14:29:57 +0000 (10:29 -0400)
The ktask flag marks whether or not we are a kernel task or a
user-backing kthread (meaning we're executing a syscall or the user is
running).  Parts of the codebase assume you are one or the other, as in
rendez_sleep().  That's probably a correct assumption.

If you call kthread_usleep() before smp_idle(), we'd get in a situation
where we had a kthread (the startup kthread) that was not a ktask (prior
to this commit) and the code that handles aborting syscalls would think
there should be a user syscall associated with the kthread.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/src/smp.c

index d872459..aedd7ea 100644 (file)
@@ -98,6 +98,10 @@ void smp_percpu_init(void)
        kthread = __kthread_zalloc();
        kthread->stacktop = get_stack_top();    /* assumes we're on the 1st page */
        pcpui->cur_kthread = kthread;
        kthread = __kthread_zalloc();
        kthread->stacktop = get_stack_top();    /* assumes we're on the 1st page */
        pcpui->cur_kthread = kthread;
+       /* Treat the startup threads as ktasks.  This will last until smp_idle when
+        * they clear it, either in anticipation of being a user-backing kthread or
+        * to handle an RKM. */
+       kthread->is_ktask = TRUE;
        per_cpu_info[coreid].spare = 0;
        /* Init relevant lists */
        spinlock_init_irqsave(&per_cpu_info[coreid].immed_amsg_lock);
        per_cpu_info[coreid].spare = 0;
        /* Init relevant lists */
        spinlock_init_irqsave(&per_cpu_info[coreid].immed_amsg_lock);