Made a global num_mgmtcores variable
authorKevin Klues <klueska@parcad.millennium.berkeley.edu>
Fri, 23 Apr 2010 23:43:18 +0000 (16:43 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:35:44 +0000 (17:35 -0700)
Replaces the local num_reserved variable in proc_init()
so that it can be used in other functions throughout the file.

Also added a __CONFIG_OSDI__ variable for hacky stuff
related to our upcoming OSDI submission.  Need to think
more about how to fix this properly... The problem is
that the code below this hack is the 'proper' solution,
but our kernel level scheduler currently can't properly
handle processes in the manycore state.

Makeconfig
kern/src/process.c

index 40600aa..52aecc2 100644 (file)
@@ -21,6 +21,7 @@ CONFIG_NOMTRRS:=                   -D__CONFIG_NOMTRRS__
 CONFIG_E1000_MMIO_HACK:=           -D__CONFIG_E1000_MMIO_HACK__
 CONFIG_E1000_ON_BOXBORO:=          -DE1000_MMIO_ADDR=0x9bb20000
 CONFIG_E1000_ON_S142:=             -DE1000_MMIO_ADDR=0xfbee0000
+CONFIG_OSDI:=                      -D__CONFIG_OSDI__
 CONFIG_DISABLE_MPTABLES:=          -D__CONFIG_DISABLE_MPTABLES__
 CONFIG_EXPER_TRADPROC:=            -D__CONFIG_EXPER_TRADPROC__
 CONFIG_MONITOR_ON_INT:=            -D__CONFIG_MONITOR_ON_INT__
index 5523a03..3e72665 100644 (file)
@@ -37,6 +37,7 @@ struct kmem_cache *proc_cache;
 spinlock_t idle_lock = SPINLOCK_INITIALIZER;
 uint32_t LCKD(&idle_lock) (RO idlecoremap)[MAX_NUM_CPUS];
 uint32_t LCKD(&idle_lock) num_idlecores = 0;
+uint32_t num_mgmtcores = 1;
 
 /* Helper function to return a core to the idlemap.  It causes some more lock
  * acquisitions (like in a for loop), but it's a little easier.  Plus, one day
@@ -186,22 +187,21 @@ void proc_init(void)
        schedule_init();
        /* Init idle cores. Core 0 is the management core. */
        spin_lock(&idle_lock);
-       int reserved_cores = 1;
        #ifdef __CONFIG_NETWORKING__
-       reserved_cores++; // Next core is dedicated to the NIC
-       assert(num_cpus >= reserved_cores);
+       num_mgmtcores++; // Next core is dedicated to the NIC
+       assert(num_cpus >= num_mgmtcores);
        #endif
        #ifdef __CONFIG_APPSERVER__
        #ifdef __CONFIG_DEDICATED_MONITOR__
-       reserved_cores++; // Next core dedicated to running the kernel monitor
-       assert(num_cpus >= reserved_cores);
-       // Need to subtract 1 from the reserved_cores # to get the cores index
-       send_kernel_message(reserved_cores-1, (amr_t)monitor, 0,0,0, KMSG_ROUTINE);
+       num_mgmtcores++; // Next core dedicated to running the kernel monitor
+       assert(num_cpus >= num_mgmtcores);
+       // Need to subtract 1 from the num_mgmtcores # to get the cores index
+       send_kernel_message(num_mgmtcores-1, (amr_t)monitor, 0,0,0, KMSG_ROUTINE);
        #endif
        #endif
-       num_idlecores = num_cpus - reserved_cores;
+       num_idlecores = num_cpus - num_mgmtcores;
        for (int i = 0; i < num_idlecores; i++)
-               idlecoremap[i] = i + reserved_cores;
+               idlecoremap[i] = i + num_mgmtcores;
        spin_unlock(&idle_lock);
        atomic_init(&num_envs, 0);
 }
@@ -218,7 +218,7 @@ proc_init_procinfo(struct proc* p)
        p->procinfo->ppid = p->ppid;
        p->procinfo->tsc_freq = system_timing.tsc_freq;
        // TODO: maybe do something smarter here
-       p->procinfo->max_vcores = MAX(1,num_cpus-1);
+       p->procinfo->max_vcores = MAX(1,num_cpus-num_mgmtcores);
 }
 
 /* Allocates and initializes a process, with the given parent.  Currently
@@ -691,6 +691,14 @@ void proc_yield(struct proc *SAFE p, bool being_nice)
                        schedule_proc(p);
                        break;
                case (PROC_RUNNING_M):
+#ifdef __CONFIG_OSDI__
+                       /* Ghetto, for OSDI: */
+                       printk("[K] Process %d is yielding on vcore %d\n", p->pid, get_vcoreid(p, core_id()));
+                       if (p->procinfo->num_vcores == 1) {
+                               spin_unlock_irqsave(&p->proc_lock);
+                               return;
+                       }
+#endif /* __CONFIG_OSDI__ */
                        __seq_start_write(&p->procinfo->coremap_seqctr);
                        // give up core
                        __unmap_vcore(p, get_vcoreid(p, core_id()));