Ports uses of get_any_idle_core()
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 6 Jan 2015 20:06:56 +0000 (15:06 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 6 Jan 2015 20:08:10 +0000 (15:08 -0500)
ARSCs and NIX use the new way to get a CG core.

kern/drivers/dev/nix.c
kern/src/schedule.c

index 8a7438a..66d48fb 100644 (file)
@@ -312,27 +312,12 @@ static void nixinit(void)
                nixok = 1;
        }
 
-       // are your cpu etc. etc.
-       // there has to be a better way but for now make it work.
-       int seen_0 = 0;
-       struct sched_pcore *p;
-       extern struct sched_pcore_tailq idlecores;
-       extern struct sched_pcore *all_pcores;
-       TAILQ_FOREACH(p, &idlecores, alloc_next) {
-               int coreid = p - all_pcores;
-               if (! coreid) {
-                       if (seen_0++ > 1)
-                               break;
-               }
-               if (coreid > 3){
-                       TAILQ_REMOVE(&idlecores, p, alloc_next);
-                       send_kernel_message(coreid, nixhost, coreid, 0, 0,
-                                           KMSG_ROUTINE);
-                       warn("Using core %d for the ARSCs - there are probably issues with this.", coreid);
-                       break;
+       int nix_coreid = get_any_idle_core();
+       /* TODO: gracefully fail */
+       assert(nix_coreid >= 0);
+       send_kernel_message(nix_coreid, nixhost, nix_coreid, 0, 0, KMSG_ROUTINE);
+       printk("Using core %d for a NIX host\n", nix_coreid);
 
-               }
-       }
        print_func_exit();
 }
 
index 280e74f..5edd58b 100644 (file)
@@ -19,6 +19,7 @@
 #include <alarm.h>
 #include <sys/queue.h>
 #include <kmalloc.h>
+#include <arsc_server.h>
 
 /* Process Lists.  'unrunnable' is a holding list for SCPs that are running or
  * waiting or otherwise not considered for sched decisions. */
@@ -138,17 +139,14 @@ void schedule_init(void)
        for (int i = 1; i < num_cpus; i += 2)
                TAILQ_INSERT_TAIL(&idlecores, pcoreid2spc(i), alloc_next);
 #endif /* CONFIG_DISABLE_SMT */
+       spin_unlock(&sched_lock);
+
 #ifdef CONFIG_ARSC_SERVER
-       struct sched_pcore *a_core = TAILQ_FIRST(&idlecores);
-       assert(a_core);
-       TAILQ_REMOVE(&idlecores, a_core, alloc_next);
-       send_kernel_message(spc2pcoreid(a_core), arsc_server, 0, 0, 0,
-                           KMSG_ROUTINE);
-       warn("Using core %d for the ARSCs - there are probably issues with this.",
-            spc2pcoreid(a_core));
+       int arsc_coreid = get_any_idle_core();
+       assert(arsc_coreid >= 0);
+       send_kernel_message(arsc_coreid, arsc_server, 0, 0, 0, KMSG_ROUTINE);
+       printk("Using core %d for the ARSC server\n", arsc_coreid);
 #endif /* CONFIG_ARSC_SERVER */
-       spin_unlock(&sched_lock);
-       return;
 }
 
 static uint32_t spc2pcoreid(struct sched_pcore *spc)