diff options
Diffstat (limited to 'fs/timerfd.c')
-rw-r--r-- | fs/timerfd.c | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/fs/timerfd.c b/fs/timerfd.c index 0013142c0475..77183f047f65 100644 --- a/fs/timerfd.c +++ b/fs/timerfd.c | |||
@@ -35,8 +35,9 @@ struct timerfd_ctx { | |||
35 | ktime_t moffs; | 35 | ktime_t moffs; |
36 | wait_queue_head_t wqh; | 36 | wait_queue_head_t wqh; |
37 | u64 ticks; | 37 | u64 ticks; |
38 | int expired; | ||
39 | int clockid; | 38 | int clockid; |
39 | short unsigned expired; | ||
40 | short unsigned settime_flags; /* to show in fdinfo */ | ||
40 | struct rcu_head rcu; | 41 | struct rcu_head rcu; |
41 | struct list_head clist; | 42 | struct list_head clist; |
42 | bool might_cancel; | 43 | bool might_cancel; |
@@ -196,6 +197,8 @@ static int timerfd_setup(struct timerfd_ctx *ctx, int flags, | |||
196 | if (timerfd_canceled(ctx)) | 197 | if (timerfd_canceled(ctx)) |
197 | return -ECANCELED; | 198 | return -ECANCELED; |
198 | } | 199 | } |
200 | |||
201 | ctx->settime_flags = flags & TFD_SETTIME_FLAGS; | ||
199 | return 0; | 202 | return 0; |
200 | } | 203 | } |
201 | 204 | ||
@@ -284,11 +287,40 @@ static ssize_t timerfd_read(struct file *file, char __user *buf, size_t count, | |||
284 | return res; | 287 | return res; |
285 | } | 288 | } |
286 | 289 | ||
290 | #ifdef CONFIG_PROC_FS | ||
291 | static int timerfd_show(struct seq_file *m, struct file *file) | ||
292 | { | ||
293 | struct timerfd_ctx *ctx = file->private_data; | ||
294 | struct itimerspec t; | ||
295 | |||
296 | spin_lock_irq(&ctx->wqh.lock); | ||
297 | t.it_value = ktime_to_timespec(timerfd_get_remaining(ctx)); | ||
298 | t.it_interval = ktime_to_timespec(ctx->tintv); | ||
299 | spin_unlock_irq(&ctx->wqh.lock); | ||
300 | |||
301 | return seq_printf(m, | ||
302 | "clockid: %d\n" | ||
303 | "ticks: %llu\n" | ||
304 | "settime flags: 0%o\n" | ||
305 | "it_value: (%llu, %llu)\n" | ||
306 | "it_interval: (%llu, %llu)\n", | ||
307 | ctx->clockid, (unsigned long long)ctx->ticks, | ||
308 | ctx->settime_flags, | ||
309 | (unsigned long long)t.it_value.tv_sec, | ||
310 | (unsigned long long)t.it_value.tv_nsec, | ||
311 | (unsigned long long)t.it_interval.tv_sec, | ||
312 | (unsigned long long)t.it_interval.tv_nsec); | ||
313 | } | ||
314 | #else | ||
315 | #define timerfd_show NULL | ||
316 | #endif | ||
317 | |||
287 | static const struct file_operations timerfd_fops = { | 318 | static const struct file_operations timerfd_fops = { |
288 | .release = timerfd_release, | 319 | .release = timerfd_release, |
289 | .poll = timerfd_poll, | 320 | .poll = timerfd_poll, |
290 | .read = timerfd_read, | 321 | .read = timerfd_read, |
291 | .llseek = noop_llseek, | 322 | .llseek = noop_llseek, |
323 | .show_fdinfo = timerfd_show, | ||
292 | }; | 324 | }; |
293 | 325 | ||
294 | static int timerfd_fget(int fd, struct fd *p) | 326 | static int timerfd_fget(int fd, struct fd *p) |