diff options
| author | Paul Mackerras <paulus@samba.org> | 2008-05-09 06:12:06 -0400 |
|---|---|---|
| committer | Paul Mackerras <paulus@samba.org> | 2008-05-09 06:12:06 -0400 |
| commit | 2a5f2e3e6cd1ce9fb3f8b186b6bc9aa1f1497a92 (patch) | |
| tree | b2306840f227972a7c9d4a2b75e516fe81358ce8 /kernel/time.c | |
| parent | 02539d71fa98d5737bb668b02286c76241e4bac9 (diff) | |
| parent | 78be76476a34a77f0ea9db2f78ba46a2b0fd5ab5 (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.c | 63 |
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); | |||
| 390 | struct timespec ns_to_timespec(const s64 nsec) | 392 | struct 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 | } |
| 532 | EXPORT_SYMBOL(jiffies_to_timespec); | 540 | EXPORT_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 | } |
| 575 | EXPORT_SYMBOL(jiffies_to_timeval); | 582 | EXPORT_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 | } |
| 594 | EXPORT_SYMBOL(jiffies_to_clock_t); | 599 | EXPORT_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 | } |
| 615 | EXPORT_SYMBOL(clock_t_to_jiffies); | 616 | EXPORT_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); | |||
| 641 | u64 nsec_to_clock_t(u64 x) | 640 | u64 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) |
