From d7ba1aacc0af4862ac7ac11083631f52f4d641f0 Mon Sep 17 00:00:00 2001 From: Con Kolivas Date: Sat, 5 Nov 2016 09:27:36 +1100 Subject: [PATCH 05/17] 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 0c6141f94b77..c97a9ff76c01 100644 --- a/kernel/time/timer.c +++ b/kernel/time/timer.c @@ -1798,6 +1798,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, 0); @@ -1806,10 +1818,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.17.1