Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932984AbaD1Vdu (ORCPT ); Mon, 28 Apr 2014 17:33:50 -0400 Received: from mail-la0-f45.google.com ([209.85.215.45]:57733 "EHLO mail-la0-f45.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756504AbaD1VdF (ORCPT ); Mon, 28 Apr 2014 17:33:05 -0400 Message-Id: <20140428213301.304637183@openvz.org> User-Agent: quilt/0.60-1 Date: Tue, 29 Apr 2014 01:25:18 +0400 From: Cyrill Gorcunov To: linux-kernel@vger.kernel.org Cc: shawn@churchofgit.com, tglx@linutronix.de, akpm@linux-foundation.org, avagin@openvz.org, xemul@parallels.com, gorcunov@openvz.org, vdavydov@parallels.com Subject: [patch 1/3] timerfd: Implement show_fdinfo method References: <20140428212517.200264067@openvz.org> Content-Disposition: inline; filename=timerfd-show-fdinfo-3 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org For checkpoint/restore of timerfd files we need to know how exactly the timer were armed to be able to handle it. Thus implement show_fdinfo method which provides enough information for timer re-creation. One of significant changes I think is addition of timerfd_ctx::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 as well. v2 (by avagin@, vdavydov@ and tglx@): - Add it_value/it_interval fields - Save flags being used in timerfd_setup in context CC: Shawn Landden CC: Thomas Gleixner CC: Andrew Morton CC: Andrey Vagin CC: Pavel Emelyanov CC: Vladimir Davydov Signed-off-by: Cyrill Gorcunov --- fs/timerfd.c | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) Index: linux-2.6.git/fs/timerfd.c =================================================================== --- linux-2.6.git.orig/fs/timerfd.c +++ linux-2.6.git/fs/timerfd.c @@ -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; @@ -196,6 +197,8 @@ static int timerfd_setup(struct timerfd_ if (timerfd_canceled(ctx)) return -ECANCELED; } + + ctx->settime_flags = flags & TFD_SETTIME_FLAGS; return 0; } @@ -284,11 +287,36 @@ static ssize_t timerfd_read(struct file return res; } +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); +} + static const struct file_operations timerfd_fops = { .release = timerfd_release, .poll = timerfd_poll, .read = timerfd_read, .llseek = noop_llseek, + .show_fdinfo = timerfd_show, }; static int timerfd_fget(int fd, struct fd *p) -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/