diff options
Diffstat (limited to 'kernel/sched/rt.c')
| -rw-r--r-- | kernel/sched/rt.c | 23 | 
1 files changed, 18 insertions, 5 deletions
diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c index b48baaba2fc2..7b4f4fbbb404 100644 --- a/kernel/sched/rt.c +++ b/kernel/sched/rt.c @@ -52,11 +52,8 @@ void init_rt_bandwidth(struct rt_bandwidth *rt_b, u64 period, u64 runtime)  	rt_b->rt_period_timer.function = sched_rt_period_timer;  } -static void start_rt_bandwidth(struct rt_bandwidth *rt_b) +static inline void do_start_rt_bandwidth(struct rt_bandwidth *rt_b)  { -	if (!rt_bandwidth_enabled() || rt_b->rt_runtime == RUNTIME_INF) -		return; -  	raw_spin_lock(&rt_b->rt_runtime_lock);  	if (!rt_b->rt_period_active) {  		rt_b->rt_period_active = 1; @@ -75,6 +72,14 @@ static void start_rt_bandwidth(struct rt_bandwidth *rt_b)  	raw_spin_unlock(&rt_b->rt_runtime_lock);  } +static void start_rt_bandwidth(struct rt_bandwidth *rt_b) +{ +	if (!rt_bandwidth_enabled() || rt_b->rt_runtime == RUNTIME_INF) +		return; + +	do_start_rt_bandwidth(rt_b); +} +  void init_rt_rq(struct rt_rq *rt_rq)  {  	struct rt_prio_array *array; @@ -1031,13 +1036,17 @@ static void update_curr_rt(struct rq *rq)  	for_each_sched_rt_entity(rt_se) {  		struct rt_rq *rt_rq = rt_rq_of_se(rt_se); +		int exceeded;  		if (sched_rt_runtime(rt_rq) != RUNTIME_INF) {  			raw_spin_lock(&rt_rq->rt_runtime_lock);  			rt_rq->rt_time += delta_exec; -			if (sched_rt_runtime_exceeded(rt_rq)) +			exceeded = sched_rt_runtime_exceeded(rt_rq); +			if (exceeded)  				resched_curr(rq);  			raw_spin_unlock(&rt_rq->rt_runtime_lock); +			if (exceeded) +				do_start_rt_bandwidth(sched_rt_bandwidth(rt_rq));  		}  	}  } @@ -2911,8 +2920,12 @@ static int sched_rt_global_validate(void)  static void sched_rt_do_global(void)  { +	unsigned long flags; + +	raw_spin_lock_irqsave(&def_rt_bandwidth.rt_runtime_lock, flags);  	def_rt_bandwidth.rt_runtime = global_rt_runtime();  	def_rt_bandwidth.rt_period = ns_to_ktime(global_rt_period()); +	raw_spin_unlock_irqrestore(&def_rt_bandwidth.rt_runtime_lock, flags);  }  int sched_rt_handler(struct ctl_table *table, int write, void *buffer,  |