diff options
-rw-r--r-- | include/linux/time.h | 47 | ||||
-rw-r--r-- | kernel/time.c | 36 |
2 files changed, 83 insertions, 0 deletions
diff --git a/include/linux/time.h b/include/linux/time.h index 64e797464589..f639fde29253 100644 --- a/include/linux/time.h +++ b/include/linux/time.h | |||
@@ -50,6 +50,12 @@ extern void set_normalized_timespec(struct timespec *ts, time_t sec, long nsec); | |||
50 | #define timespec_valid(ts) \ | 50 | #define timespec_valid(ts) \ |
51 | (((ts)->tv_sec >= 0) && (((unsigned) (ts)->tv_nsec) < NSEC_PER_SEC)) | 51 | (((ts)->tv_sec >= 0) && (((unsigned) (ts)->tv_nsec) < NSEC_PER_SEC)) |
52 | 52 | ||
53 | /* | ||
54 | * 64-bit nanosec type. Large enough to span 292+ years in nanosecond | ||
55 | * resolution. Ought to be enough for a while. | ||
56 | */ | ||
57 | typedef s64 nsec_t; | ||
58 | |||
53 | extern struct timespec xtime; | 59 | extern struct timespec xtime; |
54 | extern struct timespec wall_to_monotonic; | 60 | extern struct timespec wall_to_monotonic; |
55 | extern seqlock_t xtime_lock; | 61 | extern seqlock_t xtime_lock; |
@@ -79,6 +85,47 @@ extern void getnstimestamp(struct timespec *ts); | |||
79 | 85 | ||
80 | extern struct timespec timespec_trunc(struct timespec t, unsigned gran); | 86 | extern struct timespec timespec_trunc(struct timespec t, unsigned gran); |
81 | 87 | ||
88 | /** | ||
89 | * timespec_to_ns - Convert timespec to nanoseconds | ||
90 | * @ts: pointer to the timespec variable to be converted | ||
91 | * | ||
92 | * Returns the scalar nanosecond representation of the timespec | ||
93 | * parameter. | ||
94 | */ | ||
95 | static inline nsec_t timespec_to_ns(const struct timespec *ts) | ||
96 | { | ||
97 | return ((nsec_t) ts->tv_sec * NSEC_PER_SEC) + ts->tv_nsec; | ||
98 | } | ||
99 | |||
100 | /** | ||
101 | * timeval_to_ns - Convert timeval to nanoseconds | ||
102 | * @ts: pointer to the timeval variable to be converted | ||
103 | * | ||
104 | * Returns the scalar nanosecond representation of the timeval | ||
105 | * parameter. | ||
106 | */ | ||
107 | static inline nsec_t timeval_to_ns(const struct timeval *tv) | ||
108 | { | ||
109 | return ((nsec_t) tv->tv_sec * NSEC_PER_SEC) + | ||
110 | tv->tv_usec * NSEC_PER_USEC; | ||
111 | } | ||
112 | |||
113 | /** | ||
114 | * ns_to_timespec - Convert nanoseconds to timespec | ||
115 | * @nsec: the nanoseconds value to be converted | ||
116 | * | ||
117 | * Returns the timespec representation of the nsec parameter. | ||
118 | */ | ||
119 | extern struct timespec ns_to_timespec(const nsec_t nsec); | ||
120 | |||
121 | /** | ||
122 | * ns_to_timeval - Convert nanoseconds to timeval | ||
123 | * @nsec: the nanoseconds value to be converted | ||
124 | * | ||
125 | * Returns the timeval representation of the nsec parameter. | ||
126 | */ | ||
127 | extern struct timeval ns_to_timeval(const nsec_t nsec); | ||
128 | |||
82 | #endif /* __KERNEL__ */ | 129 | #endif /* __KERNEL__ */ |
83 | 130 | ||
84 | #define NFDBITS __NFDBITS | 131 | #define NFDBITS __NFDBITS |
diff --git a/kernel/time.c b/kernel/time.c index c689b53297cf..cf5a4582a672 100644 --- a/kernel/time.c +++ b/kernel/time.c | |||
@@ -652,6 +652,42 @@ void set_normalized_timespec(struct timespec *ts, time_t sec, long nsec) | |||
652 | ts->tv_nsec = nsec; | 652 | ts->tv_nsec = nsec; |
653 | } | 653 | } |
654 | 654 | ||
655 | /** | ||
656 | * ns_to_timespec - Convert nanoseconds to timespec | ||
657 | * @nsec: the nanoseconds value to be converted | ||
658 | * | ||
659 | * Returns the timespec representation of the nsec parameter. | ||
660 | */ | ||
661 | inline struct timespec ns_to_timespec(const nsec_t nsec) | ||
662 | { | ||
663 | struct timespec ts; | ||
664 | |||
665 | if (nsec) | ||
666 | ts.tv_sec = div_long_long_rem_signed(nsec, NSEC_PER_SEC, | ||
667 | &ts.tv_nsec); | ||
668 | else | ||
669 | ts.tv_sec = ts.tv_nsec = 0; | ||
670 | |||
671 | return ts; | ||
672 | } | ||
673 | |||
674 | /** | ||
675 | * ns_to_timeval - Convert nanoseconds to timeval | ||
676 | * @nsec: the nanoseconds value to be converted | ||
677 | * | ||
678 | * Returns the timeval representation of the nsec parameter. | ||
679 | */ | ||
680 | struct timeval ns_to_timeval(const nsec_t nsec) | ||
681 | { | ||
682 | struct timespec ts = ns_to_timespec(nsec); | ||
683 | struct timeval tv; | ||
684 | |||
685 | tv.tv_sec = ts.tv_sec; | ||
686 | tv.tv_usec = (suseconds_t) ts.tv_nsec / 1000; | ||
687 | |||
688 | return tv; | ||
689 | } | ||
690 | |||
655 | #if (BITS_PER_LONG < 64) | 691 | #if (BITS_PER_LONG < 64) |
656 | u64 get_jiffies_64(void) | 692 | u64 get_jiffies_64(void) |
657 | { | 693 | { |