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 timer departement delivers: - more year 2038 rework - a massive rework of the arm achitected timer - preparatory patches to allow NTP correction of clock event devices to avoid early expiry - the usual pile of fixes and enhancements all over the place" * 'timers-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (91 commits) timer/sysclt: Restrict timer migration sysctl values to 0 and 1 arm64/arch_timer: Mark errata handlers as __maybe_unused Clocksource/mips-gic: Remove redundant non devicetree init MIPS/Malta: Probe gic-timer via devicetree clocksource: Use GENMASK_ULL in definition of CLOCKSOURCE_MASK acpi/arm64: Add SBSA Generic Watchdog support in GTDT driver clocksource: arm_arch_timer: add GTDT support for memory-mapped timer acpi/arm64: Add memory-mapped timer support in GTDT driver clocksource: arm_arch_timer: simplify ACPI support code. acpi/arm64: Add GTDT table parse driver clocksource: arm_arch_timer: split MMIO timer probing. clocksource: arm_arch_timer: add structs to describe MMIO timer clocksource: arm_arch_timer: move arch_timer_needs_of_probing into DT init call clocksource: arm_arch_timer: refactor arch_timer_needs_probing clocksource: arm_arch_timer: split dt-only rate handling x86/uv/time: Set ->min_delta_ticks and ->max_delta_ticks unicore32/time: Set ->min_delta_ticks and ->max_delta_ticks um/time: Set ->min_delta_ticks and ->max_delta_ticks tile/time: Set ->min_delta_ticks and ->max_delta_ticks score/time: Set ->min_delta_ticks and ->max_delta_ticks ...
This commit is contained in:
@@ -108,8 +108,8 @@ COMPAT_SYSCALL_DEFINE2(gettimeofday, struct compat_timeval __user *, tv,
|
||||
COMPAT_SYSCALL_DEFINE2(settimeofday, struct compat_timeval __user *, tv,
|
||||
struct timezone __user *, tz)
|
||||
{
|
||||
struct timespec64 new_ts;
|
||||
struct timeval user_tv;
|
||||
struct timespec new_ts;
|
||||
struct timezone new_tz;
|
||||
|
||||
if (tv) {
|
||||
@@ -123,7 +123,7 @@ COMPAT_SYSCALL_DEFINE2(settimeofday, struct compat_timeval __user *, tv,
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
return do_sys_settimeofday(tv ? &new_ts : NULL, tz ? &new_tz : NULL);
|
||||
return do_sys_settimeofday64(tv ? &new_ts : NULL, tz ? &new_tz : NULL);
|
||||
}
|
||||
|
||||
static int __compat_get_timeval(struct timeval *tv, const struct compat_timeval __user *ctv)
|
||||
@@ -240,18 +240,20 @@ COMPAT_SYSCALL_DEFINE2(nanosleep, struct compat_timespec __user *, rqtp,
|
||||
struct compat_timespec __user *, rmtp)
|
||||
{
|
||||
struct timespec tu, rmt;
|
||||
struct timespec64 tu64;
|
||||
mm_segment_t oldfs;
|
||||
long ret;
|
||||
|
||||
if (compat_get_timespec(&tu, rqtp))
|
||||
return -EFAULT;
|
||||
|
||||
if (!timespec_valid(&tu))
|
||||
tu64 = timespec_to_timespec64(tu);
|
||||
if (!timespec64_valid(&tu64))
|
||||
return -EINVAL;
|
||||
|
||||
oldfs = get_fs();
|
||||
set_fs(KERNEL_DS);
|
||||
ret = hrtimer_nanosleep(&tu,
|
||||
ret = hrtimer_nanosleep(&tu64,
|
||||
rmtp ? (struct timespec __user *)&rmt : NULL,
|
||||
HRTIMER_MODE_REL, CLOCK_MONOTONIC);
|
||||
set_fs(oldfs);
|
||||
|
@@ -1176,6 +1176,8 @@ static struct ctl_table kern_table[] = {
|
||||
.maxlen = sizeof(unsigned int),
|
||||
.mode = 0644,
|
||||
.proc_handler = timer_migration_handler,
|
||||
.extra1 = &zero,
|
||||
.extra2 = &one,
|
||||
},
|
||||
#endif
|
||||
#ifdef CONFIG_BPF_SYSCALL
|
||||
|
@@ -541,7 +541,7 @@ static enum alarmtimer_restart alarm_handle_timer(struct alarm *alarm,
|
||||
*
|
||||
* Returns the granularity of underlying alarm base clock
|
||||
*/
|
||||
static int alarm_clock_getres(const clockid_t which_clock, struct timespec *tp)
|
||||
static int alarm_clock_getres(const clockid_t which_clock, struct timespec64 *tp)
|
||||
{
|
||||
if (!alarmtimer_get_rtcdev())
|
||||
return -EINVAL;
|
||||
@@ -558,14 +558,14 @@ static int alarm_clock_getres(const clockid_t which_clock, struct timespec *tp)
|
||||
*
|
||||
* Provides the underlying alarm base time.
|
||||
*/
|
||||
static int alarm_clock_get(clockid_t which_clock, struct timespec *tp)
|
||||
static int alarm_clock_get(clockid_t which_clock, struct timespec64 *tp)
|
||||
{
|
||||
struct alarm_base *base = &alarm_bases[clock2alarm(which_clock)];
|
||||
|
||||
if (!alarmtimer_get_rtcdev())
|
||||
return -EINVAL;
|
||||
|
||||
*tp = ktime_to_timespec(base->gettime());
|
||||
*tp = ktime_to_timespec64(base->gettime());
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -598,19 +598,19 @@ static int alarm_timer_create(struct k_itimer *new_timer)
|
||||
* Copies out the current itimerspec data
|
||||
*/
|
||||
static void alarm_timer_get(struct k_itimer *timr,
|
||||
struct itimerspec *cur_setting)
|
||||
struct itimerspec64 *cur_setting)
|
||||
{
|
||||
ktime_t relative_expiry_time =
|
||||
alarm_expires_remaining(&(timr->it.alarm.alarmtimer));
|
||||
|
||||
if (ktime_to_ns(relative_expiry_time) > 0) {
|
||||
cur_setting->it_value = ktime_to_timespec(relative_expiry_time);
|
||||
cur_setting->it_value = ktime_to_timespec64(relative_expiry_time);
|
||||
} else {
|
||||
cur_setting->it_value.tv_sec = 0;
|
||||
cur_setting->it_value.tv_nsec = 0;
|
||||
}
|
||||
|
||||
cur_setting->it_interval = ktime_to_timespec(timr->it.alarm.interval);
|
||||
cur_setting->it_interval = ktime_to_timespec64(timr->it.alarm.interval);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -640,8 +640,8 @@ static int alarm_timer_del(struct k_itimer *timr)
|
||||
* Sets the timer to new_setting, and starts the timer.
|
||||
*/
|
||||
static int alarm_timer_set(struct k_itimer *timr, int flags,
|
||||
struct itimerspec *new_setting,
|
||||
struct itimerspec *old_setting)
|
||||
struct itimerspec64 *new_setting,
|
||||
struct itimerspec64 *old_setting)
|
||||
{
|
||||
ktime_t exp;
|
||||
|
||||
@@ -659,8 +659,8 @@ static int alarm_timer_set(struct k_itimer *timr, int flags,
|
||||
return TIMER_RETRY;
|
||||
|
||||
/* start the timer */
|
||||
timr->it.alarm.interval = timespec_to_ktime(new_setting->it_interval);
|
||||
exp = timespec_to_ktime(new_setting->it_value);
|
||||
timr->it.alarm.interval = timespec64_to_ktime(new_setting->it_interval);
|
||||
exp = timespec64_to_ktime(new_setting->it_value);
|
||||
/* Convert (if necessary) to absolute time */
|
||||
if (flags != TIMER_ABSTIME) {
|
||||
ktime_t now;
|
||||
@@ -790,13 +790,14 @@ out:
|
||||
* Handles clock_nanosleep calls against _ALARM clockids
|
||||
*/
|
||||
static int alarm_timer_nsleep(const clockid_t which_clock, int flags,
|
||||
struct timespec *tsreq, struct timespec __user *rmtp)
|
||||
struct timespec64 *tsreq,
|
||||
struct timespec __user *rmtp)
|
||||
{
|
||||
enum alarmtimer_type type = clock2alarm(which_clock);
|
||||
struct restart_block *restart;
|
||||
struct alarm alarm;
|
||||
ktime_t exp;
|
||||
int ret = 0;
|
||||
struct restart_block *restart;
|
||||
|
||||
if (!alarmtimer_get_rtcdev())
|
||||
return -ENOTSUPP;
|
||||
@@ -809,7 +810,7 @@ static int alarm_timer_nsleep(const clockid_t which_clock, int flags,
|
||||
|
||||
alarm_init(&alarm, type, alarmtimer_nsleep_wakeup);
|
||||
|
||||
exp = timespec_to_ktime(*tsreq);
|
||||
exp = timespec64_to_ktime(*tsreq);
|
||||
/* Convert (if necessary) to absolute time */
|
||||
if (flags != TIMER_ABSTIME) {
|
||||
ktime_t now = alarm_bases[type].gettime();
|
||||
|
@@ -468,7 +468,7 @@ void clockevents_register_device(struct clock_event_device *dev)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(clockevents_register_device);
|
||||
|
||||
void clockevents_config(struct clock_event_device *dev, u32 freq)
|
||||
static void clockevents_config(struct clock_event_device *dev, u32 freq)
|
||||
{
|
||||
u64 sec;
|
||||
|
||||
|
@@ -1368,10 +1368,7 @@ retry:
|
||||
ktime_to_ns(delta));
|
||||
}
|
||||
|
||||
/*
|
||||
* local version of hrtimer_peek_ahead_timers() called with interrupts
|
||||
* disabled.
|
||||
*/
|
||||
/* called with interrupts disabled */
|
||||
static inline void __hrtimer_peek_ahead_timers(void)
|
||||
{
|
||||
struct tick_device *td;
|
||||
@@ -1506,7 +1503,7 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
long hrtimer_nanosleep(struct timespec *rqtp, struct timespec __user *rmtp,
|
||||
long hrtimer_nanosleep(struct timespec64 *rqtp, struct timespec __user *rmtp,
|
||||
const enum hrtimer_mode mode, const clockid_t clockid)
|
||||
{
|
||||
struct restart_block *restart;
|
||||
@@ -1519,7 +1516,7 @@ long hrtimer_nanosleep(struct timespec *rqtp, struct timespec __user *rmtp,
|
||||
slack = 0;
|
||||
|
||||
hrtimer_init_on_stack(&t.timer, clockid, mode);
|
||||
hrtimer_set_expires_range_ns(&t.timer, timespec_to_ktime(*rqtp), slack);
|
||||
hrtimer_set_expires_range_ns(&t.timer, timespec64_to_ktime(*rqtp), slack);
|
||||
if (do_nanosleep(&t, mode))
|
||||
goto out;
|
||||
|
||||
@@ -1550,15 +1547,17 @@ out:
|
||||
SYSCALL_DEFINE2(nanosleep, struct timespec __user *, rqtp,
|
||||
struct timespec __user *, rmtp)
|
||||
{
|
||||
struct timespec64 tu64;
|
||||
struct timespec tu;
|
||||
|
||||
if (copy_from_user(&tu, rqtp, sizeof(tu)))
|
||||
return -EFAULT;
|
||||
|
||||
if (!timespec_valid(&tu))
|
||||
tu64 = timespec_to_timespec64(tu);
|
||||
if (!timespec64_valid(&tu64))
|
||||
return -EINVAL;
|
||||
|
||||
return hrtimer_nanosleep(&tu, rmtp, HRTIMER_MODE_REL, CLOCK_MONOTONIC);
|
||||
return hrtimer_nanosleep(&tu64, rmtp, HRTIMER_MODE_REL, CLOCK_MONOTONIC);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@@ -297,7 +297,7 @@ out:
|
||||
return err;
|
||||
}
|
||||
|
||||
static int pc_clock_gettime(clockid_t id, struct timespec *ts)
|
||||
static int pc_clock_gettime(clockid_t id, struct timespec64 *ts)
|
||||
{
|
||||
struct posix_clock_desc cd;
|
||||
int err;
|
||||
@@ -316,7 +316,7 @@ static int pc_clock_gettime(clockid_t id, struct timespec *ts)
|
||||
return err;
|
||||
}
|
||||
|
||||
static int pc_clock_getres(clockid_t id, struct timespec *ts)
|
||||
static int pc_clock_getres(clockid_t id, struct timespec64 *ts)
|
||||
{
|
||||
struct posix_clock_desc cd;
|
||||
int err;
|
||||
@@ -335,7 +335,7 @@ static int pc_clock_getres(clockid_t id, struct timespec *ts)
|
||||
return err;
|
||||
}
|
||||
|
||||
static int pc_clock_settime(clockid_t id, const struct timespec *ts)
|
||||
static int pc_clock_settime(clockid_t id, const struct timespec64 *ts)
|
||||
{
|
||||
struct posix_clock_desc cd;
|
||||
int err;
|
||||
@@ -399,7 +399,7 @@ static int pc_timer_delete(struct k_itimer *kit)
|
||||
return err;
|
||||
}
|
||||
|
||||
static void pc_timer_gettime(struct k_itimer *kit, struct itimerspec *ts)
|
||||
static void pc_timer_gettime(struct k_itimer *kit, struct itimerspec64 *ts)
|
||||
{
|
||||
clockid_t id = kit->it_clock;
|
||||
struct posix_clock_desc cd;
|
||||
@@ -414,7 +414,7 @@ static void pc_timer_gettime(struct k_itimer *kit, struct itimerspec *ts)
|
||||
}
|
||||
|
||||
static int pc_timer_settime(struct k_itimer *kit, int flags,
|
||||
struct itimerspec *ts, struct itimerspec *old)
|
||||
struct itimerspec64 *ts, struct itimerspec64 *old)
|
||||
{
|
||||
clockid_t id = kit->it_clock;
|
||||
struct posix_clock_desc cd;
|
||||
|
@@ -116,7 +116,7 @@ static inline u64 virt_ticks(struct task_struct *p)
|
||||
}
|
||||
|
||||
static int
|
||||
posix_cpu_clock_getres(const clockid_t which_clock, struct timespec *tp)
|
||||
posix_cpu_clock_getres(const clockid_t which_clock, struct timespec64 *tp)
|
||||
{
|
||||
int error = check_clock(which_clock);
|
||||
if (!error) {
|
||||
@@ -135,7 +135,7 @@ posix_cpu_clock_getres(const clockid_t which_clock, struct timespec *tp)
|
||||
}
|
||||
|
||||
static int
|
||||
posix_cpu_clock_set(const clockid_t which_clock, const struct timespec *tp)
|
||||
posix_cpu_clock_set(const clockid_t which_clock, const struct timespec64 *tp)
|
||||
{
|
||||
/*
|
||||
* You can never reset a CPU clock, but we check for other errors
|
||||
@@ -261,7 +261,7 @@ static int cpu_clock_sample_group(const clockid_t which_clock,
|
||||
|
||||
static int posix_cpu_clock_get_task(struct task_struct *tsk,
|
||||
const clockid_t which_clock,
|
||||
struct timespec *tp)
|
||||
struct timespec64 *tp)
|
||||
{
|
||||
int err = -EINVAL;
|
||||
u64 rtn;
|
||||
@@ -275,13 +275,13 @@ static int posix_cpu_clock_get_task(struct task_struct *tsk,
|
||||
}
|
||||
|
||||
if (!err)
|
||||
*tp = ns_to_timespec(rtn);
|
||||
*tp = ns_to_timespec64(rtn);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
static int posix_cpu_clock_get(const clockid_t which_clock, struct timespec *tp)
|
||||
static int posix_cpu_clock_get(const clockid_t which_clock, struct timespec64 *tp)
|
||||
{
|
||||
const pid_t pid = CPUCLOCK_PID(which_clock);
|
||||
int err = -EINVAL;
|
||||
@@ -562,7 +562,7 @@ static int cpu_timer_sample_group(const clockid_t which_clock,
|
||||
* and try again. (This happens when the timer is in the middle of firing.)
|
||||
*/
|
||||
static int posix_cpu_timer_set(struct k_itimer *timer, int timer_flags,
|
||||
struct itimerspec *new, struct itimerspec *old)
|
||||
struct itimerspec64 *new, struct itimerspec64 *old)
|
||||
{
|
||||
unsigned long flags;
|
||||
struct sighand_struct *sighand;
|
||||
@@ -572,7 +572,7 @@ static int posix_cpu_timer_set(struct k_itimer *timer, int timer_flags,
|
||||
|
||||
WARN_ON_ONCE(p == NULL);
|
||||
|
||||
new_expires = timespec_to_ns(&new->it_value);
|
||||
new_expires = timespec64_to_ns(&new->it_value);
|
||||
|
||||
/*
|
||||
* Protect against sighand release/switch in exit/exec and p->cpu_timers
|
||||
@@ -633,7 +633,7 @@ static int posix_cpu_timer_set(struct k_itimer *timer, int timer_flags,
|
||||
bump_cpu_timer(timer, val);
|
||||
if (val < timer->it.cpu.expires) {
|
||||
old_expires = timer->it.cpu.expires - val;
|
||||
old->it_value = ns_to_timespec(old_expires);
|
||||
old->it_value = ns_to_timespec64(old_expires);
|
||||
} else {
|
||||
old->it_value.tv_nsec = 1;
|
||||
old->it_value.tv_sec = 0;
|
||||
@@ -671,7 +671,7 @@ static int posix_cpu_timer_set(struct k_itimer *timer, int timer_flags,
|
||||
* Install the new reload setting, and
|
||||
* set up the signal and overrun bookkeeping.
|
||||
*/
|
||||
timer->it.cpu.incr = timespec_to_ns(&new->it_interval);
|
||||
timer->it.cpu.incr = timespec64_to_ns(&new->it_interval);
|
||||
|
||||
/*
|
||||
* This acts as a modification timestamp for the timer,
|
||||
@@ -695,12 +695,12 @@ static int posix_cpu_timer_set(struct k_itimer *timer, int timer_flags,
|
||||
ret = 0;
|
||||
out:
|
||||
if (old)
|
||||
old->it_interval = ns_to_timespec(old_incr);
|
||||
old->it_interval = ns_to_timespec64(old_incr);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void posix_cpu_timer_get(struct k_itimer *timer, struct itimerspec *itp)
|
||||
static void posix_cpu_timer_get(struct k_itimer *timer, struct itimerspec64 *itp)
|
||||
{
|
||||
u64 now;
|
||||
struct task_struct *p = timer->it.cpu.task;
|
||||
@@ -710,7 +710,7 @@ static void posix_cpu_timer_get(struct k_itimer *timer, struct itimerspec *itp)
|
||||
/*
|
||||
* Easy part: convert the reload time.
|
||||
*/
|
||||
itp->it_interval = ns_to_timespec(timer->it.cpu.incr);
|
||||
itp->it_interval = ns_to_timespec64(timer->it.cpu.incr);
|
||||
|
||||
if (timer->it.cpu.expires == 0) { /* Timer not armed at all. */
|
||||
itp->it_value.tv_sec = itp->it_value.tv_nsec = 0;
|
||||
@@ -739,7 +739,7 @@ static void posix_cpu_timer_get(struct k_itimer *timer, struct itimerspec *itp)
|
||||
* Call the timer disarmed, nothing else to do.
|
||||
*/
|
||||
timer->it.cpu.expires = 0;
|
||||
itp->it_value = ns_to_timespec(timer->it.cpu.expires);
|
||||
itp->it_value = ns_to_timespec64(timer->it.cpu.expires);
|
||||
return;
|
||||
} else {
|
||||
cpu_timer_sample_group(timer->it_clock, p, &now);
|
||||
@@ -748,7 +748,7 @@ static void posix_cpu_timer_get(struct k_itimer *timer, struct itimerspec *itp)
|
||||
}
|
||||
|
||||
if (now < timer->it.cpu.expires) {
|
||||
itp->it_value = ns_to_timespec(timer->it.cpu.expires - now);
|
||||
itp->it_value = ns_to_timespec64(timer->it.cpu.expires - now);
|
||||
} else {
|
||||
/*
|
||||
* The timer should have expired already, but the firing
|
||||
@@ -825,6 +825,8 @@ static void check_thread_timers(struct task_struct *tsk,
|
||||
* At the hard limit, we just die.
|
||||
* No need to calculate anything else now.
|
||||
*/
|
||||
pr_info("CPU Watchdog Timeout (hard): %s[%d]\n",
|
||||
tsk->comm, task_pid_nr(tsk));
|
||||
__group_send_sig_info(SIGKILL, SEND_SIG_PRIV, tsk);
|
||||
return;
|
||||
}
|
||||
@@ -836,8 +838,7 @@ static void check_thread_timers(struct task_struct *tsk,
|
||||
soft += USEC_PER_SEC;
|
||||
sig->rlim[RLIMIT_RTTIME].rlim_cur = soft;
|
||||
}
|
||||
printk(KERN_INFO
|
||||
"RT Watchdog Timeout: %s[%d]\n",
|
||||
pr_info("RT Watchdog Timeout (soft): %s[%d]\n",
|
||||
tsk->comm, task_pid_nr(tsk));
|
||||
__group_send_sig_info(SIGXCPU, SEND_SIG_PRIV, tsk);
|
||||
}
|
||||
@@ -935,6 +936,8 @@ static void check_process_timers(struct task_struct *tsk,
|
||||
* At the hard limit, we just die.
|
||||
* No need to calculate anything else now.
|
||||
*/
|
||||
pr_info("RT Watchdog Timeout (hard): %s[%d]\n",
|
||||
tsk->comm, task_pid_nr(tsk));
|
||||
__group_send_sig_info(SIGKILL, SEND_SIG_PRIV, tsk);
|
||||
return;
|
||||
}
|
||||
@@ -942,6 +945,8 @@ static void check_process_timers(struct task_struct *tsk,
|
||||
/*
|
||||
* At the soft limit, send a SIGXCPU every second.
|
||||
*/
|
||||
pr_info("CPU Watchdog Timeout (soft): %s[%d]\n",
|
||||
tsk->comm, task_pid_nr(tsk));
|
||||
__group_send_sig_info(SIGXCPU, SEND_SIG_PRIV, tsk);
|
||||
if (soft < hard) {
|
||||
soft++;
|
||||
@@ -1214,7 +1219,7 @@ void set_process_cpu_timer(struct task_struct *tsk, unsigned int clock_idx,
|
||||
}
|
||||
|
||||
static int do_cpu_nanosleep(const clockid_t which_clock, int flags,
|
||||
struct timespec *rqtp, struct itimerspec *it)
|
||||
struct timespec64 *rqtp, struct itimerspec64 *it)
|
||||
{
|
||||
struct k_itimer timer;
|
||||
int error;
|
||||
@@ -1229,7 +1234,7 @@ static int do_cpu_nanosleep(const clockid_t which_clock, int flags,
|
||||
error = posix_cpu_timer_create(&timer);
|
||||
timer.it_process = current;
|
||||
if (!error) {
|
||||
static struct itimerspec zero_it;
|
||||
static struct itimerspec64 zero_it;
|
||||
|
||||
memset(it, 0, sizeof *it);
|
||||
it->it_value = *rqtp;
|
||||
@@ -1264,7 +1269,7 @@ static int do_cpu_nanosleep(const clockid_t which_clock, int flags,
|
||||
/*
|
||||
* We were interrupted by a signal.
|
||||
*/
|
||||
*rqtp = ns_to_timespec(timer.it.cpu.expires);
|
||||
*rqtp = ns_to_timespec64(timer.it.cpu.expires);
|
||||
error = posix_cpu_timer_set(&timer, 0, &zero_it, it);
|
||||
if (!error) {
|
||||
/*
|
||||
@@ -1301,10 +1306,11 @@ static int do_cpu_nanosleep(const clockid_t which_clock, int flags,
|
||||
static long posix_cpu_nsleep_restart(struct restart_block *restart_block);
|
||||
|
||||
static int posix_cpu_nsleep(const clockid_t which_clock, int flags,
|
||||
struct timespec *rqtp, struct timespec __user *rmtp)
|
||||
struct timespec64 *rqtp, struct timespec __user *rmtp)
|
||||
{
|
||||
struct restart_block *restart_block = ¤t->restart_block;
|
||||
struct itimerspec it;
|
||||
struct itimerspec64 it;
|
||||
struct timespec ts;
|
||||
int error;
|
||||
|
||||
/*
|
||||
@@ -1324,13 +1330,14 @@ static int posix_cpu_nsleep(const clockid_t which_clock, int flags,
|
||||
/*
|
||||
* Report back to the user the time still remaining.
|
||||
*/
|
||||
if (rmtp && copy_to_user(rmtp, &it.it_value, sizeof *rmtp))
|
||||
ts = timespec64_to_timespec(it.it_value);
|
||||
if (rmtp && copy_to_user(rmtp, &ts, sizeof(*rmtp)))
|
||||
return -EFAULT;
|
||||
|
||||
restart_block->fn = posix_cpu_nsleep_restart;
|
||||
restart_block->nanosleep.clockid = which_clock;
|
||||
restart_block->nanosleep.rmtp = rmtp;
|
||||
restart_block->nanosleep.expires = timespec_to_ns(rqtp);
|
||||
restart_block->nanosleep.expires = timespec64_to_ns(rqtp);
|
||||
}
|
||||
return error;
|
||||
}
|
||||
@@ -1338,11 +1345,12 @@ static int posix_cpu_nsleep(const clockid_t which_clock, int flags,
|
||||
static long posix_cpu_nsleep_restart(struct restart_block *restart_block)
|
||||
{
|
||||
clockid_t which_clock = restart_block->nanosleep.clockid;
|
||||
struct timespec t;
|
||||
struct itimerspec it;
|
||||
struct itimerspec64 it;
|
||||
struct timespec64 t;
|
||||
struct timespec tmp;
|
||||
int error;
|
||||
|
||||
t = ns_to_timespec(restart_block->nanosleep.expires);
|
||||
t = ns_to_timespec64(restart_block->nanosleep.expires);
|
||||
|
||||
error = do_cpu_nanosleep(which_clock, TIMER_ABSTIME, &t, &it);
|
||||
|
||||
@@ -1351,10 +1359,11 @@ static long posix_cpu_nsleep_restart(struct restart_block *restart_block)
|
||||
/*
|
||||
* Report back to the user the time still remaining.
|
||||
*/
|
||||
if (rmtp && copy_to_user(rmtp, &it.it_value, sizeof *rmtp))
|
||||
tmp = timespec64_to_timespec(it.it_value);
|
||||
if (rmtp && copy_to_user(rmtp, &tmp, sizeof(*rmtp)))
|
||||
return -EFAULT;
|
||||
|
||||
restart_block->nanosleep.expires = timespec_to_ns(&t);
|
||||
restart_block->nanosleep.expires = timespec64_to_ns(&t);
|
||||
}
|
||||
return error;
|
||||
|
||||
@@ -1364,12 +1373,12 @@ static long posix_cpu_nsleep_restart(struct restart_block *restart_block)
|
||||
#define THREAD_CLOCK MAKE_THREAD_CPUCLOCK(0, CPUCLOCK_SCHED)
|
||||
|
||||
static int process_cpu_clock_getres(const clockid_t which_clock,
|
||||
struct timespec *tp)
|
||||
struct timespec64 *tp)
|
||||
{
|
||||
return posix_cpu_clock_getres(PROCESS_CLOCK, tp);
|
||||
}
|
||||
static int process_cpu_clock_get(const clockid_t which_clock,
|
||||
struct timespec *tp)
|
||||
struct timespec64 *tp)
|
||||
{
|
||||
return posix_cpu_clock_get(PROCESS_CLOCK, tp);
|
||||
}
|
||||
@@ -1379,7 +1388,7 @@ static int process_cpu_timer_create(struct k_itimer *timer)
|
||||
return posix_cpu_timer_create(timer);
|
||||
}
|
||||
static int process_cpu_nsleep(const clockid_t which_clock, int flags,
|
||||
struct timespec *rqtp,
|
||||
struct timespec64 *rqtp,
|
||||
struct timespec __user *rmtp)
|
||||
{
|
||||
return posix_cpu_nsleep(PROCESS_CLOCK, flags, rqtp, rmtp);
|
||||
@@ -1389,12 +1398,12 @@ static long process_cpu_nsleep_restart(struct restart_block *restart_block)
|
||||
return -EINVAL;
|
||||
}
|
||||
static int thread_cpu_clock_getres(const clockid_t which_clock,
|
||||
struct timespec *tp)
|
||||
struct timespec64 *tp)
|
||||
{
|
||||
return posix_cpu_clock_getres(THREAD_CLOCK, tp);
|
||||
}
|
||||
static int thread_cpu_clock_get(const clockid_t which_clock,
|
||||
struct timespec *tp)
|
||||
struct timespec64 *tp)
|
||||
{
|
||||
return posix_cpu_clock_get(THREAD_CLOCK, tp);
|
||||
}
|
||||
|
@@ -49,26 +49,32 @@ SYS_NI(alarm);
|
||||
SYSCALL_DEFINE2(clock_settime, const clockid_t, which_clock,
|
||||
const struct timespec __user *, tp)
|
||||
{
|
||||
struct timespec64 new_tp64;
|
||||
struct timespec new_tp;
|
||||
|
||||
if (which_clock != CLOCK_REALTIME)
|
||||
return -EINVAL;
|
||||
if (copy_from_user(&new_tp, tp, sizeof (*tp)))
|
||||
return -EFAULT;
|
||||
return do_sys_settimeofday(&new_tp, NULL);
|
||||
|
||||
new_tp64 = timespec_to_timespec64(new_tp);
|
||||
return do_sys_settimeofday64(&new_tp64, NULL);
|
||||
}
|
||||
|
||||
SYSCALL_DEFINE2(clock_gettime, const clockid_t, which_clock,
|
||||
struct timespec __user *,tp)
|
||||
{
|
||||
struct timespec64 kernel_tp64;
|
||||
struct timespec kernel_tp;
|
||||
|
||||
switch (which_clock) {
|
||||
case CLOCK_REALTIME: ktime_get_real_ts(&kernel_tp); break;
|
||||
case CLOCK_MONOTONIC: ktime_get_ts(&kernel_tp); break;
|
||||
case CLOCK_BOOTTIME: get_monotonic_boottime(&kernel_tp); break;
|
||||
case CLOCK_REALTIME: ktime_get_real_ts64(&kernel_tp64); break;
|
||||
case CLOCK_MONOTONIC: ktime_get_ts64(&kernel_tp64); break;
|
||||
case CLOCK_BOOTTIME: get_monotonic_boottime64(&kernel_tp64); break;
|
||||
default: return -EINVAL;
|
||||
}
|
||||
|
||||
kernel_tp = timespec64_to_timespec(kernel_tp64);
|
||||
if (copy_to_user(tp, &kernel_tp, sizeof (kernel_tp)))
|
||||
return -EFAULT;
|
||||
return 0;
|
||||
@@ -97,6 +103,7 @@ SYSCALL_DEFINE4(clock_nanosleep, const clockid_t, which_clock, int, flags,
|
||||
const struct timespec __user *, rqtp,
|
||||
struct timespec __user *, rmtp)
|
||||
{
|
||||
struct timespec64 t64;
|
||||
struct timespec t;
|
||||
|
||||
switch (which_clock) {
|
||||
@@ -105,9 +112,10 @@ SYSCALL_DEFINE4(clock_nanosleep, const clockid_t, which_clock, int, flags,
|
||||
case CLOCK_BOOTTIME:
|
||||
if (copy_from_user(&t, rqtp, sizeof (struct timespec)))
|
||||
return -EFAULT;
|
||||
if (!timespec_valid(&t))
|
||||
t64 = timespec_to_timespec64(t);
|
||||
if (!timespec64_valid(&t64))
|
||||
return -EINVAL;
|
||||
return hrtimer_nanosleep(&t, rmtp, flags & TIMER_ABSTIME ?
|
||||
return hrtimer_nanosleep(&t64, rmtp, flags & TIMER_ABSTIME ?
|
||||
HRTIMER_MODE_ABS : HRTIMER_MODE_REL,
|
||||
which_clock);
|
||||
default:
|
||||
|
@@ -130,12 +130,12 @@ static struct k_clock posix_clocks[MAX_CLOCKS];
|
||||
/*
|
||||
* These ones are defined below.
|
||||
*/
|
||||
static int common_nsleep(const clockid_t, int flags, struct timespec *t,
|
||||
static int common_nsleep(const clockid_t, int flags, struct timespec64 *t,
|
||||
struct timespec __user *rmtp);
|
||||
static int common_timer_create(struct k_itimer *new_timer);
|
||||
static void common_timer_get(struct k_itimer *, struct itimerspec *);
|
||||
static void common_timer_get(struct k_itimer *, struct itimerspec64 *);
|
||||
static int common_timer_set(struct k_itimer *, int,
|
||||
struct itimerspec *, struct itimerspec *);
|
||||
struct itimerspec64 *, struct itimerspec64 *);
|
||||
static int common_timer_del(struct k_itimer *timer);
|
||||
|
||||
static enum hrtimer_restart posix_timer_fn(struct hrtimer *data);
|
||||
@@ -204,17 +204,17 @@ static inline void unlock_timer(struct k_itimer *timr, unsigned long flags)
|
||||
}
|
||||
|
||||
/* Get clock_realtime */
|
||||
static int posix_clock_realtime_get(clockid_t which_clock, struct timespec *tp)
|
||||
static int posix_clock_realtime_get(clockid_t which_clock, struct timespec64 *tp)
|
||||
{
|
||||
ktime_get_real_ts(tp);
|
||||
ktime_get_real_ts64(tp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Set clock_realtime */
|
||||
static int posix_clock_realtime_set(const clockid_t which_clock,
|
||||
const struct timespec *tp)
|
||||
const struct timespec64 *tp)
|
||||
{
|
||||
return do_sys_settimeofday(tp, NULL);
|
||||
return do_sys_settimeofday64(tp, NULL);
|
||||
}
|
||||
|
||||
static int posix_clock_realtime_adj(const clockid_t which_clock,
|
||||
@@ -226,54 +226,54 @@ static int posix_clock_realtime_adj(const clockid_t which_clock,
|
||||
/*
|
||||
* Get monotonic time for posix timers
|
||||
*/
|
||||
static int posix_ktime_get_ts(clockid_t which_clock, struct timespec *tp)
|
||||
static int posix_ktime_get_ts(clockid_t which_clock, struct timespec64 *tp)
|
||||
{
|
||||
ktime_get_ts(tp);
|
||||
ktime_get_ts64(tp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Get monotonic-raw time for posix timers
|
||||
*/
|
||||
static int posix_get_monotonic_raw(clockid_t which_clock, struct timespec *tp)
|
||||
static int posix_get_monotonic_raw(clockid_t which_clock, struct timespec64 *tp)
|
||||
{
|
||||
getrawmonotonic(tp);
|
||||
getrawmonotonic64(tp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int posix_get_realtime_coarse(clockid_t which_clock, struct timespec *tp)
|
||||
static int posix_get_realtime_coarse(clockid_t which_clock, struct timespec64 *tp)
|
||||
{
|
||||
*tp = current_kernel_time();
|
||||
*tp = current_kernel_time64();
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int posix_get_monotonic_coarse(clockid_t which_clock,
|
||||
struct timespec *tp)
|
||||
struct timespec64 *tp)
|
||||
{
|
||||
*tp = get_monotonic_coarse();
|
||||
*tp = get_monotonic_coarse64();
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int posix_get_coarse_res(const clockid_t which_clock, struct timespec *tp)
|
||||
static int posix_get_coarse_res(const clockid_t which_clock, struct timespec64 *tp)
|
||||
{
|
||||
*tp = ktime_to_timespec(KTIME_LOW_RES);
|
||||
*tp = ktime_to_timespec64(KTIME_LOW_RES);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int posix_get_boottime(const clockid_t which_clock, struct timespec *tp)
|
||||
static int posix_get_boottime(const clockid_t which_clock, struct timespec64 *tp)
|
||||
{
|
||||
get_monotonic_boottime(tp);
|
||||
get_monotonic_boottime64(tp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int posix_get_tai(clockid_t which_clock, struct timespec *tp)
|
||||
static int posix_get_tai(clockid_t which_clock, struct timespec64 *tp)
|
||||
{
|
||||
timekeeping_clocktai(tp);
|
||||
timekeeping_clocktai64(tp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int posix_get_hrtimer_res(clockid_t which_clock, struct timespec *tp)
|
||||
static int posix_get_hrtimer_res(clockid_t which_clock, struct timespec64 *tp)
|
||||
{
|
||||
tp->tv_sec = 0;
|
||||
tp->tv_nsec = hrtimer_resolution;
|
||||
@@ -734,18 +734,18 @@ static struct k_itimer *__lock_timer(timer_t timer_id, unsigned long *flags)
|
||||
* report.
|
||||
*/
|
||||
static void
|
||||
common_timer_get(struct k_itimer *timr, struct itimerspec *cur_setting)
|
||||
common_timer_get(struct k_itimer *timr, struct itimerspec64 *cur_setting)
|
||||
{
|
||||
ktime_t now, remaining, iv;
|
||||
struct hrtimer *timer = &timr->it.real.timer;
|
||||
|
||||
memset(cur_setting, 0, sizeof(struct itimerspec));
|
||||
memset(cur_setting, 0, sizeof(*cur_setting));
|
||||
|
||||
iv = timr->it.real.interval;
|
||||
|
||||
/* interval timer ? */
|
||||
if (iv)
|
||||
cur_setting->it_interval = ktime_to_timespec(iv);
|
||||
cur_setting->it_interval = ktime_to_timespec64(iv);
|
||||
else if (!hrtimer_active(timer) &&
|
||||
(timr->it_sigev_notify & ~SIGEV_THREAD_ID) != SIGEV_NONE)
|
||||
return;
|
||||
@@ -771,13 +771,14 @@ common_timer_get(struct k_itimer *timr, struct itimerspec *cur_setting)
|
||||
if ((timr->it_sigev_notify & ~SIGEV_THREAD_ID) != SIGEV_NONE)
|
||||
cur_setting->it_value.tv_nsec = 1;
|
||||
} else
|
||||
cur_setting->it_value = ktime_to_timespec(remaining);
|
||||
cur_setting->it_value = ktime_to_timespec64(remaining);
|
||||
}
|
||||
|
||||
/* Get the time remaining on a POSIX.1b interval timer. */
|
||||
SYSCALL_DEFINE2(timer_gettime, timer_t, timer_id,
|
||||
struct itimerspec __user *, setting)
|
||||
{
|
||||
struct itimerspec64 cur_setting64;
|
||||
struct itimerspec cur_setting;
|
||||
struct k_itimer *timr;
|
||||
struct k_clock *kc;
|
||||
@@ -792,10 +793,11 @@ SYSCALL_DEFINE2(timer_gettime, timer_t, timer_id,
|
||||
if (WARN_ON_ONCE(!kc || !kc->timer_get))
|
||||
ret = -EINVAL;
|
||||
else
|
||||
kc->timer_get(timr, &cur_setting);
|
||||
kc->timer_get(timr, &cur_setting64);
|
||||
|
||||
unlock_timer(timr, flags);
|
||||
|
||||
cur_setting = itimerspec64_to_itimerspec(&cur_setting64);
|
||||
if (!ret && copy_to_user(setting, &cur_setting, sizeof (cur_setting)))
|
||||
return -EFAULT;
|
||||
|
||||
@@ -831,7 +833,7 @@ SYSCALL_DEFINE1(timer_getoverrun, timer_t, timer_id)
|
||||
/* timr->it_lock is taken. */
|
||||
static int
|
||||
common_timer_set(struct k_itimer *timr, int flags,
|
||||
struct itimerspec *new_setting, struct itimerspec *old_setting)
|
||||
struct itimerspec64 *new_setting, struct itimerspec64 *old_setting)
|
||||
{
|
||||
struct hrtimer *timer = &timr->it.real.timer;
|
||||
enum hrtimer_mode mode;
|
||||
@@ -860,10 +862,10 @@ common_timer_set(struct k_itimer *timr, int flags,
|
||||
hrtimer_init(&timr->it.real.timer, timr->it_clock, mode);
|
||||
timr->it.real.timer.function = posix_timer_fn;
|
||||
|
||||
hrtimer_set_expires(timer, timespec_to_ktime(new_setting->it_value));
|
||||
hrtimer_set_expires(timer, timespec64_to_ktime(new_setting->it_value));
|
||||
|
||||
/* Convert interval */
|
||||
timr->it.real.interval = timespec_to_ktime(new_setting->it_interval);
|
||||
timr->it.real.interval = timespec64_to_ktime(new_setting->it_interval);
|
||||
|
||||
/* SIGEV_NONE timers are not queued ! See common_timer_get */
|
||||
if (((timr->it_sigev_notify & ~SIGEV_THREAD_ID) == SIGEV_NONE)) {
|
||||
@@ -883,21 +885,23 @@ SYSCALL_DEFINE4(timer_settime, timer_t, timer_id, int, flags,
|
||||
const struct itimerspec __user *, new_setting,
|
||||
struct itimerspec __user *, old_setting)
|
||||
{
|
||||
struct k_itimer *timr;
|
||||
struct itimerspec64 new_spec64, old_spec64;
|
||||
struct itimerspec64 *rtn = old_setting ? &old_spec64 : NULL;
|
||||
struct itimerspec new_spec, old_spec;
|
||||
int error = 0;
|
||||
struct k_itimer *timr;
|
||||
unsigned long flag;
|
||||
struct itimerspec *rtn = old_setting ? &old_spec : NULL;
|
||||
struct k_clock *kc;
|
||||
int error = 0;
|
||||
|
||||
if (!new_setting)
|
||||
return -EINVAL;
|
||||
|
||||
if (copy_from_user(&new_spec, new_setting, sizeof (new_spec)))
|
||||
return -EFAULT;
|
||||
new_spec64 = itimerspec_to_itimerspec64(&new_spec);
|
||||
|
||||
if (!timespec_valid(&new_spec.it_interval) ||
|
||||
!timespec_valid(&new_spec.it_value))
|
||||
if (!timespec64_valid(&new_spec64.it_interval) ||
|
||||
!timespec64_valid(&new_spec64.it_value))
|
||||
return -EINVAL;
|
||||
retry:
|
||||
timr = lock_timer(timer_id, &flag);
|
||||
@@ -908,7 +912,7 @@ retry:
|
||||
if (WARN_ON_ONCE(!kc || !kc->timer_set))
|
||||
error = -EINVAL;
|
||||
else
|
||||
error = kc->timer_set(timr, flags, &new_spec, rtn);
|
||||
error = kc->timer_set(timr, flags, &new_spec64, rtn);
|
||||
|
||||
unlock_timer(timr, flag);
|
||||
if (error == TIMER_RETRY) {
|
||||
@@ -916,6 +920,7 @@ retry:
|
||||
goto retry;
|
||||
}
|
||||
|
||||
old_spec = itimerspec64_to_itimerspec(&old_spec64);
|
||||
if (old_setting && !error &&
|
||||
copy_to_user(old_setting, &old_spec, sizeof (old_spec)))
|
||||
error = -EFAULT;
|
||||
@@ -1014,6 +1019,7 @@ SYSCALL_DEFINE2(clock_settime, const clockid_t, which_clock,
|
||||
const struct timespec __user *, tp)
|
||||
{
|
||||
struct k_clock *kc = clockid_to_kclock(which_clock);
|
||||
struct timespec64 new_tp64;
|
||||
struct timespec new_tp;
|
||||
|
||||
if (!kc || !kc->clock_set)
|
||||
@@ -1021,21 +1027,24 @@ SYSCALL_DEFINE2(clock_settime, const clockid_t, which_clock,
|
||||
|
||||
if (copy_from_user(&new_tp, tp, sizeof (*tp)))
|
||||
return -EFAULT;
|
||||
new_tp64 = timespec_to_timespec64(new_tp);
|
||||
|
||||
return kc->clock_set(which_clock, &new_tp);
|
||||
return kc->clock_set(which_clock, &new_tp64);
|
||||
}
|
||||
|
||||
SYSCALL_DEFINE2(clock_gettime, const clockid_t, which_clock,
|
||||
struct timespec __user *,tp)
|
||||
{
|
||||
struct k_clock *kc = clockid_to_kclock(which_clock);
|
||||
struct timespec64 kernel_tp64;
|
||||
struct timespec kernel_tp;
|
||||
int error;
|
||||
|
||||
if (!kc)
|
||||
return -EINVAL;
|
||||
|
||||
error = kc->clock_get(which_clock, &kernel_tp);
|
||||
error = kc->clock_get(which_clock, &kernel_tp64);
|
||||
kernel_tp = timespec64_to_timespec(kernel_tp64);
|
||||
|
||||
if (!error && copy_to_user(tp, &kernel_tp, sizeof (kernel_tp)))
|
||||
error = -EFAULT;
|
||||
@@ -1070,13 +1079,15 @@ SYSCALL_DEFINE2(clock_getres, const clockid_t, which_clock,
|
||||
struct timespec __user *, tp)
|
||||
{
|
||||
struct k_clock *kc = clockid_to_kclock(which_clock);
|
||||
struct timespec64 rtn_tp64;
|
||||
struct timespec rtn_tp;
|
||||
int error;
|
||||
|
||||
if (!kc)
|
||||
return -EINVAL;
|
||||
|
||||
error = kc->clock_getres(which_clock, &rtn_tp);
|
||||
error = kc->clock_getres(which_clock, &rtn_tp64);
|
||||
rtn_tp = timespec64_to_timespec(rtn_tp64);
|
||||
|
||||
if (!error && tp && copy_to_user(tp, &rtn_tp, sizeof (rtn_tp)))
|
||||
error = -EFAULT;
|
||||
@@ -1088,7 +1099,7 @@ SYSCALL_DEFINE2(clock_getres, const clockid_t, which_clock,
|
||||
* nanosleep for monotonic and realtime clocks
|
||||
*/
|
||||
static int common_nsleep(const clockid_t which_clock, int flags,
|
||||
struct timespec *tsave, struct timespec __user *rmtp)
|
||||
struct timespec64 *tsave, struct timespec __user *rmtp)
|
||||
{
|
||||
return hrtimer_nanosleep(tsave, rmtp, flags & TIMER_ABSTIME ?
|
||||
HRTIMER_MODE_ABS : HRTIMER_MODE_REL,
|
||||
@@ -1100,6 +1111,7 @@ SYSCALL_DEFINE4(clock_nanosleep, const clockid_t, which_clock, int, flags,
|
||||
struct timespec __user *, rmtp)
|
||||
{
|
||||
struct k_clock *kc = clockid_to_kclock(which_clock);
|
||||
struct timespec64 t64;
|
||||
struct timespec t;
|
||||
|
||||
if (!kc)
|
||||
@@ -1110,10 +1122,11 @@ SYSCALL_DEFINE4(clock_nanosleep, const clockid_t, which_clock, int, flags,
|
||||
if (copy_from_user(&t, rqtp, sizeof (struct timespec)))
|
||||
return -EFAULT;
|
||||
|
||||
if (!timespec_valid(&t))
|
||||
t64 = timespec_to_timespec64(t);
|
||||
if (!timespec64_valid(&t64))
|
||||
return -EINVAL;
|
||||
|
||||
return kc->nsleep(which_clock, flags, &t, rmtp);
|
||||
return kc->nsleep(which_clock, flags, &t64, rmtp);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@@ -206,6 +206,11 @@ sched_clock_register(u64 (*read)(void), int bits, unsigned long rate)
|
||||
|
||||
update_clock_read_data(&rd);
|
||||
|
||||
if (sched_clock_timer.function != NULL) {
|
||||
/* update timeout for clock wrap */
|
||||
hrtimer_start(&sched_clock_timer, cd.wrap_kt, HRTIMER_MODE_REL);
|
||||
}
|
||||
|
||||
r = rate;
|
||||
if (r >= 4000000) {
|
||||
r /= 1000000;
|
||||
|
@@ -193,8 +193,8 @@ int do_sys_settimeofday64(const struct timespec64 *tv, const struct timezone *tz
|
||||
SYSCALL_DEFINE2(settimeofday, struct timeval __user *, tv,
|
||||
struct timezone __user *, tz)
|
||||
{
|
||||
struct timespec64 new_ts;
|
||||
struct timeval user_tv;
|
||||
struct timespec new_ts;
|
||||
struct timezone new_tz;
|
||||
|
||||
if (tv) {
|
||||
@@ -212,7 +212,7 @@ SYSCALL_DEFINE2(settimeofday, struct timeval __user *, tv,
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
return do_sys_settimeofday(tv ? &new_ts : NULL, tz ? &new_tz : NULL);
|
||||
return do_sys_settimeofday64(tv ? &new_ts : NULL, tz ? &new_tz : NULL);
|
||||
}
|
||||
|
||||
SYSCALL_DEFINE1(adjtimex, struct timex __user *, txc_p)
|
||||
|
@@ -996,8 +996,7 @@ static int adjust_historical_crosststamp(struct system_time_snapshot *history,
|
||||
return 0;
|
||||
|
||||
/* Interpolate shortest distance from beginning or end of history */
|
||||
interp_forward = partial_history_cycles > total_history_cycles/2 ?
|
||||
true : false;
|
||||
interp_forward = partial_history_cycles > total_history_cycles / 2;
|
||||
partial_history_cycles = interp_forward ?
|
||||
total_history_cycles - partial_history_cycles :
|
||||
partial_history_cycles;
|
||||
|
@@ -241,7 +241,7 @@ int timer_migration_handler(struct ctl_table *table, int write,
|
||||
int ret;
|
||||
|
||||
mutex_lock(&mutex);
|
||||
ret = proc_dointvec(table, write, buffer, lenp, ppos);
|
||||
ret = proc_dointvec_minmax(table, write, buffer, lenp, ppos);
|
||||
if (!ret && write)
|
||||
timers_update_migration(false);
|
||||
mutex_unlock(&mutex);
|
||||
|
@@ -16,6 +16,7 @@
|
||||
#include <linux/sched.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/kallsyms.h>
|
||||
#include <linux/nmi.h>
|
||||
|
||||
#include <linux/uaccess.h>
|
||||
|
||||
@@ -86,6 +87,9 @@ print_active_timers(struct seq_file *m, struct hrtimer_clock_base *base,
|
||||
|
||||
next_one:
|
||||
i = 0;
|
||||
|
||||
touch_nmi_watchdog();
|
||||
|
||||
raw_spin_lock_irqsave(&base->cpu_base->lock, flags);
|
||||
|
||||
curr = timerqueue_getnext(&base->active);
|
||||
@@ -197,6 +201,8 @@ print_tickdevice(struct seq_file *m, struct tick_device *td, int cpu)
|
||||
{
|
||||
struct clock_event_device *dev = td->evtdev;
|
||||
|
||||
touch_nmi_watchdog();
|
||||
|
||||
SEQ_printf(m, "Tick Device: mode: %d\n", td->mode);
|
||||
if (cpu < 0)
|
||||
SEQ_printf(m, "Broadcast device\n");
|
||||
|
Reference in New Issue
Block a user