From 770d4a4174d396cf1a022b1c8de80bd022789f0d Mon Sep 17 00:00:00 2001 From: James Simmons Date: Fri, 13 Jan 2017 16:39:23 -0500 Subject: [PATCH] LU-9019 osd : remove struct timeval use in osd-ldiskfs For brw_stats_show change the output to use a timespec64 type to avoid the overflow. Also change the format to print the sub-second portion as 9 digits (nanoseconds) for clarity, rather than printing six digits without leading zeroes. Both osd_write_prep() and osd_read_prep() want to report the time it took to perform its operations in the osd_get_page counter. This is currently done with a call to do_gettimeofday with struct timeval which is not 2038 safe. Move this operation to 64 bit time handling. Change-Id: I457ac799d855d2596220b6e0d0c5039e8b00021f Signed-off-by: James Simmons Reviewed-on: https://review.whamcloud.com/24896 Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Fan Yong Reviewed-by: Alex Zhuravlev Reviewed-by: Dmitry Eremin Reviewed-by: Oleg Drokin --- lustre/osd-ldiskfs/osd_io.c | 22 +++++++++++----------- lustre/osd-ldiskfs/osd_lproc.c | 9 +++++---- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/lustre/osd-ldiskfs/osd_io.c b/lustre/osd-ldiskfs/osd_io.c index 7c9d127..abc47fc 100644 --- a/lustre/osd-ldiskfs/osd_io.c +++ b/lustre/osd-ldiskfs/osd_io.c @@ -969,9 +969,9 @@ static int osd_write_prep(const struct lu_env *env, struct dt_object *dt, struct osd_iobuf *iobuf = &oti->oti_iobuf; struct inode *inode = osd_dt_obj(dt)->oo_inode; struct osd_device *osd = osd_obj2dev(osd_dt_obj(dt)); - struct timeval start; - struct timeval end; - unsigned long timediff; + ktime_t start; + ktime_t end; + s64 timediff; ssize_t isize; __s64 maxidx; int rc = 0; @@ -992,7 +992,7 @@ static int osd_write_prep(const struct lu_env *env, struct dt_object *dt, if (isize > osd->od_readcache_max_filesize) cache = 0; - do_gettimeofday(&start); + start = ktime_get(); for (i = 0; i < npages; i++) { if (cache == 0) @@ -1025,8 +1025,8 @@ static int osd_write_prep(const struct lu_env *env, struct dt_object *dt, kunmap(lnb[i].lnb_page); } } - do_gettimeofday(&end); - timediff = cfs_timeval_sub(&end, &start, NULL); + end = ktime_get(); + timediff = ktime_us_delta(end, start); lprocfs_counter_add(osd->od_stats, LPROC_OSD_GET_PAGE, timediff); if (iobuf->dr_npages) { @@ -1318,9 +1318,9 @@ static int osd_read_prep(const struct lu_env *env, struct dt_object *dt, struct osd_iobuf *iobuf = &oti->oti_iobuf; struct inode *inode = osd_dt_obj(dt)->oo_inode; struct osd_device *osd = osd_obj2dev(osd_dt_obj(dt)); - struct timeval start, end; - unsigned long timediff; int rc = 0, i, cache = 0, cache_hits = 0, cache_misses = 0; + ktime_t start, end; + s64 timediff; loff_t isize; LASSERT(inode); @@ -1336,7 +1336,7 @@ static int osd_read_prep(const struct lu_env *env, struct dt_object *dt, if (isize > osd->od_readcache_max_filesize) cache = 0; - do_gettimeofday(&start); + start = ktime_get(); for (i = 0; i < npages; i++) { if (isize <= lnb[i].lnb_file_offset) @@ -1360,8 +1360,8 @@ static int osd_read_prep(const struct lu_env *env, struct dt_object *dt, generic_error_remove_page(inode->i_mapping, lnb[i].lnb_page); } - do_gettimeofday(&end); - timediff = cfs_timeval_sub(&end, &start, NULL); + end = ktime_get(); + timediff = ktime_us_delta(end, start); lprocfs_counter_add(osd->od_stats, LPROC_OSD_GET_PAGE, timediff); if (cache_hits != 0) diff --git a/lustre/osd-ldiskfs/osd_lproc.c b/lustre/osd-ldiskfs/osd_lproc.c index 15e6977..8b018cf 100644 --- a/lustre/osd-ldiskfs/osd_lproc.c +++ b/lustre/osd-ldiskfs/osd_lproc.c @@ -121,12 +121,13 @@ static void display_brw_stats(struct seq_file *seq, char *name, char *units, static void brw_stats_show(struct seq_file *seq, struct brw_stats *brw_stats) { - struct timeval now; + struct timespec64 now; /* this sampling races with updates */ - do_gettimeofday(&now); - seq_printf(seq, "snapshot_time: %lu.%lu (secs.usecs)\n", - now.tv_sec, now.tv_usec); + ktime_get_real_ts64(&now); + + seq_printf(seq, "snapshot_time: %lld.%09ld (secs.nsecs)\n", + (s64)now.tv_sec, now.tv_nsec); display_brw_stats(seq, "pages per bulk r/w", "rpcs", &brw_stats->hist[BRW_R_PAGES], -- 1.8.3.1