From d6495605d4001d4fa3f99d7b902ab5b672ab14ca Mon Sep 17 00:00:00 2001 From: Con Kolivas Date: Sat, 5 Nov 2016 09:27:36 +1100 Subject: [PATCH 05/19] Special case calls of schedule_timeout(1) to use the min hrtimeout of 1ms, working around low Hz resolutions. --- kernel/time/timer.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/kernel/time/timer.c b/kernel/time/timer.c index 68d3ec6..c7e644a 100644 --- a/kernel/time/timer.c +++ b/kernel/time/timer.c @@ -1759,6 +1759,17 @@ signed long __sched schedule_timeout(signed long timeout) expire = timeout + jiffies; + 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; + } + setup_timer_on_stack(&timer, process_timeout, (unsigned long)current); __mod_timer(&timer, expire, false); schedule(); @@ -1766,10 +1777,10 @@ signed long __sched schedule_timeout(signed long timeout) /* Remove the timer from the object tracker */ destroy_timer_on_stack(&timer); - +out_timeout: timeout = expire - jiffies; - out: +out: return timeout < 0 ? 0 : timeout; } EXPORT_SYMBOL(schedule_timeout); -- 2.7.4