summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorCon Kolivas <kernel@kolivas.org>2016-11-08 17:54:56 +1100
committerCon Kolivas <kernel@kolivas.org>2016-11-08 17:59:48 +1100
commit9b739794bc118bbe351b378b98e11abc777ff80d (patch)
treeeb89b2c9ae2632ef6d2c99d7df60d8158bb1b56b /kernel
parentdf479f86fec75652034da14a7fc7e401d5c8b180 (diff)
Make freezable timeouts not use the highres timers.
Diffstat (limited to 'kernel')
-rw-r--r--kernel/time/timer.c22
1 files changed, 17 insertions, 5 deletions
diff --git a/kernel/time/timer.c b/kernel/time/timer.c
index 7651d47e7975..0455ab7dd18d 100644
--- a/kernel/time/timer.c
+++ b/kernel/time/timer.c
@@ -1709,7 +1709,7 @@ static void process_timeout(unsigned long __data)
*
* In all cases the return value is guaranteed to be non-negative.
*/
-signed long __sched schedule_timeout(signed long timeout)
+static signed long __schedule_timeout(signed long timeout, bool freezable)
{
struct timer_list timer;
unsigned long expire;
@@ -1745,7 +1745,7 @@ signed long __sched schedule_timeout(signed long timeout)
expire = timeout + jiffies;
- if (timeout == 1 && hrtimer_resolution < NSEC_PER_SEC / HZ) {
+ if (timeout == 1 && !freezable && 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
@@ -1769,8 +1769,20 @@ out_timeout:
out:
return timeout < 0 ? 0 : timeout;
}
+
+signed long __sched schedule_timeout(signed long timeout)
+{
+ return __schedule_timeout(timeout, false);
+}
EXPORT_SYMBOL(schedule_timeout);
+signed long __sched fschedule_timeout(signed long timeout)
+{
+ return __schedule_timeout(timeout, true);
+}
+EXPORT_SYMBOL(fschedule_timeout);
+
+
/*
* We can use __set_current_state() here because schedule_timeout() calls
* schedule() unconditionally.
@@ -1785,14 +1797,14 @@ EXPORT_SYMBOL(schedule_timeout_interruptible);
signed long __sched schedule_timeout_killable(signed long timeout)
{
__set_current_state(TASK_KILLABLE);
- return schedule_timeout(timeout);
+ return fschedule_timeout(timeout);
}
EXPORT_SYMBOL(schedule_timeout_killable);
signed long __sched schedule_timeout_uninterruptible(signed long timeout)
{
__set_current_state(TASK_UNINTERRUPTIBLE);
- return schedule_timeout(timeout);
+ return fschedule_timeout(timeout);
}
EXPORT_SYMBOL(schedule_timeout_uninterruptible);
@@ -1803,7 +1815,7 @@ EXPORT_SYMBOL(schedule_timeout_uninterruptible);
signed long __sched schedule_timeout_idle(signed long timeout)
{
__set_current_state(TASK_IDLE);
- return schedule_timeout(timeout);
+ return fschedule_timeout(timeout);
}
EXPORT_SYMBOL(schedule_timeout_idle);