Move is_ll_core(), max_vcores() to corerequest.h
authorKevin Klues <klueska@cs.berkeley.edu>
Mon, 5 Oct 2015 22:00:59 +0000 (15:00 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 24 Nov 2015 19:48:50 +0000 (14:48 -0500)
These make more logical sense in this file now. They can be used by both
corealloc.c and coreprov.c as well as schedule.c if desired.

Signed-off-by: Kevin Klues <klueska@cs.berkeley.edu>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/include/corerequest.h
kern/include/schedule.h
kern/src/corealloc.c
kern/src/schedule.c

index 112ae2e..474c7ee 100644 (file)
@@ -7,6 +7,9 @@
 
 #pragma once
 
+#include <stdbool.h>
+#include <arch/topology.h>
+
 /* The core request algorithm maintains an internal array of these: the
  * global pcore map. Note the prov_proc and alloc_proc are weak (internal)
  * references, and should only be used as a ref source while the ksched has a
@@ -105,3 +108,25 @@ static inline struct proc *get_prov_proc(struct sched_pcore *c)
 {
        return c->prov_proc;
 }
+
+/* TODO: need more thorough CG/LL management.  For now, core0 is the only LL
+ * core.  This won't play well with the ghetto shit in schedule_init() if you do
+ * anything like 'DEDICATED_MONITOR' or the ARSC server.  All that needs an
+ * overhaul. */
+static inline bool is_ll_core(uint32_t pcoreid)
+{
+       if (pcoreid == 0)
+               return TRUE;
+       return FALSE;
+}
+
+/* Normally it'll be the max number of CG cores ever */
+static inline uint32_t max_vcores(struct proc *p)
+{
+/* TODO: (CG/LL) */
+#ifdef CONFIG_DISABLE_SMT
+       return num_cores >> 1;
+#else
+       return num_cores - 1;   /* reserving core 0 */
+#endif /* CONFIG_DISABLE_SMT */
+}
index c6e8bab..39b938f 100644 (file)
@@ -76,10 +76,6 @@ int get_any_idle_core(void);
 int get_specific_idle_core(int coreid);
 void put_idle_core(int coreid);
 
-/************** Proc's view of the world **************/
-/* How many vcores p will think it can have */
-uint32_t max_vcores(struct proc *p);
-
 /************** Provisioning / Allocating *************/
 /* This section is specific to a provisioning ksched.  Careful calling any of
  * this from generic kernel code, since it might not be present in all kernel
index ac2eaf6..092e435 100644 (file)
@@ -26,12 +26,16 @@ void corealloc_init(void)
         * odds from 1..max-1.  otherwise, give them everything by 0 (default mgmt
         * core).  TODO: (CG/LL) better LL/CG mgmt */
 #ifndef CONFIG_DISABLE_SMT
-       for (int i = 1; i < num_cores; i++)
-               TAILQ_INSERT_TAIL(&idlecores, pcoreid2spc(i), alloc_next);
+       for (int i = 0; i < num_cores; i++)
+               if (!is_ll_core(i))
+                       TAILQ_INSERT_TAIL(&idlecores, pcoreid2spc(i), alloc_next);
 #else
        assert(!(num_cores % 2));
+       /* TODO: rethink starting at 1 here. If SMT is really disabled, the entire
+        * core of an "ll" core shouldn't be available. */
        for (int i = 1; i < num_cores; i += 2)
-               TAILQ_INSERT_TAIL(&idlecores, pcoreid2spc(i), alloc_next);
+               if (!is_ll_core(i))
+                       TAILQ_INSERT_TAIL(&idlecores, pcoreid2spc(i), alloc_next);
 #endif /* CONFIG_DISABLE_SMT */
 }
 
index 054c878..6863235 100644 (file)
@@ -38,7 +38,6 @@ static void add_to_list(struct proc *p, struct proc_list *list);
 static void remove_from_list(struct proc *p, struct proc_list *list);
 static void switch_lists(struct proc *p, struct proc_list *old,
                          struct proc_list *new);
-static bool is_ll_core(uint32_t pcoreid);
 static void __run_mcp_ksched(void *arg);       /* don't call directly */
 static uint32_t get_cores_needed(struct proc *p);
 
@@ -535,17 +534,6 @@ void put_idle_core(int coreid)
        spin_unlock(&sched_lock);
 }
 
-/* Normally it'll be the max number of CG cores ever */
-uint32_t max_vcores(struct proc *p)
-{
-/* TODO: (CG/LL) */
-#ifdef CONFIG_DISABLE_SMT
-       return num_cores >> 1;
-#else
-       return num_cores - 1;   /* reserving core 0 */
-#endif /* CONFIG_DISABLE_SMT */
-}
-
 /* This deals with a request for more cores.  The amt of new cores needed is
  * passed in.  The ksched lock is held, but we are free to unlock if we want
  * (and we must, if calling out of the ksched to anything high-level).
@@ -680,17 +668,6 @@ static void __core_request(struct proc *p, uint32_t amt_needed)
        /* note the ksched lock is still held */
 }
 
-/* TODO: need more thorough CG/LL management.  For now, core0 is the only LL
- * core.  This won't play well with the ghetto shit in schedule_init() if you do
- * anything like 'DEDICATED_MONITOR' or the ARSC server.  All that needs an
- * overhaul. */
-static bool is_ll_core(uint32_t pcoreid)
-{
-       if (pcoreid == 0)
-               return TRUE;
-       return FALSE;
-}
-
 /* Provision a core to a process. This function wraps the primary logic
  * implemented in __provision_core, with a lock, error checking, etc. */
 int provision_core(struct proc *p, uint32_t pcoreid)