From patchwork Thu Jan 5 23:01:05 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: John Stultz X-Patchwork-Id: 6074 Return-Path: X-Original-To: patchwork@peony.canonical.com Delivered-To: patchwork@peony.canonical.com Received: from fiordland.canonical.com (fiordland.canonical.com [91.189.94.145]) by peony.canonical.com (Postfix) with ESMTP id C352623F72 for ; Thu, 5 Jan 2012 23:02:25 +0000 (UTC) Received: from mail-ey0-f180.google.com (mail-ey0-f180.google.com [209.85.215.180]) by fiordland.canonical.com (Postfix) with ESMTP id B3097A183B3 for ; Thu, 5 Jan 2012 23:02:25 +0000 (UTC) Received: by eaac11 with SMTP id c11so967207eaa.11 for ; Thu, 05 Jan 2012 15:02:25 -0800 (PST) Received: by 10.205.120.14 with SMTP id fw14mr1678722bkc.53.1325804545437; Thu, 05 Jan 2012 15:02:25 -0800 (PST) X-Forwarded-To: linaro-patchwork@canonical.com X-Forwarded-For: patch@linaro.org linaro-patchwork@canonical.com Delivered-To: patches@linaro.org Received: by 10.205.82.144 with SMTP id ac16cs414067bkc; Thu, 5 Jan 2012 15:02:24 -0800 (PST) Received: by 10.68.196.169 with SMTP id in9mr9714859pbc.54.1325804541983; Thu, 05 Jan 2012 15:02:21 -0800 (PST) Received: from e2.ny.us.ibm.com (e2.ny.us.ibm.com. [32.97.182.142]) by mx.google.com with ESMTPS id g10si74602769pbe.89.2012.01.05.15.02.20 (version=TLSv1/SSLv3 cipher=OTHER); Thu, 05 Jan 2012 15:02:21 -0800 (PST) Received-SPF: pass (google.com: domain of jstultz@us.ibm.com designates 32.97.182.142 as permitted sender) client-ip=32.97.182.142; Authentication-Results: mx.google.com; spf=pass (google.com: domain of jstultz@us.ibm.com designates 32.97.182.142 as permitted sender) smtp.mail=jstultz@us.ibm.com Received: from /spool/local by e2.ny.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Thu, 5 Jan 2012 18:02:20 -0500 Received: from d01relay02.pok.ibm.com (9.56.227.234) by e2.ny.us.ibm.com (192.168.1.102) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Thu, 5 Jan 2012 18:02:14 -0500 Received: from d01av03.pok.ibm.com (d01av03.pok.ibm.com [9.56.224.217]) by d01relay02.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id q05N1Rnv389268; Thu, 5 Jan 2012 18:01:35 -0500 Received: from d01av03.pok.ibm.com (loopback [127.0.0.1]) by d01av03.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id q05N1PYF019818; Thu, 5 Jan 2012 21:01:27 -0200 Received: from kernel.beaverton.ibm.com (kernel.beaverton.ibm.com [9.47.67.96]) by d01av03.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id q05N1PDe019756; Thu, 5 Jan 2012 21:01:25 -0200 Received: by kernel.beaverton.ibm.com (Postfix, from userid 1056) id 5742B1E74FB; Thu, 5 Jan 2012 15:01:14 -0800 (PST) From: John Stultz To: linux-input@vger.kernel.org Cc: John Stultz , Dmitry Torokhov , Daniel Kurtz , =?UTF-8?q?Arve=20Hj=C3=B8nnev=C3=A5g?= Subject: [RFC][PATCH] Input: Add infrastrucutre for monotonic event time stamps. Date: Thu, 5 Jan 2012 15:01:05 -0800 Message-Id: <1325804465-20612-1-git-send-email-john.stultz@linaro.org> X-Mailer: git-send-email 1.7.3.2.146.gca209 MIME-Version: 1.0 x-cbid: 12010523-5112-0000-0000-000003C2812E Just wanted to send this out for some initial review and feedback. As noted by Arve and others, since wall time can jump backwards, it is difficult to use for input because one cannot determine if one event occured before another or for how long a key was pressed. However, the timestamp field is part of the kernel ABI, and cannot be changed without possibly breaking existing users. This patch adds a new IOCTL that sets a flag in the evdev_client struct that will switch the timestamps to CLOCK_MONOTONIC instead of CLOCK_REALTIME. This allows users of the evdev to specifiy which clock id they want the timestamps to use. The default remains CLOCK_REALTIME. CC: Dmitry Torokhov CC: Daniel Kurtz CC: linux-input@vger.kernel.org CC: Arve Hjønnevåg Signed-off-by: John Stultz --- drivers/input/evdev.c | 30 ++++++++++++++++++++++++++---- include/linux/input.h | 2 ++ 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c index 4cf2534..6d04403 100644 --- a/drivers/input/evdev.c +++ b/drivers/input/evdev.c @@ -46,6 +46,7 @@ struct evdev_client { struct fasync_struct *fasync; struct evdev *evdev; struct list_head node; + bool use_monotonic; unsigned int bufsize; struct input_event buffer[]; }; @@ -54,8 +55,19 @@ static struct evdev *evdev_table[EVDEV_MINORS]; static DEFINE_MUTEX(evdev_table_mutex); static void evdev_pass_event(struct evdev_client *client, - struct input_event *event) + struct input_event *event, + ktime_t mono, ktime_t real) { + struct timespec ts; + + if (client->use_monotonic) + ts = ktime_to_timespec(mono); + else + ts = ktime_to_timespec(real); + event->time.tv_sec = ts.tv_sec; + event->time.tv_usec = ts.tv_nsec / NSEC_PER_USEC; + + /* Interrupts are disabled, just acquire the lock. */ spin_lock(&client->buffer_lock); @@ -94,8 +106,11 @@ static void evdev_event(struct input_handle *handle, struct evdev *evdev = handle->private; struct evdev_client *client; struct input_event event; + ktime_t time_mono, time_real; + + time_mono = ktime_get(); + time_real = ktime_sub(time_mono, ktime_get_monotonic_offset()); - do_gettimeofday(&event.time); event.type = type; event.code = code; event.value = value; @@ -103,11 +118,12 @@ static void evdev_event(struct input_handle *handle, rcu_read_lock(); client = rcu_dereference(evdev->grab); + if (client) - evdev_pass_event(client, &event); + evdev_pass_event(client, &event, time_mono, time_real); else list_for_each_entry_rcu(client, &evdev->client_list, node) - evdev_pass_event(client, &event); + evdev_pass_event(client, &event, time_mono, time_real); rcu_read_unlock(); @@ -683,6 +699,12 @@ static long evdev_do_ioctl(struct file *file, unsigned int cmd, else return evdev_ungrab(evdev, client); + case EVIOCMONTIME: + if (copy_from_user(&i, p, sizeof(unsigned int))) + return -EFAULT; + client->use_monotonic = i; + return 0; + case EVIOCGKEYCODE: return evdev_handle_get_keycode(dev, p); diff --git a/include/linux/input.h b/include/linux/input.h index 3862e32..245bfcc 100644 --- a/include/linux/input.h +++ b/include/linux/input.h @@ -129,6 +129,8 @@ struct input_keymap_entry { #define EVIOCGRAB _IOW('E', 0x90, int) /* Grab/Release device */ +#define EVIOCMONTIME _IOW('E', 0xA0, int) /* Set CLOCK_MONOTONIC Timestamps */ + /* * Device properties and quirks */