Refactor to move prov stuff to coreprov.c (2/4)
authorKevin Klues <klueska@cs.berkeley.edu>
Mon, 28 Sep 2015 21:32:30 +0000 (14:32 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 24 Nov 2015 19:48:50 +0000 (14:48 -0500)
In this commit we move the logic out of schedule.c for unprovisioning
all cores from a process at once.

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

index 60a4ec7..abe2ecb 100644 (file)
@@ -28,6 +28,10 @@ struct core_request_data {
  * it holds a lock for the duration of the call. */
 void __provision_core(struct proc *p, struct sched_pcore *spc);
 
+/* Unprovision all cores from proc p. This code assumes that the scheduler
+ * that uses * it holds a lock for the duration of the call. */
+void __unprovision_all_cores(struct proc *p);
+
 static inline uint32_t spc2pcoreid(struct sched_pcore *spc)
 {
        extern struct sched_pcore *all_pcores;
index 8e9d3b4..4444af4 100644 (file)
@@ -39,3 +39,24 @@ void __provision_core(struct proc *p, struct sched_pcore *spc)
        spc->prov_proc = p;
 }
 
+/* Unprovisions any pcores for the given list */
+static void __unprov_pcore_list(struct sched_pcore_tailq *list_head)
+{
+       struct sched_pcore *spc_i;
+       /* We can leave them connected within the tailq, since the scps don't have a
+        * default list (if they aren't on a proc's list, then we don't care about
+        * them), and since the INSERTs don't care what list you were on before
+        * (chummy with the implementation).  Pretty sure this is right.  If there's
+        * suspected list corruption, be safer here. */
+       TAILQ_FOREACH(spc_i, list_head, prov_next)
+               spc_i->prov_proc = 0;
+       TAILQ_INIT(list_head);
+}
+
+/* Unprovision all cores from proc p. This code assumes that the scheduler
+ * that uses * it holds a lock for the duration of the call. */
+void __unprovision_all_cores(struct proc *p)
+{
+       __unprov_pcore_list(&p->ksched_data.crd.prov_alloc_me);
+       __unprov_pcore_list(&p->ksched_data.crd.prov_not_alloc_me);
+}
index cb49e2b..5453f75 100644 (file)
@@ -221,20 +221,6 @@ void __sched_proc_change_to_m(struct proc *p)
        //poke_ksched(p, RES_CORES);
 }
 
-/* Helper for the destroy CB : unprovisions any pcores for the given list */
-static void unprov_pcore_list(struct sched_pcore_tailq *list_head)
-{
-       struct sched_pcore *spc_i;
-       /* We can leave them connected within the tailq, since the scps don't have a
-        * default list (if they aren't on a proc's list, then we don't care about
-        * them), and since the INSERTs don't care what list you were on before
-        * (chummy with the implementation).  Pretty sure this is right.  If there's
-        * suspected list corruption, be safer here. */
-       TAILQ_FOREACH(spc_i, list_head, prov_next)
-               spc_i->prov_proc = 0;
-       TAILQ_INIT(list_head);
-}
-
 /* Sched callback called when the proc dies.  pc_arr holds the cores the proc
  * had, if any, and nr_cores tells us how many are in the array.
  *
@@ -246,8 +232,7 @@ void __sched_proc_destroy(struct proc *p, uint32_t *pc_arr, uint32_t nr_cores)
        /* Unprovision any cores.  Note this is different than track_dealloc.
         * The latter does bookkeeping when an allocation changes.  This is a
         * bulk *provisioning* change. */
-       unprov_pcore_list(&p->ksched_data.crd.prov_alloc_me);
-       unprov_pcore_list(&p->ksched_data.crd.prov_not_alloc_me);
+       __unprovision_all_cores(p);
        /* Remove from whatever list we are on (if any - might not be on one if it
         * was in the middle of __run_mcp_sched) */
        remove_from_any_list(p);