proc_change_to_m() is now a scheduler function
[akaros.git] / kern / include / schedule.h
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 #ifndef ROS_KERN_SCHEDULE_H
10 #define ROS_KERN_SCHEDULE_H
11
12 #include <ros/common.h>
13 #include <sys/queue.h>
14
15 struct proc;    /* process.h includes us, but we need pointers now */
16 TAILQ_HEAD(proc_list, proc);            /* Declares 'struct proc_list' */
17
18 /* One of these embedded in every struct proc */
19 struct sched_proc_data {
20         TAILQ_ENTRY(proc)                       proc_link;                      /* tailq linkage */
21         struct proc_list                        *cur_list;                      /* which tailq we're on */
22 };
23
24 void schedule_init(void);
25
26 /************** Process registration **************/
27 /* Tell the ksched about the process, which it will track cradle-to-grave */
28 void register_proc(struct proc *p);
29
30 /* _S is now runnable, tell the ksched to try to run it. */
31 void schedule_scp(struct proc *p);
32
33 /* The ksched starts the death process (lock ordering issue), which calls back
34  * to proc.c's __proc_destroy while holding the locks (or whatever) */
35 void proc_destroy(struct proc *p);
36
37 /* Changes the proc from an SCP to an MCP */
38 int proc_change_to_m(struct proc *p);
39
40 /************** Decision making **************/
41 /* Call the main scheduling algorithm.  Not clear yet if the main kernel will
42  * ever call this directly. */
43 void schedule(void);
44
45 /* Proc p's resource desires changed, or something in general that would lead to
46  * a new decision.  The process can directly poke the ksched via a syscall, so
47  * be careful of abuse. */
48 void poke_ksched(struct proc *p, int res_type);
49
50 /* Proc p just woke up (due to an event).  This is a more specific case than
51  * poke_ksched(), in case kscheds want to do some accounting or something more
52  * than just giving it cores. */
53 void ksched_proc_unblocked(struct proc *p);
54
55 /* The calling cpu/core has nothing to do and plans to idle/halt.  This is an
56  * opportunity to pick the nature of that halting (low power state, etc), or
57  * provide some other work (_Ss on LL cores). */
58 void cpu_bored(void);
59
60 /* Gets called when a pcore becomes idle (like in proc yield).  These are 'cg'
61  * cores, given to MCPs, that have been async returned to the ksched.  If the
62  * ksched preempts a core, this won't get called (unless it yielded first). */
63 void put_idle_core(uint32_t coreid);
64 void put_idle_cores(uint32_t *pc_arr, uint32_t num);
65
66 /* Available resources changed (plus or minus).  Some parts of the kernel may
67  * call this if a particular resource that is 'quantity-based' changes.  Things
68  * like available RAM to processes, bandwidth, etc.  Cores would probably be
69  * inappropriate, since we need to know which specific core is now free. */
70 void avail_res_changed(int res_type, long change);
71
72 /************** Proc's view of the world **************/
73 /* How many vcores p will think it can have */
74 uint32_t max_vcores(struct proc *p);
75
76 /************** Debugging **************/
77 void sched_diag(void);
78 void print_idlecoremap(void);
79 void print_resources(struct proc *p);
80 void print_all_resources(void);
81
82 #endif /* ROS_KERN_SCHEDULE_H */