struct timespec will overflow in year 2038, so replace it with timespec64. And replace functions that use struct timespec, timespec_sub with timespec64_sub and getnstimeofday with getnstimeofday64. Also use parameters to convert the timespec64 values instead of hard code.
Signed-off-by: Ksenija Stanojevic ksenija.stanojevic@gmail.com --- drivers/staging/fbtft/fbtft-core.c | 26 +++++++++++++------------- drivers/staging/fbtft/fbtft.h | 2 +- 2 files changed, 14 insertions(+), 14 deletions(-)
diff --git a/drivers/staging/fbtft/fbtft-core.c b/drivers/staging/fbtft/fbtft-core.c index 23392eb..3e4eeac 100644 --- a/drivers/staging/fbtft/fbtft-core.c +++ b/drivers/staging/fbtft/fbtft-core.c @@ -365,16 +365,16 @@ static void fbtft_update_display(struct fbtft_par *par, unsigned start_line, unsigned end_line) { size_t offset, len; - struct timespec ts_start, ts_end, ts_fps, ts_duration; + struct timespec64 ts_start, ts_end, ts_fps, ts_duration; long fps_ms, fps_us, duration_ms, duration_us; - long fps, throughput; + long long fps, throughput; bool timeit = false; int ret = 0;
if (unlikely(par->debug & (DEBUG_TIME_FIRST_UPDATE | DEBUG_TIME_EACH_UPDATE))) { if ((par->debug & DEBUG_TIME_EACH_UPDATE) || ((par->debug & DEBUG_TIME_FIRST_UPDATE) && !par->first_update_done)) { - getnstimeofday(&ts_start); + getnstimeofday64(&ts_start); timeit = true; } } @@ -411,28 +411,28 @@ static void fbtft_update_display(struct fbtft_par *par, unsigned start_line, __func__);
if (unlikely(timeit)) { - getnstimeofday(&ts_end); + getnstimeofday64(&ts_end); if (par->update_time.tv_nsec == 0 && par->update_time.tv_sec == 0) { par->update_time.tv_sec = ts_start.tv_sec; par->update_time.tv_nsec = ts_start.tv_nsec; } - ts_fps = timespec_sub(ts_start, par->update_time); + ts_fps = timespec64_sub(ts_start, par->update_time); par->update_time.tv_sec = ts_start.tv_sec; par->update_time.tv_nsec = ts_start.tv_nsec; - fps_ms = (ts_fps.tv_sec * 1000) + ((ts_fps.tv_nsec / 1000000) % 1000); - fps_us = (ts_fps.tv_nsec / 1000) % 1000; - fps = fps_ms * 1000 + fps_us; + fps_ms = (ts_fps.tv_sec * MSEC_PER_SEC) + (ts_fps.tv_nsec / NSEC_PER_MSEC); + fps_us = ts_fps.tv_nsec / NSEC_PER_USEC; + fps = fps_ms * USEC_PER_MSEC + fps_us; fps = fps ? 1000000 / fps : 0;
- ts_duration = timespec_sub(ts_end, ts_start); - duration_ms = (ts_duration.tv_sec * 1000) + ((ts_duration.tv_nsec / 1000000) % 1000); - duration_us = (ts_duration.tv_nsec / 1000) % 1000; - throughput = duration_ms * 1000 + duration_us; + ts_duration = timespec64_sub(ts_end, ts_start); + duration_ms = (ts_duration.tv_sec * MSEC_PER_SEC) + (ts_duration.tv_nsec / NSEC_PER_MSEC); + duration_us = ts_duration.tv_nsec / NSEC_PER_USEC; + throughput = duration_ms * USEC_PER_MSEC + duration_us; throughput = throughput ? (len * 1000) / throughput : 0; throughput = throughput * 1000 / 1024;
dev_info(par->info->device, - "Display update: %ld kB/s (%ld.%.3ld ms), fps=%ld (%ld.%.3ld ms)\n", + "Display update: %lld kB/s (%ld.%.3ld ms), fps=%lld (%ld.%.3ld ms)\n", throughput, duration_ms, duration_us, fps, fps_ms, fps_us); par->first_update_done = true; diff --git a/drivers/staging/fbtft/fbtft.h b/drivers/staging/fbtft/fbtft.h index 7e9a506..bf4c358 100644 --- a/drivers/staging/fbtft/fbtft.h +++ b/drivers/staging/fbtft/fbtft.h @@ -251,7 +251,7 @@ struct fbtft_par { } gamma; unsigned long debug; bool first_update_done; - struct timespec update_time; + struct timespec64 update_time; bool bgr; void *extra; };
On Tuesday 29 September 2015 17:17:35 Ksenija Stanojevic wrote:
struct timespec will overflow in year 2038, so replace it with timespec64. And replace functions that use struct timespec, timespec_sub with timespec64_sub and getnstimeofday with getnstimeofday64. Also use parameters to convert the timespec64 values instead of hard code.
Signed-off-by: Ksenija Stanojevic ksenija.stanojevic@gmail.com
The patch looks correct, and the changelog comment seems ok too.
However, I think it makes sense to do two other changes at the same time here:
- use ktime_t with ktime_us_delta()/ktime_to_ns to simplify the code
- use monotonic time (ktime_get) instead of wall time (getnstimeofday64/ktime_get_real) to be more robust against leap seconds and settimeofday() calls
Arnd