diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/sched/core.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 2d1239a8b230..49a64b4117a1 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -876,6 +876,7 @@ enum { HRTICK_SCHED_NONE = 0, HRTICK_SCHED_DEFER = BIT(1), HRTICK_SCHED_START = BIT(2), + HRTICK_SCHED_REARM_HRTIMER = BIT(3) }; static void hrtick_clear(struct rq *rq) @@ -974,6 +975,8 @@ void hrtick_start(struct rq *rq, u64 delay) static inline void hrtick_schedule_enter(struct rq *rq) { rq->hrtick_sched = HRTICK_SCHED_DEFER; + if (hrtimer_test_and_clear_rearm_deferred()) + rq->hrtick_sched |= HRTICK_SCHED_REARM_HRTIMER; } static inline void hrtick_schedule_exit(struct rq *rq) @@ -991,6 +994,9 @@ static inline void hrtick_schedule_exit(struct rq *rq) hrtimer_cancel(&rq->hrtick_timer); } + if (rq->hrtick_sched & HRTICK_SCHED_REARM_HRTIMER) + __hrtimer_rearm_deferred(); + rq->hrtick_sched = HRTICK_SCHED_NONE; } |
