diff options
Diffstat (limited to 'kernel/time.c')
-rw-r--r-- | kernel/time.c | 54 |
1 files changed, 24 insertions, 30 deletions
diff --git a/kernel/time.c b/kernel/time.c index 86729042e4cd..cbe0d5a222ff 100644 --- a/kernel/time.c +++ b/kernel/time.c | |||
@@ -36,6 +36,7 @@ | |||
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> | 38 | #include <linux/slab.h> |
39 | #include <linux/math64.h> | ||
39 | 40 | ||
40 | #include <asm/uaccess.h> | 41 | #include <asm/uaccess.h> |
41 | #include <asm/unistd.h> | 42 | #include <asm/unistd.h> |
@@ -391,13 +392,17 @@ EXPORT_SYMBOL(set_normalized_timespec); | |||
391 | struct timespec ns_to_timespec(const s64 nsec) | 392 | struct timespec ns_to_timespec(const s64 nsec) |
392 | { | 393 | { |
393 | struct timespec ts; | 394 | struct timespec ts; |
395 | s32 rem; | ||
394 | 396 | ||
395 | if (!nsec) | 397 | if (!nsec) |
396 | return (struct timespec) {0, 0}; | 398 | return (struct timespec) {0, 0}; |
397 | 399 | ||
398 | 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); |
399 | if (unlikely(nsec < 0)) | 401 | if (unlikely(rem < 0)) { |
400 | 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; | ||
401 | 406 | ||
402 | return ts; | 407 | return ts; |
403 | } | 408 | } |
@@ -527,8 +532,10 @@ jiffies_to_timespec(const unsigned long jiffies, struct timespec *value) | |||
527 | * Convert jiffies to nanoseconds and separate with | 532 | * Convert jiffies to nanoseconds and separate with |
528 | * one divide. | 533 | * one divide. |
529 | */ | 534 | */ |
530 | u64 nsec = (u64)jiffies * TICK_NSEC; | 535 | u32 rem; |
531 | 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; | ||
532 | } | 539 | } |
533 | EXPORT_SYMBOL(jiffies_to_timespec); | 540 | EXPORT_SYMBOL(jiffies_to_timespec); |
534 | 541 | ||
@@ -566,12 +573,11 @@ void jiffies_to_timeval(const unsigned long jiffies, struct timeval *value) | |||
566 | * Convert jiffies to nanoseconds and separate with | 573 | * Convert jiffies to nanoseconds and separate with |
567 | * one divide. | 574 | * one divide. |
568 | */ | 575 | */ |
569 | u64 nsec = (u64)jiffies * TICK_NSEC; | 576 | u32 rem; |
570 | long tv_usec; | ||
571 | 577 | ||
572 | value->tv_sec = div_long_long_rem(nsec, NSEC_PER_SEC, &tv_usec); | 578 | value->tv_sec = div_u64_rem((u64)jiffies * TICK_NSEC, |
573 | tv_usec /= NSEC_PER_USEC; | 579 | NSEC_PER_SEC, &rem); |
574 | value->tv_usec = tv_usec; | 580 | value->tv_usec = rem / NSEC_PER_USEC; |
575 | } | 581 | } |
576 | EXPORT_SYMBOL(jiffies_to_timeval); | 582 | EXPORT_SYMBOL(jiffies_to_timeval); |
577 | 583 | ||
@@ -587,9 +593,7 @@ clock_t jiffies_to_clock_t(long x) | |||
587 | return x / (HZ / USER_HZ); | 593 | return x / (HZ / USER_HZ); |
588 | # endif | 594 | # endif |
589 | #else | 595 | #else |
590 | u64 tmp = (u64)x * TICK_NSEC; | 596 | return div_u64((u64)x * TICK_NSEC, NSEC_PER_SEC / USER_HZ); |
591 | do_div(tmp, (NSEC_PER_SEC / USER_HZ)); | ||
592 | return (long)tmp; | ||
593 | #endif | 597 | #endif |
594 | } | 598 | } |
595 | EXPORT_SYMBOL(jiffies_to_clock_t); | 599 | EXPORT_SYMBOL(jiffies_to_clock_t); |
@@ -601,16 +605,12 @@ unsigned long clock_t_to_jiffies(unsigned long x) | |||
601 | return ~0UL; | 605 | return ~0UL; |
602 | return x * (HZ / USER_HZ); | 606 | return x * (HZ / USER_HZ); |
603 | #else | 607 | #else |
604 | u64 jif; | ||
605 | |||
606 | /* Don't worry about loss of precision here .. */ | 608 | /* Don't worry about loss of precision here .. */ |
607 | if (x >= ~0UL / HZ * USER_HZ) | 609 | if (x >= ~0UL / HZ * USER_HZ) |
608 | return ~0UL; | 610 | return ~0UL; |
609 | 611 | ||
610 | /* .. but do try to contain it here */ | 612 | /* .. but do try to contain it here */ |
611 | jif = x * (u64) HZ; | 613 | return div_u64((u64)x * HZ, USER_HZ); |
612 | do_div(jif, USER_HZ); | ||
613 | return jif; | ||
614 | #endif | 614 | #endif |
615 | } | 615 | } |
616 | EXPORT_SYMBOL(clock_t_to_jiffies); | 616 | EXPORT_SYMBOL(clock_t_to_jiffies); |
@@ -619,10 +619,9 @@ u64 jiffies_64_to_clock_t(u64 x) | |||
619 | { | 619 | { |
620 | #if (TICK_NSEC % (NSEC_PER_SEC / USER_HZ)) == 0 | 620 | #if (TICK_NSEC % (NSEC_PER_SEC / USER_HZ)) == 0 |
621 | # if HZ < USER_HZ | 621 | # if HZ < USER_HZ |
622 | x *= USER_HZ; | 622 | x = div_u64(x * USER_HZ, HZ); |
623 | do_div(x, HZ); | ||
624 | # elif HZ > USER_HZ | 623 | # elif HZ > USER_HZ |
625 | do_div(x, HZ / USER_HZ); | 624 | x = div_u64(x, HZ / USER_HZ); |
626 | # else | 625 | # else |
627 | /* Nothing to do */ | 626 | /* Nothing to do */ |
628 | # endif | 627 | # endif |
@@ -632,8 +631,7 @@ u64 jiffies_64_to_clock_t(u64 x) | |||
632 | * but even this doesn't overflow in hundreds of years | 631 | * but even this doesn't overflow in hundreds of years |
633 | * in 64 bits, so.. | 632 | * in 64 bits, so.. |
634 | */ | 633 | */ |
635 | x *= TICK_NSEC; | 634 | x = div_u64(x * TICK_NSEC, (NSEC_PER_SEC / USER_HZ)); |
636 | do_div(x, (NSEC_PER_SEC / USER_HZ)); | ||
637 | #endif | 635 | #endif |
638 | return x; | 636 | return x; |
639 | } | 637 | } |
@@ -642,21 +640,17 @@ EXPORT_SYMBOL(jiffies_64_to_clock_t); | |||
642 | u64 nsec_to_clock_t(u64 x) | 640 | u64 nsec_to_clock_t(u64 x) |
643 | { | 641 | { |
644 | #if (NSEC_PER_SEC % USER_HZ) == 0 | 642 | #if (NSEC_PER_SEC % USER_HZ) == 0 |
645 | do_div(x, (NSEC_PER_SEC / USER_HZ)); | 643 | return div_u64(x, NSEC_PER_SEC / USER_HZ); |
646 | #elif (USER_HZ % 512) == 0 | 644 | #elif (USER_HZ % 512) == 0 |
647 | x *= USER_HZ/512; | 645 | return div_u64(x * USER_HZ / 512, NSEC_PER_SEC / 512); |
648 | do_div(x, (NSEC_PER_SEC / 512)); | ||
649 | #else | 646 | #else |
650 | /* | 647 | /* |
651 | * 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, |
652 | * overflow after 64.99 years. | 649 | * overflow after 64.99 years. |
653 | * 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, ... |
654 | */ | 651 | */ |
655 | x *= 9; | 652 | return div_u64(x * 9, (9ull * NSEC_PER_SEC + (USER_HZ / 2)) / USER_HZ); |
656 | do_div(x, (unsigned long)((9ull * NSEC_PER_SEC + (USER_HZ/2)) / | ||
657 | USER_HZ)); | ||
658 | #endif | 653 | #endif |
659 | return x; | ||
660 | } | 654 | } |
661 | 655 | ||
662 | #if (BITS_PER_LONG < 64) | 656 | #if (BITS_PER_LONG < 64) |