diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2016-12-12 22:56:15 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-12-12 22:56:15 -0500 |
| commit | 9465d9cc31fa732089cd8bec9f1bdfcdc174a5ce (patch) | |
| tree | fb31a0a6271b255ffe6e29b4f9eb4192253f8c7f /kernel/time/timer.c | |
| parent | e71c3978d6f97659f6c3ee942c3e581299e4adf2 (diff) | |
| parent | c029a2bec66e42e57538cb65e28618baf6a4b311 (diff) | |
Merge branch 'timers-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull timer updates from Thomas Gleixner:
"The time/timekeeping/timer folks deliver with this update:
- Fix a reintroduced signed/unsigned issue and cleanup the whole
signed/unsigned mess in the timekeeping core so this wont happen
accidentaly again.
- Add a new trace clock based on boot time
- Prevent injection of random sleep times when PM tracing abuses the
RTC for storage
- Make posix timers configurable for real tiny systems
- Add tracepoints for the alarm timer subsystem so timer based
suspend wakeups can be instrumented
- The usual pile of fixes and updates to core and drivers"
* 'timers-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (23 commits)
timekeeping: Use mul_u64_u32_shr() instead of open coding it
timekeeping: Get rid of pointless typecasts
timekeeping: Make the conversion call chain consistently unsigned
timekeeping_Force_unsigned_clocksource_to_nanoseconds_conversion
alarmtimer: Add tracepoints for alarm timers
trace: Update documentation for mono, mono_raw and boot clock
trace: Add an option for boot clock as trace clock
timekeeping: Add a fast and NMI safe boot clock
timekeeping/clocksource_cyc2ns: Document intended range limitation
timekeeping: Ignore the bogus sleep time if pm_trace is enabled
selftests/timers: Fix spelling mistake "Asyncrhonous" -> "Asynchronous"
clocksource/drivers/bcm2835_timer: Unmap region obtained by of_iomap
clocksource/drivers/arm_arch_timer: Map frame with of_io_request_and_map()
arm64: dts: rockchip: Arch counter doesn't tick in system suspend
clocksource/drivers/arm_arch_timer: Don't assume clock runs in suspend
posix-timers: Make them configurable
posix_cpu_timers: Move the add_device_randomness() call to a proper place
timer: Move sys_alarm from timer.c to itimer.c
ptp_clock: Allow for it to be optional
Kconfig: Regenerate *.c_shipped files after previous changes
...
Diffstat (limited to 'kernel/time/timer.c')
| -rw-r--r-- | kernel/time/timer.c | 48 |
1 files changed, 18 insertions, 30 deletions
diff --git a/kernel/time/timer.c b/kernel/time/timer.c index c611c47de884..ea4fbf8477a9 100644 --- a/kernel/time/timer.c +++ b/kernel/time/timer.c | |||
| @@ -1615,7 +1615,8 @@ void update_process_times(int user_tick) | |||
| 1615 | irq_work_tick(); | 1615 | irq_work_tick(); |
| 1616 | #endif | 1616 | #endif |
| 1617 | scheduler_tick(); | 1617 | scheduler_tick(); |
| 1618 | run_posix_cpu_timers(p); | 1618 | if (IS_ENABLED(CONFIG_POSIX_TIMERS)) |
| 1619 | run_posix_cpu_timers(p); | ||
| 1619 | } | 1620 | } |
| 1620 | 1621 | ||
| 1621 | /** | 1622 | /** |
| @@ -1676,19 +1677,6 @@ void run_local_timers(void) | |||
| 1676 | raise_softirq(TIMER_SOFTIRQ); | 1677 | raise_softirq(TIMER_SOFTIRQ); |
| 1677 | } | 1678 | } |
| 1678 | 1679 | ||
| 1679 | #ifdef __ARCH_WANT_SYS_ALARM | ||
| 1680 | |||
| 1681 | /* | ||
| 1682 | * For backwards compatibility? This can be done in libc so Alpha | ||
| 1683 | * and all newer ports shouldn't need it. | ||
| 1684 | */ | ||
| 1685 | SYSCALL_DEFINE1(alarm, unsigned int, seconds) | ||
| 1686 | { | ||
| 1687 | return alarm_setitimer(seconds); | ||
| 1688 | } | ||
| 1689 | |||
| 1690 | #endif | ||
| 1691 | |||
| 1692 | static void process_timeout(unsigned long __data) | 1680 | static void process_timeout(unsigned long __data) |
| 1693 | { | 1681 | { |
| 1694 | wake_up_process((struct task_struct *)__data); | 1682 | wake_up_process((struct task_struct *)__data); |
| @@ -1705,11 +1693,12 @@ static void process_timeout(unsigned long __data) | |||
| 1705 | * You can set the task state as follows - | 1693 | * You can set the task state as follows - |
| 1706 | * | 1694 | * |
| 1707 | * %TASK_UNINTERRUPTIBLE - at least @timeout jiffies are guaranteed to | 1695 | * %TASK_UNINTERRUPTIBLE - at least @timeout jiffies are guaranteed to |
| 1708 | * pass before the routine returns. The routine will return 0 | 1696 | * pass before the routine returns unless the current task is explicitly |
| 1697 | * woken up, (e.g. by wake_up_process())". | ||
| 1709 | * | 1698 | * |
| 1710 | * %TASK_INTERRUPTIBLE - the routine may return early if a signal is | 1699 | * %TASK_INTERRUPTIBLE - the routine may return early if a signal is |
| 1711 | * delivered to the current task. In this case the remaining time | 1700 | * delivered to the current task or the current task is explicitly woken |
| 1712 | * in jiffies will be returned, or 0 if the timer expired in time | 1701 | * up. |
| 1713 | * | 1702 | * |
| 1714 | * The current task state is guaranteed to be TASK_RUNNING when this | 1703 | * The current task state is guaranteed to be TASK_RUNNING when this |
| 1715 | * routine returns. | 1704 | * routine returns. |
| @@ -1718,7 +1707,9 @@ static void process_timeout(unsigned long __data) | |||
| 1718 | * the CPU away without a bound on the timeout. In this case the return | 1707 | * the CPU away without a bound on the timeout. In this case the return |
| 1719 | * value will be %MAX_SCHEDULE_TIMEOUT. | 1708 | * value will be %MAX_SCHEDULE_TIMEOUT. |
| 1720 | * | 1709 | * |
| 1721 | * In all cases the return value is guaranteed to be non-negative. | 1710 | * Returns 0 when the timer has expired otherwise the remaining time in |
| 1711 | * jiffies will be returned. In all cases the return value is guaranteed | ||
| 1712 | * to be non-negative. | ||
| 1722 | */ | 1713 | */ |
| 1723 | signed long __sched schedule_timeout(signed long timeout) | 1714 | signed long __sched schedule_timeout(signed long timeout) |
| 1724 | { | 1715 | { |
| @@ -1910,16 +1901,6 @@ unsigned long msleep_interruptible(unsigned int msecs) | |||
| 1910 | 1901 | ||
| 1911 | EXPORT_SYMBOL(msleep_interruptible); | 1902 | EXPORT_SYMBOL(msleep_interruptible); |
| 1912 | 1903 | ||
| 1913 | static void __sched do_usleep_range(unsigned long min, unsigned long max) | ||
| 1914 | { | ||
| 1915 | ktime_t kmin; | ||
| 1916 | u64 delta; | ||
| 1917 | |||
| 1918 | kmin = ktime_set(0, min * NSEC_PER_USEC); | ||
| 1919 | delta = (u64)(max - min) * NSEC_PER_USEC; | ||
| 1920 | schedule_hrtimeout_range(&kmin, delta, HRTIMER_MODE_REL); | ||
| 1921 | } | ||
| 1922 | |||
| 1923 | /** | 1904 | /** |
| 1924 | * usleep_range - Sleep for an approximate time | 1905 | * usleep_range - Sleep for an approximate time |
| 1925 | * @min: Minimum time in usecs to sleep | 1906 | * @min: Minimum time in usecs to sleep |
| @@ -1933,7 +1914,14 @@ static void __sched do_usleep_range(unsigned long min, unsigned long max) | |||
| 1933 | */ | 1914 | */ |
| 1934 | void __sched usleep_range(unsigned long min, unsigned long max) | 1915 | void __sched usleep_range(unsigned long min, unsigned long max) |
| 1935 | { | 1916 | { |
| 1936 | __set_current_state(TASK_UNINTERRUPTIBLE); | 1917 | ktime_t exp = ktime_add_us(ktime_get(), min); |
| 1937 | do_usleep_range(min, max); | 1918 | u64 delta = (u64)(max - min) * NSEC_PER_USEC; |
| 1919 | |||
| 1920 | for (;;) { | ||
| 1921 | __set_current_state(TASK_UNINTERRUPTIBLE); | ||
| 1922 | /* Do not return before the requested sleep time has elapsed */ | ||
| 1923 | if (!schedule_hrtimeout_range(&exp, delta, HRTIMER_MODE_ABS)) | ||
| 1924 | break; | ||
| 1925 | } | ||
| 1938 | } | 1926 | } |
| 1939 | EXPORT_SYMBOL(usleep_range); | 1927 | EXPORT_SYMBOL(usleep_range); |
