diff options
Diffstat (limited to 'kernel/sched.c')
| -rw-r--r-- | kernel/sched.c | 61 | 
1 files changed, 44 insertions, 17 deletions
diff --git a/kernel/sched.c b/kernel/sched.c index 7c9098d186e..1b59e265273 100644 --- a/kernel/sched.c +++ b/kernel/sched.c @@ -493,6 +493,7 @@ struct rt_rq {  #endif  #ifdef CONFIG_SMP  	unsigned long rt_nr_migratory; +	unsigned long rt_nr_total;  	int overloaded;  	struct plist_head pushable_tasks;  #endif @@ -2571,15 +2572,37 @@ static void __sched_fork(struct task_struct *p)  	p->se.avg_wakeup		= sysctl_sched_wakeup_granularity;  #ifdef CONFIG_SCHEDSTATS -	p->se.wait_start		= 0; -	p->se.sum_sleep_runtime		= 0; -	p->se.sleep_start		= 0; -	p->se.block_start		= 0; -	p->se.sleep_max			= 0; -	p->se.block_max			= 0; -	p->se.exec_max			= 0; -	p->se.slice_max			= 0; -	p->se.wait_max			= 0; +	p->se.wait_start			= 0; +	p->se.wait_max				= 0; +	p->se.wait_count			= 0; +	p->se.wait_sum				= 0; + +	p->se.sleep_start			= 0; +	p->se.sleep_max				= 0; +	p->se.sum_sleep_runtime			= 0; + +	p->se.block_start			= 0; +	p->se.block_max				= 0; +	p->se.exec_max				= 0; +	p->se.slice_max				= 0; + +	p->se.nr_migrations_cold		= 0; +	p->se.nr_failed_migrations_affine	= 0; +	p->se.nr_failed_migrations_running	= 0; +	p->se.nr_failed_migrations_hot		= 0; +	p->se.nr_forced_migrations		= 0; +	p->se.nr_forced2_migrations		= 0; + +	p->se.nr_wakeups			= 0; +	p->se.nr_wakeups_sync			= 0; +	p->se.nr_wakeups_migrate		= 0; +	p->se.nr_wakeups_local			= 0; +	p->se.nr_wakeups_remote			= 0; +	p->se.nr_wakeups_affine			= 0; +	p->se.nr_wakeups_affine_attempts	= 0; +	p->se.nr_wakeups_passive		= 0; +	p->se.nr_wakeups_idle			= 0; +  #endif  	INIT_LIST_HEAD(&p->rt.run_list); @@ -6541,6 +6564,11 @@ SYSCALL_DEFINE0(sched_yield)  	return 0;  } +static inline int should_resched(void) +{ +	return need_resched() && !(preempt_count() & PREEMPT_ACTIVE); +} +  static void __cond_resched(void)  {  #ifdef CONFIG_DEBUG_SPINLOCK_SLEEP @@ -6560,8 +6588,7 @@ static void __cond_resched(void)  int __sched _cond_resched(void)  { -	if (need_resched() && !(preempt_count() & PREEMPT_ACTIVE) && -					system_state == SYSTEM_RUNNING) { +	if (should_resched()) {  		__cond_resched();  		return 1;  	} @@ -6579,12 +6606,12 @@ EXPORT_SYMBOL(_cond_resched);   */  int cond_resched_lock(spinlock_t *lock)  { -	int resched = need_resched() && system_state == SYSTEM_RUNNING; +	int resched = should_resched();  	int ret = 0;  	if (spin_needbreak(lock) || resched) {  		spin_unlock(lock); -		if (resched && need_resched()) +		if (resched)  			__cond_resched();  		else  			cpu_relax(); @@ -6599,7 +6626,7 @@ int __sched cond_resched_softirq(void)  {  	BUG_ON(!in_softirq()); -	if (need_resched() && system_state == SYSTEM_RUNNING) { +	if (should_resched()) {  		local_bh_enable();  		__cond_resched();  		local_bh_disable(); @@ -7262,6 +7289,7 @@ static void migrate_dead_tasks(unsigned int dead_cpu)  static void calc_global_load_remove(struct rq *rq)  {  	atomic_long_sub(rq->calc_load_active, &calc_load_tasks); +	rq->calc_load_active = 0;  }  #endif /* CONFIG_HOTPLUG_CPU */ @@ -7488,6 +7516,7 @@ migration_call(struct notifier_block *nfb, unsigned long action, void *hcpu)  		task_rq_unlock(rq, &flags);  		get_task_struct(p);  		cpu_rq(cpu)->migration_thread = p; +		rq->calc_load_update = calc_load_update;  		break;  	case CPU_ONLINE: @@ -7498,8 +7527,6 @@ migration_call(struct notifier_block *nfb, unsigned long action, void *hcpu)  		/* Update our root-domain */  		rq = cpu_rq(cpu);  		spin_lock_irqsave(&rq->lock, flags); -		rq->calc_load_update = calc_load_update; -		rq->calc_load_active = 0;  		if (rq->rd) {  			BUG_ON(!cpumask_test_cpu(cpu, rq->rd->span)); @@ -9070,7 +9097,7 @@ static void init_rt_rq(struct rt_rq *rt_rq, struct rq *rq)  #ifdef CONFIG_SMP  	rt_rq->rt_nr_migratory = 0;  	rt_rq->overloaded = 0; -	plist_head_init(&rq->rt.pushable_tasks, &rq->lock); +	plist_head_init(&rt_rq->pushable_tasks, &rq->lock);  #endif  	rt_rq->rt_time = 0;  |