|
@@ -3130,7 +3130,7 @@ static int assign_cfs_rq_runtime(struct cfs_rq *cfs_rq)
|
|
|
*/
|
|
|
if (!cfs_b->timer_active) {
|
|
|
__refill_cfs_bandwidth_runtime(cfs_b);
|
|
|
- __start_cfs_bandwidth(cfs_b);
|
|
|
+ __start_cfs_bandwidth(cfs_b, false);
|
|
|
}
|
|
|
|
|
|
if (cfs_b->runtime > 0) {
|
|
@@ -3309,7 +3309,7 @@ static void throttle_cfs_rq(struct cfs_rq *cfs_rq)
|
|
|
raw_spin_lock(&cfs_b->lock);
|
|
|
list_add_tail_rcu(&cfs_rq->throttled_list, &cfs_b->throttled_cfs_rq);
|
|
|
if (!cfs_b->timer_active)
|
|
|
- __start_cfs_bandwidth(cfs_b);
|
|
|
+ __start_cfs_bandwidth(cfs_b, false);
|
|
|
raw_spin_unlock(&cfs_b->lock);
|
|
|
}
|
|
|
|
|
@@ -3691,7 +3691,7 @@ static void init_cfs_rq_runtime(struct cfs_rq *cfs_rq)
|
|
|
}
|
|
|
|
|
|
/* requires cfs_b->lock, may release to reprogram timer */
|
|
|
-void __start_cfs_bandwidth(struct cfs_bandwidth *cfs_b)
|
|
|
+void __start_cfs_bandwidth(struct cfs_bandwidth *cfs_b, bool force)
|
|
|
{
|
|
|
/*
|
|
|
* The timer may be active because we're trying to set a new bandwidth
|
|
@@ -3706,7 +3706,7 @@ void __start_cfs_bandwidth(struct cfs_bandwidth *cfs_b)
|
|
|
cpu_relax();
|
|
|
raw_spin_lock(&cfs_b->lock);
|
|
|
/* if someone else restarted the timer then we're done */
|
|
|
- if (cfs_b->timer_active)
|
|
|
+ if (!force && cfs_b->timer_active)
|
|
|
return;
|
|
|
}
|
|
|
|