Merge branch 'timers-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull timer fixes from Thomas Gleixner: "A rather small update for the time(r) subsystem: - A new clocksource driver IMX-TPM - Minor fixes to the alarmtimer facility - Device tree cleanups for Renesas drivers - A new kselftest and fixes for the timer related tests - Conversion of the clocksource drivers to use %pOF - Use the proper helpers to access rlimits in the posix-cpu-timer code" * 'timers-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: alarmtimer: Ensure RTC module is not unloaded clocksource: Convert to using %pOF instead of full_name clocksource/drivers/bcm2835: Remove message for a memory allocation failure devicetree: bindings: Remove deprecated properties devicetree: bindings: Remove unused 32-bit CMT bindings devicetree: bindings: Deprecate property, update example devicetree: bindings: r8a73a4 and R-Car Gen2 CMT bindings devicetree: bindings: R-Car Gen2 CMT0 and CMT1 bindings devicetree: bindings: Remove sh7372 CMT binding clocksource/drivers/imx-tpm: Add imx tpm timer support dt-bindings: timer: Add nxp tpm timer binding doc posix-cpu-timers: Use dedicated helper to access rlimit values alarmtimer: Fix unavailable wake-up source in sysfs timekeeping: Use proper timekeeper for debug code kselftests: timers: set-timer-lat: Add one-shot timer test cases kselftests: timers: set-timer-lat: Tweak reporting when timer fires early kselftests: timers: freq-step: Fix build warning kselftests: timers: freq-step: Define ADJ_SETOFFSET if device has older kernel headers
This commit is contained in:
@@ -28,6 +28,7 @@
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/freezer.h>
|
||||
#include <linux/compat.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
#include "posix-timers.h"
|
||||
|
||||
@@ -56,9 +57,9 @@ static ktime_t freezer_delta;
|
||||
static DEFINE_SPINLOCK(freezer_delta_lock);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_RTC_CLASS
|
||||
static struct wakeup_source *ws;
|
||||
|
||||
#ifdef CONFIG_RTC_CLASS
|
||||
/* rtc timer and device for setting alarm wakeups at suspend */
|
||||
static struct rtc_timer rtctimer;
|
||||
static struct rtc_device *rtcdev;
|
||||
@@ -89,6 +90,7 @@ static int alarmtimer_rtc_add_device(struct device *dev,
|
||||
{
|
||||
unsigned long flags;
|
||||
struct rtc_device *rtc = to_rtc_device(dev);
|
||||
struct wakeup_source *__ws;
|
||||
|
||||
if (rtcdev)
|
||||
return -EBUSY;
|
||||
@@ -98,13 +100,25 @@ static int alarmtimer_rtc_add_device(struct device *dev,
|
||||
if (!device_may_wakeup(rtc->dev.parent))
|
||||
return -1;
|
||||
|
||||
__ws = wakeup_source_register("alarmtimer");
|
||||
|
||||
spin_lock_irqsave(&rtcdev_lock, flags);
|
||||
if (!rtcdev) {
|
||||
if (!try_module_get(rtc->owner)) {
|
||||
spin_unlock_irqrestore(&rtcdev_lock, flags);
|
||||
return -1;
|
||||
}
|
||||
|
||||
rtcdev = rtc;
|
||||
/* hold a reference so it doesn't go away */
|
||||
get_device(dev);
|
||||
ws = __ws;
|
||||
__ws = NULL;
|
||||
}
|
||||
spin_unlock_irqrestore(&rtcdev_lock, flags);
|
||||
|
||||
wakeup_source_unregister(__ws);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -860,7 +874,6 @@ static int __init alarmtimer_init(void)
|
||||
error = PTR_ERR(pdev);
|
||||
goto out_drv;
|
||||
}
|
||||
ws = wakeup_source_register("alarmtimer");
|
||||
return 0;
|
||||
|
||||
out_drv:
|
||||
|
@@ -799,7 +799,6 @@ static void check_thread_timers(struct task_struct *tsk,
|
||||
struct list_head *firing)
|
||||
{
|
||||
struct list_head *timers = tsk->cpu_timers;
|
||||
struct signal_struct *const sig = tsk->signal;
|
||||
struct task_cputime *tsk_expires = &tsk->cputime_expires;
|
||||
u64 expires;
|
||||
unsigned long soft;
|
||||
@@ -823,10 +822,9 @@ static void check_thread_timers(struct task_struct *tsk,
|
||||
/*
|
||||
* Check for the special case thread timers.
|
||||
*/
|
||||
soft = READ_ONCE(sig->rlim[RLIMIT_RTTIME].rlim_cur);
|
||||
soft = task_rlimit(tsk, RLIMIT_RTTIME);
|
||||
if (soft != RLIM_INFINITY) {
|
||||
unsigned long hard =
|
||||
READ_ONCE(sig->rlim[RLIMIT_RTTIME].rlim_max);
|
||||
unsigned long hard = task_rlimit_max(tsk, RLIMIT_RTTIME);
|
||||
|
||||
if (hard != RLIM_INFINITY &&
|
||||
tsk->rt.timeout > DIV_ROUND_UP(hard, USEC_PER_SEC/HZ)) {
|
||||
@@ -847,7 +845,8 @@ static void check_thread_timers(struct task_struct *tsk,
|
||||
*/
|
||||
if (soft < hard) {
|
||||
soft += USEC_PER_SEC;
|
||||
sig->rlim[RLIMIT_RTTIME].rlim_cur = soft;
|
||||
tsk->signal->rlim[RLIMIT_RTTIME].rlim_cur =
|
||||
soft;
|
||||
}
|
||||
if (print_fatal_signals) {
|
||||
pr_info("RT Watchdog Timeout (soft): %s[%d]\n",
|
||||
@@ -938,11 +937,10 @@ static void check_process_timers(struct task_struct *tsk,
|
||||
SIGPROF);
|
||||
check_cpu_itimer(tsk, &sig->it[CPUCLOCK_VIRT], &virt_expires, utime,
|
||||
SIGVTALRM);
|
||||
soft = READ_ONCE(sig->rlim[RLIMIT_CPU].rlim_cur);
|
||||
soft = task_rlimit(tsk, RLIMIT_CPU);
|
||||
if (soft != RLIM_INFINITY) {
|
||||
unsigned long psecs = div_u64(ptime, NSEC_PER_SEC);
|
||||
unsigned long hard =
|
||||
READ_ONCE(sig->rlim[RLIMIT_CPU].rlim_max);
|
||||
unsigned long hard = task_rlimit_max(tsk, RLIMIT_CPU);
|
||||
u64 x;
|
||||
if (psecs >= hard) {
|
||||
/*
|
||||
|
@@ -2064,7 +2064,7 @@ void update_wall_time(void)
|
||||
goto out;
|
||||
|
||||
/* Do some additional sanity checking */
|
||||
timekeeping_check_update(real_tk, offset);
|
||||
timekeeping_check_update(tk, offset);
|
||||
|
||||
/*
|
||||
* With NO_HZ we may have to accumulate many cycle_intervals
|
||||
|
Reference in New Issue
Block a user