No longer uses num_vcores() to determine _M (XCC)
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 18 Oct 2011 00:43:45 +0000 (17:43 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 15 Dec 2011 22:48:40 +0000 (14:48 -0800)
We were using num_vcores() == 0 to determine if we're in _M mode or not.
This won't be true when we start sending bulk preempt messages, since
num_vcores() is 0 for an instant, which could trick some code to think
it is in _S mode and bypass some critical stuff.

Reinstall your kernel headers (procinfo.h).

kern/include/env.h
kern/include/ros/procinfo.h
kern/src/process.c
kern/src/resource.c
kern/src/schedule.c
user/parlib/include/vcore.h

index e9fe00f..7ba6376 100644 (file)
@@ -34,7 +34,6 @@ struct proc {
        pid_t ppid;                 // Parent's PID
        pid_t exitcode;                         // exit() param or main() return value
        uint32_t state;                         // Status of the process
-       bool is_mcp;                    /* is in multi mode */
        struct kref p_kref;             /* Refcnt */
        uint32_t env_flags;
        uintptr_t env_entry;
index c5f543a..b2c2080 100644 (file)
@@ -47,6 +47,7 @@ typedef struct procinfo {
        char argbuf[PROCINFO_ARGBUF_SIZE];
        /* glibc relies on stuff above this point.  if you change it, you need to
         * rebuild glibc. */
+       bool is_mcp;                    /* is in multi mode */
        struct vcore            vcoremap[MAX_NUM_CPUS];
        uint32_t                        num_vcores;
        struct pcore            pcoremap[MAX_NUM_CPUS];
index c6bb9ed..702ab72 100644 (file)
@@ -261,6 +261,7 @@ static void proc_init_procinfo(struct proc* p)
        memset(&p->procinfo->vcoremap, 0, sizeof(p->procinfo->vcoremap));
        memset(&p->procinfo->pcoremap, 0, sizeof(p->procinfo->pcoremap));
        p->procinfo->num_vcores = 0;
+       p->procinfo->is_mcp = FALSE;
        p->procinfo->coremap_seqctr = SEQCTR_INITIALIZER;
        /* For now, we'll go up to the max num_cpus (at runtime).  In the future,
         * there may be cases where we can have more vcores than num_cpus, but for
@@ -309,7 +310,6 @@ error_t proc_alloc(struct proc **pp, struct proc *parent)
        p->exitcode = 1337;     /* so we can see processes killed by the kernel */
        p->ppid = parent ? parent->pid : 0;
        p->state = PROC_CREATED; /* shouldn't go through state machine for init */
-       p->is_mcp = FALSE;
        p->env_flags = 0;
        p->env_entry = 0; // cheating.  this really gets set later
        p->heap_top = (void*)UTEXT;     /* heap_bottom set in proc_init_procinfo */
@@ -938,7 +938,7 @@ bool __proc_is_mcp(struct proc *p)
 {
        /* in lieu of using the amount of cores requested, or having a bunch of
         * states (like PROC_WAITING_M and _S), I'll just track it with a bool. */
-       return p->is_mcp;
+       return p->procinfo->is_mcp;
 }
 
 /************************  Preemption Functions  ******************************
index 154d632..2b91927 100644 (file)
@@ -149,7 +149,7 @@ ssize_t core_request(struct proc *p)
                                need_to_idle = TRUE;
                                // change to runnable_m (it's TF is already saved)
                                __proc_set_state(p, PROC_RUNNABLE_M);
-                               p->is_mcp = TRUE;
+                               p->procinfo->is_mcp = TRUE;
                                break;
                        case (PROC_RUNNABLE_S):
                                /* Issues: being on the runnable_list, proc_set_state not liking
index 1b0cccd..667d048 100644 (file)
@@ -73,7 +73,7 @@ void schedule(void)
                spin_unlock_irqsave(&runnablelist_lock);
                printd("PID of proc i'm running: %d\n", p->pid);
                /* We can safely read is_mcp without locking (i think). */
-               if (p->is_mcp) {
+               if (__proc_is_mcp(p)) {
                        /* _Ms need to get some cores, which will call proc_run() internally
                         * (for now) */
                        if (core_request(p) <= 0)
index 3b27b4a..338588e 100644 (file)
@@ -79,7 +79,7 @@ static inline bool in_vcore_context(void)
 
 static inline bool in_multi_mode(void)
 {
-       return (num_vcores() > 0) ? TRUE : FALSE;
+       return __procinfo.is_mcp;
 }
 
 /* Only call this if you know what you are doing. */