diff options
Diffstat (limited to '')
| -rw-r--r-- | kernel/sched/sched.h | 38 | 
1 files changed, 21 insertions, 17 deletions
| diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index 31cc02ebc54e..579712f4e9d5 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h @@ -477,6 +477,9 @@ struct root_domain {  	cpumask_var_t span;  	cpumask_var_t online; +	/* Indicate more than one runnable task for any CPU */ +	bool overload; +  	/*  	 * The bit corresponding to a CPU gets set here if such CPU has more  	 * than one runnable -deadline task (as it is below for RT tasks). @@ -884,20 +887,10 @@ enum {  #undef SCHED_FEAT  #if defined(CONFIG_SCHED_DEBUG) && defined(HAVE_JUMP_LABEL) -static __always_inline bool static_branch__true(struct static_key *key) -{ -	return static_key_true(key); /* Not out of line branch. */ -} - -static __always_inline bool static_branch__false(struct static_key *key) -{ -	return static_key_false(key); /* Out of line branch. */ -} -  #define SCHED_FEAT(name, enabled)					\  static __always_inline bool static_branch_##name(struct static_key *key) \  {									\ -	return static_branch__##enabled(key);				\ +	return static_key_##enabled(key);				\  }  #include "features.h" @@ -1196,7 +1189,7 @@ extern void init_sched_rt_class(void);  extern void init_sched_fair_class(void);  extern void init_sched_dl_class(void); -extern void resched_task(struct task_struct *p); +extern void resched_curr(struct rq *rq);  extern void resched_cpu(int cpu);  extern struct rt_bandwidth def_rt_bandwidth; @@ -1218,15 +1211,26 @@ static inline void add_nr_running(struct rq *rq, unsigned count)  	rq->nr_running = prev_nr + count; -#ifdef CONFIG_NO_HZ_FULL  	if (prev_nr < 2 && rq->nr_running >= 2) { +#ifdef CONFIG_SMP +		if (!rq->rd->overload) +			rq->rd->overload = true; +#endif + +#ifdef CONFIG_NO_HZ_FULL  		if (tick_nohz_full_cpu(rq->cpu)) { -			/* Order rq->nr_running write against the IPI */ -			smp_wmb(); -			smp_send_reschedule(rq->cpu); +			/* +			 * Tick is needed if more than one task runs on a CPU. +			 * Send the target an IPI to kick it out of nohz mode. +			 * +			 * We assume that IPI implies full memory barrier and the +			 * new value of rq->nr_running is visible on reception +			 * from the target. +			 */ +			tick_nohz_full_kick_cpu(rq->cpu);  		} -       }  #endif +	}  }  static inline void sub_nr_running(struct rq *rq, unsigned count) | 
