aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/time.h47
-rw-r--r--kernel/time.c36
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 */
57typedef s64 nsec_t;
58
53extern struct timespec xtime; 59extern struct timespec xtime;
54extern struct timespec wall_to_monotonic; 60extern struct timespec wall_to_monotonic;
55extern seqlock_t xtime_lock; 61extern seqlock_t xtime_lock;
@@ -79,6 +85,47 @@ extern void getnstimestamp(struct timespec *ts);
79 85
80extern struct timespec timespec_trunc(struct timespec t, unsigned gran); 86extern 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 */
95static 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 */
107static 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 */
119extern 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 */
127extern 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 */
661inline 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 */
680struct 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)
656u64 get_jiffies_64(void) 692u64 get_jiffies_64(void)
657{ 693{