ks: monitor command for mucking with the ksched
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 6 Oct 2014 21:20:26 +0000 (14:20 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 6 Oct 2014 21:20:26 +0000 (14:20 -0700)
The only new functionality is the "sort" command, which will sort the idle core
list from 1..n.  "nc" is a hook to avoid calling kfunc next_core, which is a
minor pain.

kern/include/monitor.h
kern/include/schedule.h
kern/src/monitor.c
kern/src/schedule.c

index 896882b..8e66ba6 100644 (file)
@@ -40,5 +40,6 @@ int mon_msr(int argc, char **argv, struct hw_trapframe *hw_tf);
 int mon_db(int argc, char **argv, struct hw_trapframe *hw_tf);
 int mon_px(int argc, char **argv, struct hw_trapframe *hw_tf);
 int mon_kpfret(int argc, char **argv, struct hw_trapframe *hw_tf);
+int mon_ks(int argc, char **argv, struct hw_trapframe *hw_tf);
 
 #endif // !ROS_KERN_MONITOR_H
index d04d49d..da56045 100644 (file)
@@ -94,5 +94,7 @@ void print_idlecoremap(void);
 void print_resources(struct proc *p);
 void print_all_resources(void);
 void print_prov_map(void);
+void next_core(uint32_t pcoreid);
+void sort_idles(void);
 
 #endif /* ROS_KERN_SCHEDULE_H */
index d7a37bf..3713cac 100644 (file)
@@ -72,6 +72,7 @@ static command_t (RO commands)[] = {
        { "db", "Misc debugging", mon_db},
        { "px", "Toggle printx", mon_px},
        { "kpfret", "Attempt to idle after a kernel fault", mon_kpfret},
+       { "ks", "Kernel scheduler hacks", mon_ks},
 };
 #define NCOMMANDS (sizeof(commands)/sizeof(commands[0]))
 
@@ -413,23 +414,14 @@ int mon_procinfo(int argc, char **argv, struct hw_trapframe *hw_tf)
        int8_t irq_state = 0;
        if (argc < 2) {
                printk("Usage: procinfo OPTION\n");
-               printk("\tidlecores: show idle core map\n");
                printk("\tall: show all active pids\n");
-               printk("\tsched: scheduler diagnostic report\n");
-               printk("\tresources: show resources wanted/granted for all procs\n");
                printk("\tpid NUM: show a lot of info for proc NUM\n");
                printk("\tunlock: unlock the lock for the ADDR (OMG!!!)\n");
                printk("\tkill NUM: destroy proc NUM\n");
                return 1;
        }
-       if (!strcmp(argv[1], "idlecores")) {
-               print_idlecoremap();
-       } else if (!strcmp(argv[1], "all")) {
+       if (!strcmp(argv[1], "all")) {
                print_allpids();
-       } else if (!strcmp(argv[1], "sched")) {
-               sched_diag();
-       } else if (!strcmp(argv[1], "resources")) {
-               print_all_resources();
        } else if (!strcmp(argv[1], "pid")) {
                if (argc != 3) {
                        printk("Give me a pid number.\n");
@@ -1231,3 +1223,36 @@ int mon_kpfret(int argc, char **argv, struct hw_trapframe *hw_tf)
        return -1;
 #endif /* CONFIG_X86_64 */
 }
+
+int mon_ks(int argc, char **argv, struct hw_trapframe *hw_tf)
+{
+       if (argc < 2) {
+usage:
+               printk("Usage: ks OPTION\n");
+               printk("\tidles: show idle core map\n");
+               printk("\tdiag: scheduler diagnostic report\n");
+               printk("\tresources: show resources wanted/granted for all procs\n");
+               printk("\tsort: sorts the idlecoremap, 1..n\n");
+               printk("\tnc PCOREID: sets the next CG core allocated\n");
+               return 1;
+       }
+       if (!strcmp(argv[1], "idles")) {
+               print_idlecoremap();
+       } else if (!strcmp(argv[1], "diag")) {
+               sched_diag();
+       } else if (!strcmp(argv[1], "resources")) {
+               print_all_resources();
+       } else if (!strcmp(argv[1], "sort")) {
+               sort_idles();
+       } else if (!strcmp(argv[1], "nc")) {
+               if (argc != 3) {
+                       printk("Need a pcore number.\n");
+                       return 1;
+               }
+               next_core(strtol(argv[2], 0, 0));
+       } else {
+               printk("Bad option %s\n", argv[1]);
+               goto usage;
+       }
+       return 0;
+}
index bbda959..ceff708 100644 (file)
@@ -935,3 +935,27 @@ void next_core(uint32_t pcoreid)
        }
        spin_unlock(&sched_lock);
 }
+
+void sort_idles(void)
+{
+       struct sched_pcore *spc_i, *spc_j, *temp;
+       struct sched_pcore_tailq sorter = TAILQ_HEAD_INITIALIZER(sorter);
+       bool added;
+       spin_lock(&sched_lock);
+       TAILQ_CONCAT(&sorter, &idlecores, alloc_next);
+       TAILQ_FOREACH_SAFE(spc_i, &sorter, alloc_next, temp) {
+               TAILQ_REMOVE(&sorter, spc_i, alloc_next);
+               added = FALSE;
+               /* don't need foreach_safe since we break after we muck with the list */
+               TAILQ_FOREACH(spc_j, &idlecores, alloc_next) {
+                       if (spc_i < spc_j) {
+                               TAILQ_INSERT_BEFORE(spc_j, spc_i, alloc_next);
+                               added = TRUE;
+                               break;
+                       }
+               }
+               if (!added)
+                       TAILQ_INSERT_TAIL(&idlecores, spc_i, alloc_next);
+       }
+       spin_unlock(&sched_lock);
+}