More verbose multicore debugging
[akaros.git] / kern / src / schedule.c
1 /*
2  * Copyright (c) 2009 The Regents of the University of California
3  * Barret Rhoden <brho@cs.berkeley.edu>
4  * See LICENSE for details.
5  *
6  * Scheduling and dispatching.
7  */
8
9 #ifdef __SHARC__
10 #pragma nosharc
11 #endif
12
13 #include <schedule.h>
14 #include <process.h>
15 #include <monitor.h>
16 #include <stdio.h>
17 #include <assert.h>
18 #include <atomic.h>
19 #include <sys/queue.h>
20
21 // This could be useful for making scheduling decisions.  
22 /* Physical coremap: each index is a physical core id, with a proc ptr for
23  * whoever *should be or is* running.  Very similar to current / curenvs[],
24  * which is what process is *really* running there. */
25 struct proc *pcoremap[MAX_NUM_CPUS];
26
27 void schedule_init(void)
28 {
29         TAILQ_INIT(&proc_runnablelist);
30         return;
31 }
32
33 void schedule_proc(struct proc *p)
34 {
35         spin_lock_irqsave(&runnablelist_lock);
36         printd("Scheduling PID: %d\n", p->env_id);
37         TAILQ_INSERT_TAIL(&proc_runnablelist, p, proc_link);
38         spin_unlock_irqsave(&runnablelist_lock);
39         return;
40 }
41
42 void deschedule_proc(struct proc *p)
43 {
44         spin_lock_irqsave(&runnablelist_lock);
45         printd("Descheduling PID: %d\n", p->env_id);
46         TAILQ_REMOVE(&proc_runnablelist, p, proc_link);
47         spin_unlock_irqsave(&runnablelist_lock);
48         return;
49 }
50
51 /*
52  * FIFO - just pop the head from the list and run it.
53  * Using irqsave spinlocks for now, since this could be called from a timer
54  * interrupt handler (though ought to be in a bottom half or something).
55  */
56 void schedule(void)
57 {
58         struct proc *p;
59         
60         spin_lock_irqsave(&runnablelist_lock);
61         p = TAILQ_FIRST(&proc_runnablelist);
62         if (p) {
63                 TAILQ_REMOVE(&proc_runnablelist, p, proc_link);
64                 spin_unlock_irqsave(&runnablelist_lock);
65                 printd("PID of proc i'm running: %d\n", p->env_id);
66                 proc_run(p);
67         } else {
68                 spin_unlock_irqsave(&runnablelist_lock);
69                 printk("No processes to schedule, enjoy the Monitor!\n");
70                 while (1)
71                         monitor(NULL);
72         }
73         return;
74 }
75
76 void dump_proclist(struct proc_list *list)
77 {
78         struct proc *p;
79         TAILQ_FOREACH(p, list, proc_link)
80                 printk("PID: %d\n", p->env_id);
81         return;
82 }