* [patch 2.6.12] getmonotonictime system call and patch for evdev to use such time
@ 2005-06-19 10:30 Michal Maruška
2005-06-19 11:15 ` Thomas Gleixner
0 siblings, 1 reply; 2+ messages in thread
From: Michal Maruška @ 2005-06-19 10:30 UTC (permalink / raw)
To: linux-kernel
Events from the evdev device are timestamped with gettimeofday. If a userland
application wants to see a duration of a key press, all it can do is
look at the 2 timestamps.
If settimeofday is called in between, it will see a false duration, which is not
what it needs. So, for my needs I only want the monotonic (since boot) time. I
understand, that someone else might want to maintain compatibility, and have the
kind of time selectable (ioctl), but that's above my current kernel knowledge.
If no event arrives I would still like to measure the progressed duration, and thus get the
monotonic time, so a system call getmonotonictime is needed.
I found do_posix_clock_monotonic_gettime and made simple wrapper around it.
I do NOT claim i know how to add a new system call! And it's i386 only.
All i did is testing with simple:
struct timeval tp;
syscall(289, &tv);
Signed-off-by: Michal Maruska <mmc@maruska.dyndns.org>
--- linux-2.6.12/arch/i386/kernel/syscall_table.S 2005-06-19 11:58:35.000000000 +0200
+++ linux-2.6.12.mmc/arch/i386/kernel/syscall_table.S 2005-06-19 12:08:57.128194816 +0200
@@ -289,3 +289,4 @@
.long sys_add_key
.long sys_request_key
.long sys_keyctl
+ .long sys_getmonotonictime
--- linux-2.6.12/drivers/input/evdev.c 2005-06-19 11:58:35.000000000 +0200
+++ linux-2.6.12.mmc/drivers/input/evdev.c 2005-06-19 12:06:15.354519028 +0200
@@ -52,7 +52,7 @@
if (evdev->grab) {
list = evdev->grab;
- do_gettimeofday(&list->buffer[list->head].time);
+ do_getmonotonictime(&list->buffer[list->head].time);
list->buffer[list->head].type = type;
list->buffer[list->head].code = code;
list->buffer[list->head].value = value;
@@ -62,7 +62,7 @@
} else
list_for_each_entry(list, &evdev->list, node) {
- do_gettimeofday(&list->buffer[list->head].time);
+ do_getmonotonictime(&list->buffer[list->head].time);
list->buffer[list->head].type = type;
list->buffer[list->head].code = code;
list->buffer[list->head].value = value;
--- linux-2.6.12/include/linux/time.h 2005-06-19 11:58:35.000000000 +0200
+++ linux-2.6.12.mmc/include/linux/time.h 2005-06-19 12:05:01.816311807 +0200
@@ -92,6 +92,7 @@
#define CURRENT_TIME (current_kernel_time())
#define CURRENT_TIME_SEC ((struct timespec) { xtime.tv_sec, 0 })
+extern void do_getmonotonictime (struct timeval *tv);
extern void do_gettimeofday(struct timeval *tv);
extern int do_settimeofday(struct timespec *tv);
extern int do_sys_settimeofday(struct timespec *tv, struct timezone *tz);
--- linux-2.6.12/kernel/time.c 2005-06-19 11:58:35.000000000 +0200
+++ linux-2.6.12.mmc/kernel/time.c 2005-06-19 12:21:30.348997202 +0200
@@ -5,7 +5,7 @@
*
* This file contains the interface functions for the various
* time related system calls: time, stime, gettimeofday, settimeofday,
- * adjtime
+ * adjtime, getmonotonictime
*/
/*
* Modification history kernel/time.c
@@ -25,6 +25,9 @@
* 2004-07-14 Christoph Lameter
* Added getnstimeofday to allow the posix timer functions to return
* with nanosecond accuracy
+ * 2005-06-19 Michal Maruska
+ * Added getmonotonictime to provide time and (input event) timestamps
+ * independent of time changes (settimeofday)
*/
#include <linux/module.h>
@@ -112,6 +115,33 @@
return 0;
}
+asmlinkage long sys_getmonotonictime(struct timeval __user *tv)
+{
+ if (likely(tv != NULL)) {
+ struct timeval ktv;
+ do_getmonotonictime(&ktv);
+ /* indeed it works! */
+ /* printk("%s\n", __FUNCTION__); */
+ if (copy_to_user(tv, &ktv, sizeof(ktv)))
+ return -EFAULT;
+ }
+ return 0;
+}
+
+
+void do_getmonotonictime (struct timeval *tv)
+{
+ struct timespec kts;
+ if (unlikely(tv == NULL)) return; /* should not happen */
+
+ do_posix_clock_monotonic_gettime(&kts);
+ /* transform the "struct timespec" into "struct timeval" */
+ tv->tv_sec = kts.tv_sec;
+ tv->tv_usec = kts.tv_nsec / NSEC_PER_USEC;
+}
+
+EXPORT_SYMBOL(do_getmonotonictime);
+
/*
* Adjust the time obtained from the CMOS to be UTC time instead of
* local time.
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [patch 2.6.12] getmonotonictime system call and patch for evdev to use such time
2005-06-19 10:30 [patch 2.6.12] getmonotonictime system call and patch for evdev to use such time Michal Maruška
@ 2005-06-19 11:15 ` Thomas Gleixner
0 siblings, 0 replies; 2+ messages in thread
From: Thomas Gleixner @ 2005-06-19 11:15 UTC (permalink / raw)
To: Michal Maruška; +Cc: linux-kernel
On Sun, 2005-06-19 at 12:30 +0200, Michal Maruška wrote:
> I found do_posix_clock_monotonic_gettime and made simple wrapper around it.
> I do NOT claim i know how to add a new system call! And it's i386 only.
There is a system call already.
man clock_gettime
tglx
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2005-06-19 11:13 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2005-06-19 10:30 [patch 2.6.12] getmonotonictime system call and patch for evdev to use such time Michal Maruška
2005-06-19 11:15 ` Thomas Gleixner
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®