Blame view
Documentation/sched-coding.txt
3.98 KB
1da177e4c Linux-2.6.12-rc2 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Reference for various scheduler-related methods in the O(1) scheduler Robert Love <rml@tech9.net>, MontaVista Software Note most of these methods are local to kernel/sched.c - this is by design. The scheduler is meant to be self-contained and abstracted away. This document is primarily for understanding the scheduler, not interfacing to it. Some of the discussed interfaces, however, are general process/scheduling methods. They are typically defined in include/linux/sched.h. Main Scheduling Methods ----------------------- void load_balance(runqueue_t *this_rq, int idle) Attempts to pull tasks from one cpu to another to balance cpu usage, if needed. This method is called explicitly if the runqueues are |
2fe0ae78c Fix typos in Docu... |
18 |
imbalanced or periodically by the timer tick. Prior to calling, |
1da177e4c Linux-2.6.12-rc2 |
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 |
the current runqueue must be locked and interrupts disabled. void schedule() The main scheduling function. Upon return, the highest priority process will be active. Locking ------- Each runqueue has its own lock, rq->lock. When multiple runqueues need to be locked, lock acquires must be ordered by ascending &runqueue value. A specific runqueue is locked via task_rq_lock(task_t pid, unsigned long *flags) which disables preemption, disables interrupts, and locks the runqueue pid is running on. Likewise, task_rq_unlock(task_t pid, unsigned long *flags) unlocks the runqueue pid is running on, restores interrupts to their previous state, and reenables preemption. The routines double_rq_lock(runqueue_t *rq1, runqueue_t *rq2) and double_rq_unlock(runqueue_t *rq1, runqueue_t *rq2) safely lock and unlock, respectively, the two specified runqueues. They do not, however, disable and restore interrupts. Users are required to do so manually before and after calls. Values ------ MAX_PRIO The maximum priority of the system, stored in the task as task->prio. Lower priorities are higher. Normal (non-RT) priorities range from MAX_RT_PRIO to (MAX_PRIO - 1). MAX_RT_PRIO The maximum real-time priority of the system. Valid RT priorities range from 0 to (MAX_RT_PRIO - 1). MAX_USER_RT_PRIO The maximum real-time priority that is exported to user-space. Should always be equal to or less than MAX_RT_PRIO. Setting it less allows kernel threads to have higher priorities than any user-space task. MIN_TIMESLICE MAX_TIMESLICE Respectively, the minimum and maximum timeslices (quanta) of a process. Data ---- struct runqueue The main per-CPU runqueue data structure. struct task_struct The main per-process data structure. General Methods --------------- cpu_rq(cpu) Returns the runqueue of the specified cpu. this_rq() Returns the runqueue of the current cpu. task_rq(pid) Returns the runqueue which holds the specified pid. cpu_curr(cpu) Returns the task currently running on the given cpu. rt_task(pid) Returns true if pid is real-time, false if not. Process Control Methods ----------------------- void set_user_nice(task_t *p, long nice) Sets the "nice" value of task p to the given value. int setscheduler(pid_t pid, int policy, struct sched_param *param) Sets the scheduling policy and parameters for the given pid. int set_cpus_allowed(task_t *p, unsigned long new_mask) Sets a given task's CPU affinity and migrates it to a proper cpu. Callers must have a valid reference to the task and assure the task not exit prematurely. No locks can be held during the call. set_task_state(tsk, state_value) Sets the given task's state to the given value. set_current_state(state_value) Sets the current task's state to the given value. void set_tsk_need_resched(struct task_struct *tsk) Sets need_resched in the given task. void clear_tsk_need_resched(struct task_struct *tsk) Clears need_resched in the given task. void set_need_resched() Sets need_resched in the current task. void clear_need_resched() Clears need_resched in the current task. int need_resched() Returns true if need_resched is set in the current task, false otherwise. yield() Place the current process at the end of the runqueue and call schedule. |