aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/time.c
diff options
context:
space:
mode:
authorPaul Mackerras <paulus@samba.org>2008-05-09 06:12:06 -0400
committerPaul Mackerras <paulus@samba.org>2008-05-09 06:12:06 -0400
commit2a5f2e3e6cd1ce9fb3f8b186b6bc9aa1f1497a92 (patch)
treeb2306840f227972a7c9d4a2b75e516fe81358ce8 /kernel/time.c
parent02539d71fa98d5737bb668b02286c76241e4bac9 (diff)
parent78be76476a34a77f0ea9db2f78ba46a2b0fd5ab5 (diff)
Merge branch 'for-2.6.26' of master.kernel.org:/pub/scm/linux/kernel/git/jwboyer/powerpc-4xx into merge
Diffstat (limited to 'kernel/time.c')
-rw-r--r--kernel/time.c63
1 files changed, 29 insertions, 34 deletions
diff --git a/kernel/time.c b/kernel/time.c
index 35d373a98782..6a08660b4fac 100644
--- a/kernel/time.c
+++ b/kernel/time.c
@@ -35,6 +35,8 @@
35#include <linux/syscalls.h> 35#include <linux/syscalls.h>
36#include <linux/security.h> 36#include <linux/security.h>
37#include <linux/fs.h> 37#include <linux/fs.h>
38#include <linux/slab.h>
39#include <linux/math64.h>
38 40
39#include <asm/uaccess.h> 41#include <asm/uaccess.h>
40#include <asm/unistd.h> 42#include <asm/unistd.h>
@@ -244,7 +246,7 @@ unsigned int inline jiffies_to_msecs(const unsigned long j)
244 return (j + (HZ / MSEC_PER_SEC) - 1)/(HZ / MSEC_PER_SEC); 246 return (j + (HZ / MSEC_PER_SEC) - 1)/(HZ / MSEC_PER_SEC);
245#else 247#else
246# if BITS_PER_LONG == 32 248# if BITS_PER_LONG == 32
247 return ((u64)HZ_TO_MSEC_MUL32 * j) >> HZ_TO_MSEC_SHR32; 249 return (HZ_TO_MSEC_MUL32 * j) >> HZ_TO_MSEC_SHR32;
248# else 250# else
249 return (j * HZ_TO_MSEC_NUM) / HZ_TO_MSEC_DEN; 251 return (j * HZ_TO_MSEC_NUM) / HZ_TO_MSEC_DEN;
250# endif 252# endif
@@ -260,7 +262,7 @@ unsigned int inline jiffies_to_usecs(const unsigned long j)
260 return (j + (HZ / USEC_PER_SEC) - 1)/(HZ / USEC_PER_SEC); 262 return (j + (HZ / USEC_PER_SEC) - 1)/(HZ / USEC_PER_SEC);
261#else 263#else
262# if BITS_PER_LONG == 32 264# if BITS_PER_LONG == 32
263 return ((u64)HZ_TO_USEC_MUL32 * j) >> HZ_TO_USEC_SHR32; 265 return (HZ_TO_USEC_MUL32 * j) >> HZ_TO_USEC_SHR32;
264# else 266# else
265 return (j * HZ_TO_USEC_NUM) / HZ_TO_USEC_DEN; 267 return (j * HZ_TO_USEC_NUM) / HZ_TO_USEC_DEN;
266# endif 268# endif
@@ -390,13 +392,17 @@ EXPORT_SYMBOL(set_normalized_timespec);
390struct timespec ns_to_timespec(const s64 nsec) 392struct timespec ns_to_timespec(const s64 nsec)
391{ 393{
392 struct timespec ts; 394 struct timespec ts;
395 s32 rem;
393 396
394 if (!nsec) 397 if (!nsec)
395 return (struct timespec) {0, 0}; 398 return (struct timespec) {0, 0};
396 399
397 ts.tv_sec = div_long_long_rem_signed(nsec, NSEC_PER_SEC, &ts.tv_nsec); 400 ts.tv_sec = div_s64_rem(nsec, NSEC_PER_SEC, &rem);
398 if (unlikely(nsec < 0)) 401 if (unlikely(rem < 0)) {
399 set_normalized_timespec(&ts, ts.tv_sec, ts.tv_nsec); 402 ts.tv_sec--;
403 rem += NSEC_PER_SEC;
404 }
405 ts.tv_nsec = rem;
400 406
401 return ts; 407 return ts;
402} 408}
@@ -470,7 +476,7 @@ unsigned long msecs_to_jiffies(const unsigned int m)
470 if (HZ > MSEC_PER_SEC && m > jiffies_to_msecs(MAX_JIFFY_OFFSET)) 476 if (HZ > MSEC_PER_SEC && m > jiffies_to_msecs(MAX_JIFFY_OFFSET))
471 return MAX_JIFFY_OFFSET; 477 return MAX_JIFFY_OFFSET;
472 478
473 return ((u64)MSEC_TO_HZ_MUL32 * m + MSEC_TO_HZ_ADJ32) 479 return (MSEC_TO_HZ_MUL32 * m + MSEC_TO_HZ_ADJ32)
474 >> MSEC_TO_HZ_SHR32; 480 >> MSEC_TO_HZ_SHR32;
475#endif 481#endif
476} 482}
@@ -485,7 +491,7 @@ unsigned long usecs_to_jiffies(const unsigned int u)
485#elif HZ > USEC_PER_SEC && !(HZ % USEC_PER_SEC) 491#elif HZ > USEC_PER_SEC && !(HZ % USEC_PER_SEC)
486 return u * (HZ / USEC_PER_SEC); 492 return u * (HZ / USEC_PER_SEC);
487#else 493#else
488 return ((u64)USEC_TO_HZ_MUL32 * u + USEC_TO_HZ_ADJ32) 494 return (USEC_TO_HZ_MUL32 * u + USEC_TO_HZ_ADJ32)
489 >> USEC_TO_HZ_SHR32; 495 >> USEC_TO_HZ_SHR32;
490#endif 496#endif
491} 497}
@@ -526,8 +532,10 @@ jiffies_to_timespec(const unsigned long jiffies, struct timespec *value)
526 * Convert jiffies to nanoseconds and separate with 532 * Convert jiffies to nanoseconds and separate with
527 * one divide. 533 * one divide.
528 */ 534 */
529 u64 nsec = (u64)jiffies * TICK_NSEC; 535 u32 rem;
530 value->tv_sec = div_long_long_rem(nsec, NSEC_PER_SEC, &value->tv_nsec); 536 value->tv_sec = div_u64_rem((u64)jiffies * TICK_NSEC,
537 NSEC_PER_SEC, &rem);
538 value->tv_nsec = rem;
531} 539}
532EXPORT_SYMBOL(jiffies_to_timespec); 540EXPORT_SYMBOL(jiffies_to_timespec);
533 541
@@ -565,12 +573,11 @@ void jiffies_to_timeval(const unsigned long jiffies, struct timeval *value)
565 * Convert jiffies to nanoseconds and separate with 573 * Convert jiffies to nanoseconds and separate with
566 * one divide. 574 * one divide.
567 */ 575 */
568 u64 nsec = (u64)jiffies * TICK_NSEC; 576 u32 rem;
569 long tv_usec;
570 577
571 value->tv_sec = div_long_long_rem(nsec, NSEC_PER_SEC, &tv_usec); 578 value->tv_sec = div_u64_rem((u64)jiffies * TICK_NSEC,
572 tv_usec /= NSEC_PER_USEC; 579 NSEC_PER_SEC, &rem);
573 value->tv_usec = tv_usec; 580 value->tv_usec = rem / NSEC_PER_USEC;
574} 581}
575EXPORT_SYMBOL(jiffies_to_timeval); 582EXPORT_SYMBOL(jiffies_to_timeval);
576 583
@@ -586,9 +593,7 @@ clock_t jiffies_to_clock_t(long x)
586 return x / (HZ / USER_HZ); 593 return x / (HZ / USER_HZ);
587# endif 594# endif
588#else 595#else
589 u64 tmp = (u64)x * TICK_NSEC; 596 return div_u64((u64)x * TICK_NSEC, NSEC_PER_SEC / USER_HZ);
590 do_div(tmp, (NSEC_PER_SEC / USER_HZ));
591 return (long)tmp;
592#endif 597#endif
593} 598}
594EXPORT_SYMBOL(jiffies_to_clock_t); 599EXPORT_SYMBOL(jiffies_to_clock_t);
@@ -600,16 +605,12 @@ unsigned long clock_t_to_jiffies(unsigned long x)
600 return ~0UL; 605 return ~0UL;
601 return x * (HZ / USER_HZ); 606 return x * (HZ / USER_HZ);
602#else 607#else
603 u64 jif;
604
605 /* Don't worry about loss of precision here .. */ 608 /* Don't worry about loss of precision here .. */
606 if (x >= ~0UL / HZ * USER_HZ) 609 if (x >= ~0UL / HZ * USER_HZ)
607 return ~0UL; 610 return ~0UL;
608 611
609 /* .. but do try to contain it here */ 612 /* .. but do try to contain it here */
610 jif = x * (u64) HZ; 613 return div_u64((u64)x * HZ, USER_HZ);
611 do_div(jif, USER_HZ);
612 return jif;
613#endif 614#endif
614} 615}
615EXPORT_SYMBOL(clock_t_to_jiffies); 616EXPORT_SYMBOL(clock_t_to_jiffies);
@@ -618,10 +619,9 @@ u64 jiffies_64_to_clock_t(u64 x)
618{ 619{
619#if (TICK_NSEC % (NSEC_PER_SEC / USER_HZ)) == 0 620#if (TICK_NSEC % (NSEC_PER_SEC / USER_HZ)) == 0
620# if HZ < USER_HZ 621# if HZ < USER_HZ
621 x *= USER_HZ; 622 x = div_u64(x * USER_HZ, HZ);
622 do_div(x, HZ);
623# elif HZ > USER_HZ 623# elif HZ > USER_HZ
624 do_div(x, HZ / USER_HZ); 624 x = div_u64(x, HZ / USER_HZ);
625# else 625# else
626 /* Nothing to do */ 626 /* Nothing to do */
627# endif 627# endif
@@ -631,8 +631,7 @@ u64 jiffies_64_to_clock_t(u64 x)
631 * but even this doesn't overflow in hundreds of years 631 * but even this doesn't overflow in hundreds of years
632 * in 64 bits, so.. 632 * in 64 bits, so..
633 */ 633 */
634 x *= TICK_NSEC; 634 x = div_u64(x * TICK_NSEC, (NSEC_PER_SEC / USER_HZ));
635 do_div(x, (NSEC_PER_SEC / USER_HZ));
636#endif 635#endif
637 return x; 636 return x;
638} 637}
@@ -641,21 +640,17 @@ EXPORT_SYMBOL(jiffies_64_to_clock_t);
641u64 nsec_to_clock_t(u64 x) 640u64 nsec_to_clock_t(u64 x)
642{ 641{
643#if (NSEC_PER_SEC % USER_HZ) == 0 642#if (NSEC_PER_SEC % USER_HZ) == 0
644 do_div(x, (NSEC_PER_SEC / USER_HZ)); 643 return div_u64(x, NSEC_PER_SEC / USER_HZ);
645#elif (USER_HZ % 512) == 0 644#elif (USER_HZ % 512) == 0
646 x *= USER_HZ/512; 645 return div_u64(x * USER_HZ / 512, NSEC_PER_SEC / 512);
647 do_div(x, (NSEC_PER_SEC / 512));
648#else 646#else
649 /* 647 /*
650 * max relative error 5.7e-8 (1.8s per year) for USER_HZ <= 1024, 648 * max relative error 5.7e-8 (1.8s per year) for USER_HZ <= 1024,
651 * overflow after 64.99 years. 649 * overflow after 64.99 years.
652 * exact for HZ=60, 72, 90, 120, 144, 180, 300, 600, 900, ... 650 * exact for HZ=60, 72, 90, 120, 144, 180, 300, 600, 900, ...
653 */ 651 */
654 x *= 9; 652 return div_u64(x * 9, (9ull * NSEC_PER_SEC + (USER_HZ / 2)) / USER_HZ);
655 do_div(x, (unsigned long)((9ull * NSEC_PER_SEC + (USER_HZ/2)) /
656 USER_HZ));
657#endif 653#endif
658 return x;
659} 654}
660 655
661#if (BITS_PER_LONG < 64) 656#if (BITS_PER_LONG < 64)