divamnt stores a start_time at module init and uses it to calculate elapsed time. That 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, change how time data is obtained: - replace struct timeval with struct timespec64 - replace do_gettimeofday() with ktime_get_ts64() - use timespec64_sub() to calculate elapsed time
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 time deltas are stored in unsigned 32 bits. This is safe as we are always storing time deltas.
Remove declaration and init of unused time constants.
Signed-off-by: Alison Schofield amsfield22@gmail.com --- Changes in v2: - switched to monotonic time - removed the unused time constants - changelog updated
drivers/isdn/hardware/eicon/debug.c | 4 ---- drivers/isdn/hardware/eicon/divamnt.c | 35 +++++++++++------------------------ 2 files changed, 11 insertions(+), 28 deletions(-)
diff --git a/drivers/isdn/hardware/eicon/debug.c b/drivers/isdn/hardware/eicon/debug.c index b5226af..576b7b4 100644 --- a/drivers/isdn/hardware/eicon/debug.c +++ b/drivers/isdn/hardware/eicon/debug.c @@ -192,8 +192,6 @@ static diva_os_spin_lock_t dbg_q_lock; static diva_os_spin_lock_t dbg_adapter_lock; static int dbg_q_busy; static volatile dword dbg_sequence; -static dword start_sec; -static dword start_usec;
/* INTERFACE: @@ -215,8 +213,6 @@ int diva_maint_init(byte *base, unsigned long length, int do_init) {
dbg_base = base;
- diva_os_get_time(&start_sec, &start_usec); - *(dword *)base = (dword)DBG_MAGIC; /* Store Magic */ base += sizeof(dword); length -= sizeof(dword); diff --git a/drivers/isdn/hardware/eicon/divamnt.c b/drivers/isdn/hardware/eicon/divamnt.c index 48db08d..1bb1b26 100644 --- a/drivers/isdn/hardware/eicon/divamnt.c +++ b/drivers/isdn/hardware/eicon/divamnt.c @@ -45,7 +45,7 @@ char *DRIVERRELEASE_MNT = "2.0";
static wait_queue_head_t msgwaitq; static unsigned long opened; -static struct timeval start_time; +static struct timespec64 start_time;
extern int mntfunc_init(int *, void **, unsigned long); extern void mntfunc_finit(void); @@ -88,28 +88,15 @@ int diva_os_copy_from_user(void *os_handle, void *dst, const void __user *src, */ void diva_os_get_time(dword *sec, dword *usec) { - struct timeval tv; - - do_gettimeofday(&tv); - - if (tv.tv_sec > start_time.tv_sec) { - if (start_time.tv_usec > tv.tv_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; - } + struct timespec64 curr_time; + struct timespec64 delta; + + ktime_get_ts64(&curr_time); + + delta = timespec64_sub(curr_time, start_time); + + *sec = (dword) delta.tv_sec; + *usec = (dword) (delta.tv_nsec / NSEC_PER_USEC); }
/* @@ -213,7 +200,7 @@ static int __init maint_init(void) int ret = 0; void *buffer = NULL;
- do_gettimeofday(&start_time); + ktime_get_ts64(&start_time); init_waitqueue_head(&msgwaitq);
printk(KERN_INFO "%s\n", DRIVERNAME);