diff options
author | Cyrill Gorcunov <gorcunov@openvz.org> | 2014-07-15 17:54:52 -0400 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2014-07-18 05:49:57 -0400 |
commit | af9c4957cf212ad9cf0bee34c95cb11de5426e85 (patch) | |
tree | 55d751b4a0889eff936b2c33ed0617690638e658 /fs/timerfd.c | |
parent | afdb094380889222583df9ef803587f6b8a82c8d (diff) |
timerfd: Implement show_fdinfo method
For checkpoint/restore of timerfd files we need to know how exactly
the timer were armed, to be able to recreate it on restore stage.
Thus implement show_fdinfo method which provides enough information
for that.
One of significant changes I think is the addition of @settime_flags
member. Currently there are two flags TFD_TIMER_ABSTIME and
TFD_TIMER_CANCEL_ON_SET, and the second can be found from
@might_cancel variable but in case if the flags will be extended
in future we most probably will have to somehow remember them
explicitly anyway so I guss doing that right now won't hurt.
To not bloat the timerfd_ctx structure I've converted @expired
to short integer and defined @settime_flags as short too.
v2 (by avagin@, vdavydov@ and tglx@):
- Add it_value/it_interval fields
- Save flags being used in timerfd_setup in context
v3 (by tglx@):
- don't forget to use CONFIG_PROC_FS
v4 (by akpm@):
-Use define timerfd_show NULL for non c/r config
Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Michael Kerrisk <mtk.manpages@gmail.com>
Cc: Andrey Vagin <avagin@openvz.org>
Cc: Pavel Emelyanov <xemul@parallels.com>
Cc: Vladimir Davydov <vdavydov@parallels.com>
Link: http://lkml.kernel.org/r/20140715215703.114365649@openvz.org
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
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) |