Blame view

Documentation/sched-coding.txt 3.98 KB
1da177e4c   Linus Torvalds   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   Matt LaPlante   Fix typos in Docu...
18
  	imbalanced or periodically by the timer tick.  Prior to calling,
1da177e4c   Linus Torvalds   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.