On Tue, Jul 21, 2020 at 05:10:02PM -0500, Scott Cheloha wrote:
> On Tue, Jul 21, 2020 at 07:33:21PM +1000, Jonathan Gray wrote:
> > Change from using timevals for ktime to 64 bit count of nanoseconds
> > to closer match linux.  From a discussion with cheloha@
> > 
> > 
> > 
> > @@ -67,70 +65,66 @@ ktime_get_raw_ns(void)
> >  }
> >  
> >  static inline struct timespec64
> > -ktime_to_timespec64(struct timeval tv)
> > +ktime_to_timespec64(ktime_t k)
> >  {
> >     struct timespec64 ts;
> > -   ts.tv_sec = tv.tv_sec;
> > -   ts.tv_nsec = tv.tv_usec * NSEC_PER_USEC;
> > +   ts.tv_sec = k / NSEC_PER_SEC;
> > +   ts.tv_nsec = k % NSEC_PER_SEC;
> 
> This isn't quite right.  You need to handle negative values of k, too.
> 
>       ts.tv_sec = k / NSEC_PER_SEC;
>       ts.tv_nsec = k % NSEC_PER_SEC;
>       if (ts.tv_nsec < 0) {
>               ts.tv_sec--;
>               ts.tv_nsec += NSEC_PER_SEC;
>       }
> 
> 

ah right, tv_nsec should not be negative in that case

Index: drm_vblank.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/drm/drm_vblank.c,v
retrieving revision 1.5
diff -u -p -r1.5 drm_vblank.c
--- drm_vblank.c        8 Jun 2020 04:47:58 -0000       1.5
+++ drm_vblank.c        24 Jul 2020 05:44:19 -0000
@@ -184,7 +184,7 @@ static void drm_reset_vblank_timestamp(s
         * interrupt and assign 0 for now, to mark the vblanktimestamp as 
invalid.
         */
        if (!rc)
-               t_vblank = (struct timeval) {0, 0};
+               t_vblank = 0;
 
        /*
         * +1 to make sure user will never see the same
@@ -293,7 +293,7 @@ static void drm_update_vblank_count(stru
         * for now, to mark the vblanktimestamp as invalid.
         */
        if (!rc && !in_vblank_irq)
-               t_vblank = (struct timeval) {0, 0};
+               t_vblank = 0;
 
        store_vblank(dev, pipe, diff, t_vblank, cur_vblank);
 }
@@ -871,7 +871,7 @@ static u64 drm_vblank_count_and_time(str
        unsigned int seq;
 
        if (WARN_ON(pipe >= dev->num_crtcs)) {
-               *vblanktime = (struct timeval) {0, 0};
+               *vblanktime = 0;
                return 0;
        }
 
Index: include/linux/ktime.h
===================================================================
RCS file: /cvs/src/sys/dev/pci/drm/include/linux/ktime.h,v
retrieving revision 1.4
diff -u -p -r1.4 ktime.h
--- include/linux/ktime.h       7 Jul 2020 04:05:25 -0000       1.4
+++ include/linux/ktime.h       24 Jul 2020 05:45:35 -0000
@@ -22,42 +22,40 @@
 #include <linux/time.h>
 #include <linux/jiffies.h>
 
-typedef struct timeval ktime_t;
+typedef int64_t ktime_t;
 
-static inline struct timeval
+static inline ktime_t
 ktime_get(void)
 {
-       struct timeval tv;
-       
-       microuptime(&tv);
-       return tv;
+       struct timespec ts;
+       nanouptime(&ts);
+       return TIMESPEC_TO_NSEC(&ts);
 }
 
-static inline struct timeval
+static inline ktime_t
 ktime_get_raw(void)
 {
-       struct timeval tv;
-       
-       microuptime(&tv);
-       return tv;
+       struct timespec ts;
+       nanouptime(&ts);
+       return TIMESPEC_TO_NSEC(&ts);
 }
 
 static inline int64_t
-ktime_to_ms(struct timeval tv)
+ktime_to_ms(ktime_t k)
 {
-       return timeval_to_ms(&tv);
+       return k / NSEC_PER_MSEC;
 }
 
 static inline int64_t
-ktime_to_us(struct timeval tv)
+ktime_to_us(ktime_t k)
 {
-       return timeval_to_us(&tv);
+       return k / NSEC_PER_USEC;
 }
 
 static inline int64_t
-ktime_to_ns(struct timeval tv)
+ktime_to_ns(ktime_t k)
 {
-       return timeval_to_ns(&tv);
+       return k;
 }
 
 static inline int64_t
@@ -67,70 +65,70 @@ ktime_get_raw_ns(void)
 }
 
 static inline struct timespec64
-ktime_to_timespec64(struct timeval tv)
+ktime_to_timespec64(ktime_t k)
 {
        struct timespec64 ts;
-       ts.tv_sec = tv.tv_sec;
-       ts.tv_nsec = tv.tv_usec * NSEC_PER_USEC;
+       ts.tv_sec = k / NSEC_PER_SEC;
+       ts.tv_nsec = k % NSEC_PER_SEC;
+       if (ts.tv_nsec < 0) {
+               ts.tv_sec--;
+               ts.tv_nsec += NSEC_PER_SEC;
+       }
        return ts;
 }
 
-static inline struct timeval
-ktime_sub(struct timeval a, struct timeval b)
+static inline ktime_t
+ktime_sub(ktime_t a, ktime_t b)
 {
-       struct timeval res;
-       timersub(&a, &b, &res);
-       return res;
+       return a - b;
 }
 
-static inline struct timeval
-ktime_add(struct timeval a, struct timeval b)
+static inline ktime_t
+ktime_add(ktime_t a, ktime_t b)
 {
-       struct timeval res;
-       timeradd(&a, &b, &res);
-       return res;
+       return a + b;
 }
 
-static inline struct timeval
-ktime_add_us(struct timeval tv, int64_t us)
+static inline ktime_t
+ktime_add_us(ktime_t k, uint64_t us)
 {
-       return ns_to_timeval(timeval_to_ns(&tv) + (us * NSEC_PER_USEC));
+       return k + (us * NSEC_PER_USEC);
 }
 
-static inline struct timeval
-ktime_add_ns(struct timeval tv, int64_t ns)
+static inline ktime_t
+ktime_add_ns(ktime_t k, int64_t ns)
 {
-       return ns_to_timeval(timeval_to_ns(&tv) + ns);
+       return k + ns;
 }
 
-static inline struct timeval
-ktime_sub_ns(struct timeval tv, int64_t ns)
+static inline ktime_t
+ktime_sub_ns(ktime_t k, int64_t ns)
 {
-       return ns_to_timeval(timeval_to_ns(&tv) - ns);
+       return k - ns;
 }
 
 static inline int64_t
-ktime_us_delta(struct timeval a, struct timeval b)
+ktime_us_delta(ktime_t a, ktime_t b)
 {
        return ktime_to_us(ktime_sub(a, b));
 }
 
 static inline int64_t
-ktime_ms_delta(struct timeval a, struct timeval b)
+ktime_ms_delta(ktime_t a, ktime_t b)
 {
        return ktime_to_ms(ktime_sub(a, b));
 }
 
 static inline bool
-ktime_after(const struct timeval a, const struct timeval b)
+ktime_after(ktime_t a, ktime_t b)
 {
-       return timercmp(&a, &b, >);
+       return a > b;
 }
 
-static inline struct timeval
+static inline ktime_t
 ns_to_ktime(uint64_t ns)
 {
-       return ns_to_timeval(ns);
+       return ns;
 }
 
 #include <linux/timekeeping.h>
Index: include/linux/timekeeping.h
===================================================================
RCS file: /cvs/src/sys/dev/pci/drm/include/linux/timekeeping.h,v
retrieving revision 1.7
diff -u -p -r1.7 timekeeping.h
--- include/linux/timekeeping.h 7 Jul 2020 04:05:25 -0000       1.7
+++ include/linux/timekeeping.h 24 Jul 2020 05:44:19 -0000
@@ -12,19 +12,18 @@ ktime_get_real_seconds(void)
        return gettime();
 }
 
-static inline struct timeval
+static inline ktime_t
 ktime_get_real(void)
 {
-       struct timeval tv;
-       microtime(&tv);
-       return tv;
+       struct timespec ts;
+       nanotime(&ts);
+       return TIMESPEC_TO_NSEC(&ts);
 }
 
 static inline uint64_t
 ktime_get_ns(void)
 {
-       struct timeval tv = ktime_get();
-       return timeval_to_ns(&tv);
+       return ktime_get();
 }
 
 #endif

Reply via email to