     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
	inbalanced or periodically by the timer tick.  Prior to calling,
	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.
