diff options
Diffstat (limited to 'kernel/sched.c')
-rw-r--r-- | kernel/sched.c | 15 |
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 | ||
422 | static inline u64 default_cfs_period(void); | 422 | static inline u64 default_cfs_period(void); |
423 | static int do_sched_cfs_period_timer(struct cfs_bandwidth *cfs_b, int overrun); | 423 | static int do_sched_cfs_period_timer(struct cfs_bandwidth *cfs_b, int overrun); |
424 | static void do_sched_cfs_slack_timer(struct cfs_bandwidth *cfs_b); | ||
425 | |||
426 | static 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 | ||
425 | static enum hrtimer_restart sched_cfs_period_timer(struct hrtimer *timer) | 435 | static 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 | ||
458 | static void init_cfs_rq_runtime(struct cfs_rq *cfs_rq) | 470 | static void init_cfs_rq_runtime(struct cfs_rq *cfs_rq) |
@@ -488,6 +500,7 @@ static void __start_cfs_bandwidth(struct cfs_bandwidth *cfs_b) | |||
488 | static void destroy_cfs_bandwidth(struct cfs_bandwidth *cfs_b) | 500 | static 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 |
493 | static void init_cfs_rq_runtime(struct cfs_rq *cfs_rq) {} | 506 | static void init_cfs_rq_runtime(struct cfs_rq *cfs_rq) {} |