diff --git a/include/linux/ktime.h b/include/linux/ktime.h index ce59832..7c0ad35 100644 --- a/include/linux/ktime.h +++ b/include/linux/ktime.h @@ -150,7 +150,19 @@ static inline ktime_t timeval_to_ktime(struct timeval tv) /* Set a ktime_t variable to a value in sec/nsec representation: */ static inline ktime_t ktime_set(const long secs, const unsigned long nsecs) { - return (ktime_t) { .tv = { .sec = secs, .nsec = nsecs } }; + ktime_t res = { .tv = { .sec = secs, .nsec = nsecs }};; + + /* + * performance trick: the (u32) -NSEC gives 0x00000000Fxxxxxxx + * so we subtract NSEC_PER_SEC and add 1 to the upper 32 bit. + * + * it's equivalent to: + * tv.nsec -= NSEC_PER_SEC + * tv.sec ++; + */ + if (nsecs >= NSEC_PER_SEC) + res.tv64 += (u32)-NSEC_PER_SEC; + return res; } /**