You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge branch 'timers-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull timer and time updates from Thomas Gleixner:
"A rather large update of timers, timekeeping & co
- Core timekeeping code is year-2038 safe now for 32bit machines.
Now we just need to fix all in kernel users and the gazillion of
user space interfaces which rely on timespec/timeval :)
- Better cache layout for the timekeeping internal data structures.
- Proper nanosecond based interfaces for in kernel users.
- Tree wide cleanup of code which wants nanoseconds but does hoops
and loops to convert back and forth from timespecs. Some of it
definitely belongs into the ugly code museum.
- Consolidation of the timekeeping interface zoo.
- A fast NMI safe accessor to clock monotonic for tracing. This is a
long standing request to support correlated user/kernel space
traces. With proper NTP frequency correction it's also suitable
for correlation of traces accross separate machines.
- Checkpoint/restart support for timerfd.
- A few NOHZ[_FULL] improvements in the [hr]timer code.
- Code move from kernel to kernel/time of all time* related code.
- New clocksource/event drivers from the ARM universe. I'm really
impressed that despite an architected timer in the newer chips SoC
manufacturers insist on inventing new and differently broken SoC
specific timers.
[ Ed. "Impressed"? I don't think that word means what you think it means ]
- Another round of code move from arch to drivers. Looks like most
of the legacy mess in ARM regarding timers is sorted out except for
a few obnoxious strongholds.
- The usual updates and fixlets all over the place"
* 'timers-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (114 commits)
timekeeping: Fixup typo in update_vsyscall_old definition
clocksource: document some basic timekeeping concepts
timekeeping: Use cached ntp_tick_length when accumulating error
timekeeping: Rework frequency adjustments to work better w/ nohz
timekeeping: Minor fixup for timespec64->timespec assignment
ftrace: Provide trace clocks monotonic
timekeeping: Provide fast and NMI safe access to CLOCK_MONOTONIC
seqcount: Add raw_write_seqcount_latch()
seqcount: Provide raw_read_seqcount()
timekeeping: Use tk_read_base as argument for timekeeping_get_ns()
timekeeping: Create struct tk_read_base and use it in struct timekeeper
timekeeping: Restructure the timekeeper some more
clocksource: Get rid of cycle_last
clocksource: Move cycle_last validation to core code
clocksource: Make delta calculation a function
wireless: ath9k: Get rid of timespec conversions
drm: vmwgfx: Use nsec based interfaces
drm: i915: Use nsec based interfaces
timekeeping: Provide ktime_get_raw()
hangcheck-timer: Use ktime_get_ns()
...
This commit is contained in:
+1
-3
@@ -306,11 +306,9 @@ static struct nsm_handle *nsm_lookup_priv(const struct nsm_private *priv)
|
||||
static void nsm_init_private(struct nsm_handle *nsm)
|
||||
{
|
||||
u64 *p = (u64 *)&nsm->sm_priv.data;
|
||||
struct timespec ts;
|
||||
s64 ns;
|
||||
|
||||
ktime_get_ts(&ts);
|
||||
ns = timespec_to_ns(&ts);
|
||||
ns = ktime_get_ns();
|
||||
put_unaligned(ns, p);
|
||||
put_unaligned((unsigned long)nsm, p + 1);
|
||||
}
|
||||
|
||||
+1
-6
@@ -473,13 +473,8 @@ static int do_task_stat(struct seq_file *m, struct pid_namespace *ns,
|
||||
priority = task_prio(task);
|
||||
nice = task_nice(task);
|
||||
|
||||
/* Temporary variable needed for gcc-2.96 */
|
||||
/* convert timespec -> nsec*/
|
||||
start_time =
|
||||
(unsigned long long)task->real_start_time.tv_sec * NSEC_PER_SEC
|
||||
+ task->real_start_time.tv_nsec;
|
||||
/* convert nsec -> ticks */
|
||||
start_time = nsec_to_clock_t(start_time);
|
||||
start_time = nsec_to_clock_t(task->real_start_time);
|
||||
|
||||
seq_printf(m, "%d (%s) %c", pid_nr_ns(pid, ns), tcomm, state);
|
||||
seq_put_decimal_ll(m, ' ', ppid);
|
||||
|
||||
+73
-4
@@ -35,8 +35,9 @@ struct timerfd_ctx {
|
||||
ktime_t moffs;
|
||||
wait_queue_head_t wqh;
|
||||
u64 ticks;
|
||||
int expired;
|
||||
int clockid;
|
||||
short unsigned expired;
|
||||
short unsigned settime_flags; /* to show in fdinfo */
|
||||
struct rcu_head rcu;
|
||||
struct list_head clist;
|
||||
bool might_cancel;
|
||||
@@ -92,7 +93,7 @@ static enum alarmtimer_restart timerfd_alarmproc(struct alarm *alarm,
|
||||
*/
|
||||
void timerfd_clock_was_set(void)
|
||||
{
|
||||
ktime_t moffs = ktime_get_monotonic_offset();
|
||||
ktime_t moffs = ktime_mono_to_real((ktime_t){ .tv64 = 0 });
|
||||
struct timerfd_ctx *ctx;
|
||||
unsigned long flags;
|
||||
|
||||
@@ -125,7 +126,7 @@ static bool timerfd_canceled(struct timerfd_ctx *ctx)
|
||||
{
|
||||
if (!ctx->might_cancel || ctx->moffs.tv64 != KTIME_MAX)
|
||||
return false;
|
||||
ctx->moffs = ktime_get_monotonic_offset();
|
||||
ctx->moffs = ktime_mono_to_real((ktime_t){ .tv64 = 0 });
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -196,6 +197,8 @@ static int timerfd_setup(struct timerfd_ctx *ctx, int flags,
|
||||
if (timerfd_canceled(ctx))
|
||||
return -ECANCELED;
|
||||
}
|
||||
|
||||
ctx->settime_flags = flags & TFD_SETTIME_FLAGS;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -284,11 +287,77 @@ static ssize_t timerfd_read(struct file *file, char __user *buf, size_t count,
|
||||
return res;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
static int timerfd_show(struct seq_file *m, struct file *file)
|
||||
{
|
||||
struct timerfd_ctx *ctx = file->private_data;
|
||||
struct itimerspec t;
|
||||
|
||||
spin_lock_irq(&ctx->wqh.lock);
|
||||
t.it_value = ktime_to_timespec(timerfd_get_remaining(ctx));
|
||||
t.it_interval = ktime_to_timespec(ctx->tintv);
|
||||
spin_unlock_irq(&ctx->wqh.lock);
|
||||
|
||||
return seq_printf(m,
|
||||
"clockid: %d\n"
|
||||
"ticks: %llu\n"
|
||||
"settime flags: 0%o\n"
|
||||
"it_value: (%llu, %llu)\n"
|
||||
"it_interval: (%llu, %llu)\n",
|
||||
ctx->clockid, (unsigned long long)ctx->ticks,
|
||||
ctx->settime_flags,
|
||||
(unsigned long long)t.it_value.tv_sec,
|
||||
(unsigned long long)t.it_value.tv_nsec,
|
||||
(unsigned long long)t.it_interval.tv_sec,
|
||||
(unsigned long long)t.it_interval.tv_nsec);
|
||||
}
|
||||
#else
|
||||
#define timerfd_show NULL
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_CHECKPOINT_RESTORE
|
||||
static long timerfd_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
struct timerfd_ctx *ctx = file->private_data;
|
||||
int ret = 0;
|
||||
|
||||
switch (cmd) {
|
||||
case TFD_IOC_SET_TICKS: {
|
||||
u64 ticks;
|
||||
|
||||
if (copy_from_user(&ticks, (u64 __user *)arg, sizeof(ticks)))
|
||||
return -EFAULT;
|
||||
if (!ticks)
|
||||
return -EINVAL;
|
||||
|
||||
spin_lock_irq(&ctx->wqh.lock);
|
||||
if (!timerfd_canceled(ctx)) {
|
||||
ctx->ticks = ticks;
|
||||
if (ticks)
|
||||
wake_up_locked(&ctx->wqh);
|
||||
} else
|
||||
ret = -ECANCELED;
|
||||
spin_unlock_irq(&ctx->wqh.lock);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
ret = -ENOTTY;
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
#else
|
||||
#define timerfd_ioctl NULL
|
||||
#endif
|
||||
|
||||
static const struct file_operations timerfd_fops = {
|
||||
.release = timerfd_release,
|
||||
.poll = timerfd_poll,
|
||||
.read = timerfd_read,
|
||||
.llseek = noop_llseek,
|
||||
.show_fdinfo = timerfd_show,
|
||||
.unlocked_ioctl = timerfd_ioctl,
|
||||
};
|
||||
|
||||
static int timerfd_fget(int fd, struct fd *p)
|
||||
@@ -336,7 +405,7 @@ SYSCALL_DEFINE2(timerfd_create, int, clockid, int, flags)
|
||||
else
|
||||
hrtimer_init(&ctx->t.tmr, clockid, HRTIMER_MODE_ABS);
|
||||
|
||||
ctx->moffs = ktime_get_monotonic_offset();
|
||||
ctx->moffs = ktime_mono_to_real((ktime_t){ .tv64 = 0 });
|
||||
|
||||
ufd = anon_inode_getfd("[timerfd]", &timerfd_fops, ctx,
|
||||
O_RDWR | (flags & TFD_SHARED_FCNTL_FLAGS));
|
||||
|
||||
Reference in New Issue
Block a user