aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/sched.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/sched.c')
-rw-r--r--kernel/sched.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/kernel/sched.c b/kernel/sched.c
index 35c91859f8a6..6baade0d7649 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -259,7 +259,7 @@ struct cfs_bandwidth {
259 u64 runtime_expires; 259 u64 runtime_expires;
260 260
261 int idle, timer_active; 261 int idle, timer_active;
262 struct hrtimer period_timer; 262 struct hrtimer period_timer, slack_timer;
263 struct list_head throttled_cfs_rq; 263 struct list_head throttled_cfs_rq;
264 264
265 /* statistics */ 265 /* statistics */
@@ -421,6 +421,16 @@ static inline struct cfs_bandwidth *tg_cfs_bandwidth(struct task_group *tg)
421 421
422static inline u64 default_cfs_period(void); 422static inline u64 default_cfs_period(void);
423static int do_sched_cfs_period_timer(struct cfs_bandwidth *cfs_b, int overrun); 423static int do_sched_cfs_period_timer(struct cfs_bandwidth *cfs_b, int overrun);
424static void do_sched_cfs_slack_timer(struct cfs_bandwidth *cfs_b);
425
426static enum hrtimer_restart sched_cfs_slack_timer(struct hrtimer *timer)
427{
428 struct cfs_bandwidth *cfs_b =
429 container_of(timer, struct cfs_bandwidth, slack_timer);
430 do_sched_cfs_slack_timer(cfs_b);
431
432 return HRTIMER_NORESTART;
433}
424 434
425static enum hrtimer_restart sched_cfs_period_timer(struct hrtimer *timer) 435static enum hrtimer_restart sched_cfs_period_timer(struct hrtimer *timer)
426{ 436{
@@ -453,6 +463,8 @@ static void init_cfs_bandwidth(struct cfs_bandwidth *cfs_b)
453 INIT_LIST_HEAD(&cfs_b->throttled_cfs_rq); 463 INIT_LIST_HEAD(&cfs_b->throttled_cfs_rq);
454 hrtimer_init(&cfs_b->period_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); 464 hrtimer_init(&cfs_b->period_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
455 cfs_b->period_timer.function = sched_cfs_period_timer; 465 cfs_b->period_timer.function = sched_cfs_period_timer;
466 hrtimer_init(&cfs_b->slack_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
467 cfs_b->slack_timer.function = sched_cfs_slack_timer;
456} 468}
457 469
458static void init_cfs_rq_runtime(struct cfs_rq *cfs_rq) 470static void init_cfs_rq_runtime(struct cfs_rq *cfs_rq)
@@ -488,6 +500,7 @@ static void __start_cfs_bandwidth(struct cfs_bandwidth *cfs_b)
488static void destroy_cfs_bandwidth(struct cfs_bandwidth *cfs_b) 500static void destroy_cfs_bandwidth(struct cfs_bandwidth *cfs_b)
489{ 501{
490 hrtimer_cancel(&cfs_b->period_timer); 502 hrtimer_cancel(&cfs_b->period_timer);
503 hrtimer_cancel(&cfs_b->slack_timer);
491} 504}
492#else 505#else
493static void init_cfs_rq_runtime(struct cfs_rq *cfs_rq) {} 506static void init_cfs_rq_runtime(struct cfs_rq *cfs_rq) {}