Whamcloud - gitweb
LU-9019 osd : remove struct timeval use in osd-ldiskfs 96/24896/2
authorJames Simmons <uja.ornl@yahoo.com>
Fri, 13 Jan 2017 21:39:23 +0000 (16:39 -0500)
committerOleg Drokin <oleg.drokin@intel.com>
Tue, 24 Jan 2017 05:21:43 +0000 (05:21 +0000)
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 <uja.ornl@yahoo.com>
Reviewed-on: https://review.whamcloud.com/24896
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Fan Yong <fan.yong@intel.com>
Reviewed-by: Alex Zhuravlev <alexey.zhuravlev@intel.com>
Reviewed-by: Dmitry Eremin <dmitry.eremin@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/osd-ldiskfs/osd_io.c
lustre/osd-ldiskfs/osd_lproc.c

index 7c9d127..abc47fc 100644 (file)
@@ -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 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;
         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;
 
         if (isize > osd->od_readcache_max_filesize)
                 cache = 0;
 
-       do_gettimeofday(&start);
+       start = ktime_get();
        for (i = 0; i < npages; i++) {
 
                if (cache == 0)
        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);
                }
        }
                        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) {
        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 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;
        int rc = 0, i, cache = 0, cache_hits = 0, cache_misses = 0;
+       ktime_t start, end;
+       s64 timediff;
        loff_t isize;
 
         LASSERT(inode);
        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;
 
        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)
        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);
        }
                        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)
        lprocfs_counter_add(osd->od_stats, LPROC_OSD_GET_PAGE, timediff);
 
        if (cache_hits != 0)
index 15e6977..8b018cf 100644 (file)
@@ -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)
 {
 
 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 */
 
        /* 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],
 
         display_brw_stats(seq, "pages per bulk r/w", "rpcs",
                           &brw_stats->hist[BRW_R_PAGES],