From 9f2db5a73725b4247fef5b70d4a07bb6b928be8d Mon Sep 17 00:00:00 2001 From: Con Kolivas Date: Sat, 5 Nov 2016 09:27:36 +1100 Subject: [PATCH 05/16] Special case calls of schedule_timeout(1) to use the min hrtimeout of 1ms, working around low Hz resolutions. --- kernel/time/timer.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/kernel/time/timer.c b/kernel/time/timer.c index 9a56096c19d4..57c3d31224de 100644 --- a/kernel/time/timer.c +++ b/kernel/time/timer.c @@ -1889,6 +1889,18 @@ signed long __sched schedule_timeout(signed long timeout) expire = timeout + jiffies; +#ifdef CONFIG_HIGH_RES_TIMERS + if (timeout == 1 && hrtimer_resolution < NSEC_PER_SEC / HZ) { + /* + * Special case 1 as being a request for the minimum timeout + * and use highres timers to timeout after 1ms to workaround + * the granularity of low Hz tick timers. + */ + if (!schedule_min_hrtimeout()) + return 0; + goto out_timeout; + } +#endif timer.task = current; timer_setup_on_stack(&timer.timer, process_timeout, 0); __mod_timer(&timer.timer, expire, MOD_TIMER_NOTPENDING); @@ -1897,10 +1909,10 @@ signed long __sched schedule_timeout(signed long timeout) /* Remove the timer from the object tracker */ destroy_timer_on_stack(&timer.timer); - +out_timeout: timeout = expire - jiffies; - out: +out: return timeout < 0 ? 0 : timeout; } EXPORT_SYMBOL(schedule_timeout); -- 2.25.1