Declare sched_pcore in allocator specific file
authorKevin Klues <klueska@cs.berkeley.edu>
Tue, 6 Oct 2015 00:08:18 +0000 (17:08 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 24 Nov 2015 19:48:50 +0000 (14:48 -0500)
As part of this, we need to move the definitions of any helper functions
in corerequest.h which access fields of the sched_pcore or otherwise
depend on its size. This will become more important as we start to add
other allocators that need extra fields in the sche_pcore struct, and we
want the accessor functions (e.g. spc2pcoreid()) to remain as static
inlines so they are fast.

We also need to move our declaration of core_reqeust_data struct into
the allocator specific header as well.

I don't really like the #ifdef around including the allocator specific
header files, but it's the best compromise if we want our accessor
functions to remain in the header file. Altrnatively, we could try and
come up with a way to not need these accessor functions at all, but that
is for another day.

Signed-off-by: Kevin Klues <klueska@cs.berkeley.edu>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/include/corealloc_fcfs.h [new file with mode: 0644]
kern/include/corerequest.h

diff --git a/kern/include/corealloc_fcfs.h b/kern/include/corealloc_fcfs.h
new file mode 100644 (file)
index 0000000..5bb93e8
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2015 The Regents of the University of California
+ * Valmon Leymarie <leymariv@berkeley.edu>
+ * Kevin Klues <klueska@cs.berkeley.edu>
+ * See LICENSE for details.
+ */
+
+#pragma once
+
+/* 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
+ * valid kref. */
+struct sched_pcore {
+       TAILQ_ENTRY(sched_pcore)   prov_next;    /* on a proc's prov list */
+       TAILQ_ENTRY(sched_pcore)   alloc_next;   /* on an alloc list (idle)*/
+       struct proc                *prov_proc;   /* who this is prov to */
+       struct proc                *alloc_proc;  /* who this is alloc to */
+};
+TAILQ_HEAD(sched_pcore_tailq, sched_pcore);
+
+struct core_request_data {
+       struct sched_pcore_tailq  prov_alloc_me;      /* prov cores alloced us */
+       struct sched_pcore_tailq  prov_not_alloc_me;  /* maybe alloc to others */
+};
+
+static inline uint32_t spc2pcoreid(struct sched_pcore *spc)
+
+{
+       extern struct sched_pcore *all_pcores;
+
+       return spc - all_pcores;
+}
+
+static inline struct sched_pcore *pcoreid2spc(uint32_t pcoreid)
+{
+       extern struct sched_pcore *all_pcores;
+
+       return &all_pcores[pcoreid];
+}
+
+static inline struct proc *get_alloc_proc(struct sched_pcore *c)
+{
+       return c->alloc_proc;
+}
+
+static inline struct proc *get_prov_proc(struct sched_pcore *c)
+{
+       return c->prov_proc;
+}
index 474c7ee..9e14cab 100644 (file)
@@ -9,23 +9,9 @@
 
 #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
- * valid kref. */
-struct sched_pcore {
-       TAILQ_ENTRY(sched_pcore)   prov_next;    /* on a proc's prov list */
-       TAILQ_ENTRY(sched_pcore)   alloc_next;   /* on an alloc list (idle)*/
-       struct proc                *prov_proc;   /* who this is prov to */
-       struct proc                *alloc_proc;  /* who this is alloc to */
-};
-TAILQ_HEAD(sched_pcore_tailq, sched_pcore);
-
-struct core_request_data {
-       struct sched_pcore_tailq  prov_alloc_me;      /* prov cores alloced us */
-       struct sched_pcore_tailq  prov_not_alloc_me;  /* maybe alloc to others */
-};
+#if defined(CONFIG_COREALLOC_FCFS)
+  #include <corealloc_fcfs.h>
+#endif
 
 /* Initialize any data assocaited with doing core allocation. */
 void corealloc_init(void);
@@ -85,30 +71,6 @@ void print_proc_coreprov(struct proc *p);
 /* Print the processes attached to each provisioned core. */
 void print_coreprov_map(void);
 
-static inline uint32_t spc2pcoreid(struct sched_pcore *spc)
-{
-       extern struct sched_pcore *all_pcores;
-
-       return spc - all_pcores;
-}
-
-static inline struct sched_pcore *pcoreid2spc(uint32_t pcoreid)
-{
-       extern struct sched_pcore *all_pcores;
-
-       return &all_pcores[pcoreid];
-}
-
-static inline struct proc *get_alloc_proc(struct sched_pcore *c)
-{
-       return c->alloc_proc;
-}
-
-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