5265 lines · 130.3 KB · C
RawDownload
/* *  kernel/sched.c * *  Kernel scheduler and related syscalls * *  Copyright (C) 1991-2002  Linus Torvalds * *  1996-12-23  Modified by Dave Grothe to fix bugs in semaphores and *		make semaphores SMP safe *  1998-11-19	Implemented schedule_timeout() and related stuff *		by Andrea Arcangeli *  2002-01-04	New ultra-scalable O(1) scheduler by Ingo Molnar: *		hybrid priority-list and round-robin design with *		an array-switch method of distributing timeslices *		and per-CPU runqueues.  Cleanups and useful suggestions *		by Davide Libenzi, preemptible kernel bits by Robert Love. *  2003-09-03	Interactivity tuning by Con Kolivas. *  2004-04-02	Scheduler domains code by Nick Piggin */ #include <linux/mm.h>#include <linux/module.h>#include <linux/nmi.h>#include <linux/init.h>#include <asm/uaccess.h>#include <linux/highmem.h>#include <linux/smp_lock.h>#include <asm/mmu_context.h>#include <linux/interrupt.h>#include <linux/completion.h>#include <linux/kernel_stat.h>#include <linux/security.h>#include <linux/notifier.h>#include <linux/profile.h>#include <linux/suspend.h>#include <linux/blkdev.h>#include <linux/delay.h>#include <linux/smp.h>#include <linux/threads.h>#include <linux/timer.h>#include <linux/rcupdate.h>#include <linux/cpu.h>#include <linux/cpuset.h>#include <linux/percpu.h>#include <linux/kthread.h>#include <linux/seq_file.h>#include <linux/syscalls.h>#include <linux/times.h>#include <linux/acct.h>#include <asm/tlb.h> #include <asm/unistd.h> /* * Convert user-nice values [ -20 ... 0 ... 19 ] * to static priority [ MAX_RT_PRIO..MAX_PRIO-1 ], * and back. */#define NICE_TO_PRIO(nice)	(MAX_RT_PRIO + (nice) + 20)#define PRIO_TO_NICE(prio)	((prio) - MAX_RT_PRIO - 20)#define TASK_NICE(p)		PRIO_TO_NICE((p)->static_prio) /* * 'User priority' is the nice value converted to something we * can work with better when scaling various scheduler parameters, * it's a [ 0 ... 39 ] range. */#define USER_PRIO(p)		((p)-MAX_RT_PRIO)#define TASK_USER_PRIO(p)	USER_PRIO((p)->static_prio)#define MAX_USER_PRIO		(USER_PRIO(MAX_PRIO)) /* * Some helpers for converting nanosecond timing to jiffy resolution */#define NS_TO_JIFFIES(TIME)	((TIME) / (1000000000 / HZ))#define JIFFIES_TO_NS(TIME)	((TIME) * (1000000000 / HZ)) /* * These are the 'tuning knobs' of the scheduler: * * Minimum timeslice is 5 msecs (or 1 jiffy, whichever is larger), * default timeslice is 100 msecs, maximum timeslice is 800 msecs. * Timeslices get refilled after they expire. */#define MIN_TIMESLICE		max(5 * HZ / 1000, 1)#define DEF_TIMESLICE		(100 * HZ / 1000)#define ON_RUNQUEUE_WEIGHT	 30#define CHILD_PENALTY		 95#define PARENT_PENALTY		100#define EXIT_WEIGHT		  3#define PRIO_BONUS_RATIO	 25#define MAX_BONUS		(MAX_USER_PRIO * PRIO_BONUS_RATIO / 100)#define INTERACTIVE_DELTA	  2#define MAX_SLEEP_AVG		(DEF_TIMESLICE * MAX_BONUS)#define STARVATION_LIMIT	(MAX_SLEEP_AVG)#define NS_MAX_SLEEP_AVG	(JIFFIES_TO_NS(MAX_SLEEP_AVG)) /* * If a task is 'interactive' then we reinsert it in the active * array after it has expired its current timeslice. (it will not * continue to run immediately, it will still roundrobin with * other interactive tasks.) * * This part scales the interactivity limit depending on niceness. * * We scale it linearly, offset by the INTERACTIVE_DELTA delta. * Here are a few examples of different nice levels: * *  TASK_INTERACTIVE(-20): [1,1,1,1,1,1,1,1,1,0,0] *  TASK_INTERACTIVE(-10): [1,1,1,1,1,1,1,0,0,0,0] *  TASK_INTERACTIVE(  0): [1,1,1,1,0,0,0,0,0,0,0] *  TASK_INTERACTIVE( 10): [1,1,0,0,0,0,0,0,0,0,0] *  TASK_INTERACTIVE( 19): [0,0,0,0,0,0,0,0,0,0,0] * * (the X axis represents the possible -5 ... 0 ... +5 dynamic *  priority range a task can explore, a value of '1' means the *  task is rated interactive.) * * Ie. nice +19 tasks can never get 'interactive' enough to be * reinserted into the active array. And only heavily CPU-hog nice -20 * tasks will be expired. Default nice 0 tasks are somewhere between, * it takes some effort for them to get interactive, but it's not * too hard. */ #define CURRENT_BONUS(p) \	(NS_TO_JIFFIES((p)->sleep_avg) * MAX_BONUS / \		MAX_SLEEP_AVG) #define GRANULARITY	(10 * HZ / 1000 ? : 1) #ifdef CONFIG_SMP#define TIMESLICE_GRANULARITY(p)	(GRANULARITY * \		(1 << (((MAX_BONUS - CURRENT_BONUS(p)) ? : 1) - 1)) * \			num_online_cpus())#else#define TIMESLICE_GRANULARITY(p)	(GRANULARITY * \		(1 << (((MAX_BONUS - CURRENT_BONUS(p)) ? : 1) - 1)))#endif #define SCALE(v1,v1_max,v2_max) \	(v1) * (v2_max) / (v1_max) #define DELTA(p) \	(SCALE(TASK_NICE(p), 40, MAX_BONUS) + INTERACTIVE_DELTA) #define TASK_INTERACTIVE(p) \	((p)->prio <= (p)->static_prio - DELTA(p)) #define INTERACTIVE_SLEEP(p) \	(JIFFIES_TO_NS(MAX_SLEEP_AVG * \		(MAX_BONUS / 2 + DELTA((p)) + 1) / MAX_BONUS - 1)) #define TASK_PREEMPTS_CURR(p, rq) \	((p)->prio < (rq)->curr->prio) /* * task_timeslice() scales user-nice values [ -20 ... 0 ... 19 ] * to time slice values: [800ms ... 100ms ... 5ms] * * The higher a thread's priority, the bigger timeslices * it gets during one round of execution. But even the lowest * priority thread gets MIN_TIMESLICE worth of execution time. */ #define SCALE_PRIO(x, prio) \	max(x * (MAX_PRIO - prio) / (MAX_USER_PRIO/2), MIN_TIMESLICE) static unsigned int task_timeslice(task_t *p){	if (p->static_prio < NICE_TO_PRIO(0))		return SCALE_PRIO(DEF_TIMESLICE*4, p->static_prio);	else		return SCALE_PRIO(DEF_TIMESLICE, p->static_prio);}#define task_hot(p, now, sd) ((long long) ((now) - (p)->last_ran)	\				< (long long) (sd)->cache_hot_time) /* * These are the runqueue data structures: */ #define BITMAP_SIZE ((((MAX_PRIO+1+7)/8)+sizeof(long)-1)/sizeof(long)) typedef struct runqueue runqueue_t; struct prio_array {	unsigned int nr_active;	unsigned long bitmap[BITMAP_SIZE];	struct list_head queue[MAX_PRIO];}; /* * This is the main, per-CPU runqueue data structure. * * Locking rule: those places that want to lock multiple runqueues * (such as the load balancing or the thread migration code), lock * acquire operations must be ordered by ascending &runqueue. */struct runqueue {	spinlock_t lock; 	/*	 * nr_running and cpu_load should be in the same cacheline because	 * remote CPUs use both these fields when doing load calculation.	 */	unsigned long nr_running;#ifdef CONFIG_SMP	unsigned long cpu_load[3];#endif	unsigned long long nr_switches; 	/*	 * This is part of a global counter where only the total sum	 * over all CPUs matters. A task can increase this counter on	 * one CPU and if it got migrated afterwards it may decrease	 * it on another CPU. Always updated under the runqueue lock:	 */	unsigned long nr_uninterruptible; 	unsigned long expired_timestamp;	unsigned long long timestamp_last_tick;	task_t *curr, *idle;	struct mm_struct *prev_mm;	prio_array_t *active, *expired, arrays[2];	int best_expired_prio;	atomic_t nr_iowait; #ifdef CONFIG_SMP	struct sched_domain *sd; 	/* For active balancing */	int active_balance;	int push_cpu; 	task_t *migration_thread;	struct list_head migration_queue;#endif #ifdef CONFIG_SCHEDSTATS	/* latency stats */	struct sched_info rq_sched_info; 	/* sys_sched_yield() stats */	unsigned long yld_exp_empty;	unsigned long yld_act_empty;	unsigned long yld_both_empty;	unsigned long yld_cnt; 	/* schedule() stats */	unsigned long sched_switch;	unsigned long sched_cnt;	unsigned long sched_goidle; 	/* try_to_wake_up() stats */	unsigned long ttwu_cnt;	unsigned long ttwu_local;#endif}; static DEFINE_PER_CPU(struct runqueue, runqueues); /* * The domain tree (rq->sd) is protected by RCU's quiescent state transition. * See detach_destroy_domains: synchronize_sched for details. * * The domain tree of any CPU may only be accessed from within * preempt-disabled sections. */#define for_each_domain(cpu, domain) \for (domain = rcu_dereference(cpu_rq(cpu)->sd); domain; domain = domain->parent) #define cpu_rq(cpu)		(&per_cpu(runqueues, (cpu)))#define this_rq()		(&__get_cpu_var(runqueues))#define task_rq(p)		cpu_rq(task_cpu(p))#define cpu_curr(cpu)		(cpu_rq(cpu)->curr) #ifndef prepare_arch_switch# define prepare_arch_switch(next)	do { } while (0)#endif#ifndef finish_arch_switch# define finish_arch_switch(prev)	do { } while (0)#endif #ifndef __ARCH_WANT_UNLOCKED_CTXSWstatic inline int task_running(runqueue_t *rq, task_t *p){	return rq->curr == p;} static inline void prepare_lock_switch(runqueue_t *rq, task_t *next){} static inline void finish_lock_switch(runqueue_t *rq, task_t *prev){	spin_unlock_irq(&rq->lock);} #else /* __ARCH_WANT_UNLOCKED_CTXSW */static inline int task_running(runqueue_t *rq, task_t *p){#ifdef CONFIG_SMP	return p->oncpu;#else	return rq->curr == p;#endif} static inline void prepare_lock_switch(runqueue_t *rq, task_t *next){#ifdef CONFIG_SMP	/*	 * We can optimise this out completely for !SMP, because the	 * SMP rebalancing from interrupt is the only thing that cares	 * here.	 */	next->oncpu = 1;#endif#ifdef __ARCH_WANT_INTERRUPTS_ON_CTXSW	spin_unlock_irq(&rq->lock);#else	spin_unlock(&rq->lock);#endif} static inline void finish_lock_switch(runqueue_t *rq, task_t *prev){#ifdef CONFIG_SMP	/*	 * After ->oncpu is cleared, the task can be moved to a different CPU.	 * We must ensure this doesn't happen until the switch is completely	 * finished.	 */	smp_wmb();	prev->oncpu = 0;#endif#ifndef __ARCH_WANT_INTERRUPTS_ON_CTXSW	local_irq_enable();#endif}#endif /* __ARCH_WANT_UNLOCKED_CTXSW */ /* * task_rq_lock - lock the runqueue a given task resides on and disable * interrupts.  Note the ordering: we can safely lookup the task_rq without * explicitly disabling preemption. */static inline runqueue_t *task_rq_lock(task_t *p, unsigned long *flags)	__acquires(rq->lock){	struct runqueue *rq; repeat_lock_task:	local_irq_save(*flags);	rq = task_rq(p);	spin_lock(&rq->lock);	if (unlikely(rq != task_rq(p))) {		spin_unlock_irqrestore(&rq->lock, *flags);		goto repeat_lock_task;	}	return rq;} static inline void task_rq_unlock(runqueue_t *rq, unsigned long *flags)	__releases(rq->lock){	spin_unlock_irqrestore(&rq->lock, *flags);} #ifdef CONFIG_SCHEDSTATS/* * bump this up when changing the output format or the meaning of an existing * format, so that tools can adapt (or abort) */#define SCHEDSTAT_VERSION 12 static int show_schedstat(struct seq_file *seq, void *v){	int cpu; 	seq_printf(seq, "version %d\n", SCHEDSTAT_VERSION);	seq_printf(seq, "timestamp %lu\n", jiffies);	for_each_online_cpu(cpu) {		runqueue_t *rq = cpu_rq(cpu);#ifdef CONFIG_SMP		struct sched_domain *sd;		int dcnt = 0;#endif 		/* runqueue-specific stats */		seq_printf(seq,		    "cpu%d %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu",		    cpu, rq->yld_both_empty,		    rq->yld_act_empty, rq->yld_exp_empty, rq->yld_cnt,		    rq->sched_switch, rq->sched_cnt, rq->sched_goidle,		    rq->ttwu_cnt, rq->ttwu_local,		    rq->rq_sched_info.cpu_time,		    rq->rq_sched_info.run_delay, rq->rq_sched_info.pcnt); 		seq_printf(seq, "\n"); #ifdef CONFIG_SMP		/* domain-specific stats */		preempt_disable();		for_each_domain(cpu, sd) {			enum idle_type itype;			char mask_str[NR_CPUS]; 			cpumask_scnprintf(mask_str, NR_CPUS, sd->span);			seq_printf(seq, "domain%d %s", dcnt++, mask_str);			for (itype = SCHED_IDLE; itype < MAX_IDLE_TYPES;					itype++) {				seq_printf(seq, " %lu %lu %lu %lu %lu %lu %lu %lu",				    sd->lb_cnt[itype],				    sd->lb_balanced[itype],				    sd->lb_failed[itype],				    sd->lb_imbalance[itype],				    sd->lb_gained[itype],				    sd->lb_hot_gained[itype],				    sd->lb_nobusyq[itype],				    sd->lb_nobusyg[itype]);			}			seq_printf(seq, " %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu\n",			    sd->alb_cnt, sd->alb_failed, sd->alb_pushed,			    sd->sbe_cnt, sd->sbe_balanced, sd->sbe_pushed,			    sd->sbf_cnt, sd->sbf_balanced, sd->sbf_pushed,			    sd->ttwu_wake_remote, sd->ttwu_move_affine, sd->ttwu_move_balance);		}		preempt_enable();#endif	}	return 0;} static int schedstat_open(struct inode *inode, struct file *file){	unsigned int size = PAGE_SIZE * (1 + num_online_cpus() / 32);	char *buf = kmalloc(size, GFP_KERNEL);	struct seq_file *m;	int res; 	if (!buf)		return -ENOMEM;	res = single_open(file, show_schedstat, NULL);	if (!res) {		m = file->private_data;		m->buf = buf;		m->size = size;	} else		kfree(buf);	return res;} struct file_operations proc_schedstat_operations = {	.open    = schedstat_open,	.read    = seq_read,	.llseek  = seq_lseek,	.release = single_release,}; # define schedstat_inc(rq, field)	do { (rq)->field++; } while (0)# define schedstat_add(rq, field, amt)	do { (rq)->field += (amt); } while (0)#else /* !CONFIG_SCHEDSTATS */# define schedstat_inc(rq, field)	do { } while (0)# define schedstat_add(rq, field, amt)	do { } while (0)#endif /* * rq_lock - lock a given runqueue and disable interrupts. */static inline runqueue_t *this_rq_lock(void)	__acquires(rq->lock){	runqueue_t *rq; 	local_irq_disable();	rq = this_rq();	spin_lock(&rq->lock); 	return rq;} #ifdef CONFIG_SCHEDSTATS/* * Called when a process is dequeued from the active array and given * the cpu.  We should note that with the exception of interactive * tasks, the expired queue will become the active queue after the active * queue is empty, without explicitly dequeuing and requeuing tasks in the * expired queue.  (Interactive tasks may be requeued directly to the * active queue, thus delaying tasks in the expired queue from running; * see scheduler_tick()). * * This function is only called from sched_info_arrive(), rather than * dequeue_task(). Even though a task may be queued and dequeued multiple * times as it is shuffled about, we're really interested in knowing how * long it was from the *first* time it was queued to the time that it * finally hit a cpu. */static inline void sched_info_dequeued(task_t *t)

Lines 1–500 of 5265.