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