Events that wake processes poke the ksched
[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 <process.h>
13
14 void schedule_init(void);
15
16 /************** Process registration **************/
17 /* _S procs will get 'scheduled' every time they become RUNNABLE.  MCPs will get
18  * registered on creation, and then that's it.  They will get removed from the
19  * lists 'naturally' when proc_destroy() sets their state to DYING.  The ksched
20  * needs to notice that, remove them from its lists, and decref. */
21 /* _S is runnable, tell the ksched to try to run it. */
22 void schedule_scp(struct proc *p);
23 /* _M exists.  Tell the ksched about it. */
24 void register_mcp(struct proc *p);
25
26 /************** Decision making **************/
27 /* Call the main scheduling algorithm.  Not clear yet if the main kernel will
28  * ever call this directly. */
29 void schedule(void);
30
31 /* Proc p's resource desires changed, or something in general that would lead to
32  * a new decision.  The process can directly poke the ksched via a syscall, so
33  * be careful of abuse. */
34 void poke_ksched(struct proc *p, int res_type);
35
36 /* Proc p just woke up (due to an event).  This is a more specific case than
37  * poke_ksched(), in case kscheds want to do some accounting or something more
38  * than just giving it cores. */
39 void ksched_proc_unblocked(struct proc *p);
40
41 /* The calling cpu/core has nothing to do and plans to idle/halt.  This is an
42  * opportunity to pick the nature of that halting (low power state, etc), or
43  * provide some other work (_Ss on LL cores). */
44 void cpu_bored(void);
45
46 /* Gets called when a pcore becomes idle (like in proc yield).  These are 'cg'
47  * cores, given to MCPs, that have been async returned to the ksched.  If the
48  * ksched preempts a core, this won't get called (unless it yielded first). */
49 void put_idle_core(uint32_t coreid);
50 void put_idle_cores(uint32_t *pc_arr, uint32_t num);
51
52 /* Available resources changed (plus or minus).  Some parts of the kernel may
53  * call this if a particular resource that is 'quantity-based' changes.  Things
54  * like available RAM to processes, bandwidth, etc.  Cores would probably be
55  * inappropriate, since we need to know which specific core is now free. */
56 void avail_res_changed(int res_type, long change);
57
58 /************** Proc's view of the world **************/
59 /* How many vcores p will think it can have */
60 uint32_t max_vcores(struct proc *p);
61
62 /************** Debugging **************/
63 void sched_diag(void);
64 void print_idlecoremap(void);
65 void print_resources(struct proc *p);
66 void print_all_resources(void);
67
68 #endif /* ROS_KERN_SCHEDULE_H */