Commit 096f6262 authored by Alison Schofield's avatar Alison Schofield Committed by David S. Miller

isdn: divamnt: use y2038-safe ktime_get_ts64() for trace data timestamps

divamnt stores a start_time at module init and uses it to calculate
elapsed time. The elapsed time, stored in secs and usecs, is part of
the trace data the driver maintains for the DIVA Server ISDN cards.
No change to the format of that time data is required.

To avoid overflow on 32-bit systems use ktime_get_ts64() to return
the elapsed monotonic time since system boot.

This is a change from real to monotonic time. Since the driver only
stores elapsed time, monotonic time is sufficient and more robust
against real time clock changes. These new monotonic values can be
more useful for debugging because they can be easily compared to
other monotonic timestamps.

Note elaspsed time values will now start at system boot time rather
than module load time, so they will differ slightly from previously
reported values.

Remove declaration and init of previously unused time constants:
start_sec, start_usec.
Signed-off-by: default avatarAlison Schofield <amsfield22@gmail.com>
Reviewed-by: default avatarArnd Bergmann <arnd@arndb.de>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent d56fddaa
...@@ -192,8 +192,6 @@ static diva_os_spin_lock_t dbg_q_lock; ...@@ -192,8 +192,6 @@ static diva_os_spin_lock_t dbg_q_lock;
static diva_os_spin_lock_t dbg_adapter_lock; static diva_os_spin_lock_t dbg_adapter_lock;
static int dbg_q_busy; static int dbg_q_busy;
static volatile dword dbg_sequence; static volatile dword dbg_sequence;
static dword start_sec;
static dword start_usec;
/* /*
INTERFACE: INTERFACE:
...@@ -215,8 +213,6 @@ int diva_maint_init(byte *base, unsigned long length, int do_init) { ...@@ -215,8 +213,6 @@ int diva_maint_init(byte *base, unsigned long length, int do_init) {
dbg_base = base; dbg_base = base;
diva_os_get_time(&start_sec, &start_usec);
*(dword *)base = (dword)DBG_MAGIC; /* Store Magic */ *(dword *)base = (dword)DBG_MAGIC; /* Store Magic */
base += sizeof(dword); base += sizeof(dword);
length -= sizeof(dword); length -= sizeof(dword);
......
...@@ -45,7 +45,6 @@ char *DRIVERRELEASE_MNT = "2.0"; ...@@ -45,7 +45,6 @@ char *DRIVERRELEASE_MNT = "2.0";
static wait_queue_head_t msgwaitq; static wait_queue_head_t msgwaitq;
static unsigned long opened; static unsigned long opened;
static struct timeval start_time;
extern int mntfunc_init(int *, void **, unsigned long); extern int mntfunc_init(int *, void **, unsigned long);
extern void mntfunc_finit(void); extern void mntfunc_finit(void);
...@@ -88,28 +87,12 @@ int diva_os_copy_from_user(void *os_handle, void *dst, const void __user *src, ...@@ -88,28 +87,12 @@ int diva_os_copy_from_user(void *os_handle, void *dst, const void __user *src,
*/ */
void diva_os_get_time(dword *sec, dword *usec) void diva_os_get_time(dword *sec, dword *usec)
{ {
struct timeval tv; struct timespec64 time;
do_gettimeofday(&tv); ktime_get_ts64(&time);
if (tv.tv_sec > start_time.tv_sec) { *sec = (dword) time.tv_sec;
if (start_time.tv_usec > tv.tv_usec) { *usec = (dword) (time.tv_nsec / NSEC_PER_USEC);
tv.tv_sec--;
tv.tv_usec += 1000000;
}
*sec = (dword) (tv.tv_sec - start_time.tv_sec);
*usec = (dword) (tv.tv_usec - start_time.tv_usec);
} else if (tv.tv_sec == start_time.tv_sec) {
*sec = 0;
if (start_time.tv_usec < tv.tv_usec) {
*usec = (dword) (tv.tv_usec - start_time.tv_usec);
} else {
*usec = 0;
}
} else {
*sec = (dword) tv.tv_sec;
*usec = (dword) tv.tv_usec;
}
} }
/* /*
...@@ -213,7 +196,6 @@ static int __init maint_init(void) ...@@ -213,7 +196,6 @@ static int __init maint_init(void)
int ret = 0; int ret = 0;
void *buffer = NULL; void *buffer = NULL;
do_gettimeofday(&start_time);
init_waitqueue_head(&msgwaitq); init_waitqueue_head(&msgwaitq);
printk(KERN_INFO "%s\n", DRIVERNAME); printk(KERN_INFO "%s\n", DRIVERNAME);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment