diff options
Diffstat (limited to 'kernel/time.c')
| -rw-r--r-- | kernel/time.c | 254 |
1 files changed, 254 insertions, 0 deletions
diff --git a/kernel/time.c b/kernel/time.c index 0e017bff4c19..c6c80ea5d0ea 100644 --- a/kernel/time.c +++ b/kernel/time.c | |||
| @@ -470,6 +470,260 @@ struct timeval ns_to_timeval(const s64 nsec) | |||
| 470 | return tv; | 470 | return tv; |
| 471 | } | 471 | } |
| 472 | 472 | ||
| 473 | /* | ||
| 474 | * Convert jiffies to milliseconds and back. | ||
| 475 | * | ||
| 476 | * Avoid unnecessary multiplications/divisions in the | ||
| 477 | * two most common HZ cases: | ||
| 478 | */ | ||
| 479 | unsigned int jiffies_to_msecs(const unsigned long j) | ||
| 480 | { | ||
| 481 | #if HZ <= MSEC_PER_SEC && !(MSEC_PER_SEC % HZ) | ||
| 482 | return (MSEC_PER_SEC / HZ) * j; | ||
| 483 | #elif HZ > MSEC_PER_SEC && !(HZ % MSEC_PER_SEC) | ||
| 484 | return (j + (HZ / MSEC_PER_SEC) - 1)/(HZ / MSEC_PER_SEC); | ||
| 485 | #else | ||
| 486 | return (j * MSEC_PER_SEC) / HZ; | ||
| 487 | #endif | ||
| 488 | } | ||
| 489 | EXPORT_SYMBOL(jiffies_to_msecs); | ||
| 490 | |||
| 491 | unsigned int jiffies_to_usecs(const unsigned long j) | ||
| 492 | { | ||
| 493 | #if HZ <= USEC_PER_SEC && !(USEC_PER_SEC % HZ) | ||
| 494 | return (USEC_PER_SEC / HZ) * j; | ||
| 495 | #elif HZ > USEC_PER_SEC && !(HZ % USEC_PER_SEC) | ||
| 496 | return (j + (HZ / USEC_PER_SEC) - 1)/(HZ / USEC_PER_SEC); | ||
| 497 | #else | ||
| 498 | return (j * USEC_PER_SEC) / HZ; | ||
| 499 | #endif | ||
| 500 | } | ||
| 501 | EXPORT_SYMBOL(jiffies_to_usecs); | ||
| 502 | |||
| 503 | /* | ||
| 504 | * When we convert to jiffies then we interpret incoming values | ||
| 505 | * the following way: | ||
| 506 | * | ||
| 507 | * - negative values mean 'infinite timeout' (MAX_JIFFY_OFFSET) | ||
| 508 | * | ||
| 509 | * - 'too large' values [that would result in larger than | ||
| 510 | * MAX_JIFFY_OFFSET values] mean 'infinite timeout' too. | ||
| 511 | * | ||
| 512 | * - all other values are converted to jiffies by either multiplying | ||
| 513 | * the input value by a factor or dividing it with a factor | ||
| 514 | * | ||
| 515 | * We must also be careful about 32-bit overflows. | ||
| 516 | */ | ||
| 517 | unsigned long msecs_to_jiffies(const unsigned int m) | ||
| 518 | { | ||
| 519 | /* | ||
| 520 | * Negative value, means infinite timeout: | ||
| 521 | */ | ||
| 522 | if ((int)m < 0) | ||
| 523 | return MAX_JIFFY_OFFSET; | ||
| 524 | |||
| 525 | #if HZ <= MSEC_PER_SEC && !(MSEC_PER_SEC % HZ) | ||
| 526 | /* | ||
| 527 | * HZ is equal to or smaller than 1000, and 1000 is a nice | ||
| 528 | * round multiple of HZ, divide with the factor between them, | ||
| 529 | * but round upwards: | ||
| 530 | */ | ||
| 531 | return (m + (MSEC_PER_SEC / HZ) - 1) / (MSEC_PER_SEC / HZ); | ||
| 532 | #elif HZ > MSEC_PER_SEC && !(HZ % MSEC_PER_SEC) | ||
| 533 | /* | ||
| 534 | * HZ is larger than 1000, and HZ is a nice round multiple of | ||
| 535 | * 1000 - simply multiply with the factor between them. | ||
| 536 | * | ||
| 537 | * But first make sure the multiplication result cannot | ||
| 538 | * overflow: | ||
| 539 | */ | ||
| 540 | if (m > jiffies_to_msecs(MAX_JIFFY_OFFSET)) | ||
| 541 | return MAX_JIFFY_OFFSET; | ||
| 542 | |||
| 543 | return m * (HZ / MSEC_PER_SEC); | ||
| 544 | #else | ||
| 545 | /* | ||
| 546 | * Generic case - multiply, round and divide. But first | ||
| 547 | * check that if we are doing a net multiplication, that | ||
| 548 | * we wouldnt overflow: | ||
| 549 | */ | ||
| 550 | if (HZ > MSEC_PER_SEC && m > jiffies_to_msecs(MAX_JIFFY_OFFSET)) | ||
| 551 | return MAX_JIFFY_OFFSET; | ||
| 552 | |||
| 553 | return (m * HZ + MSEC_PER_SEC - 1) / MSEC_PER_SEC; | ||
| 554 | #endif | ||
| 555 | } | ||
| 556 | EXPORT_SYMBOL(msecs_to_jiffies); | ||
| 557 | |||
| 558 | unsigned long usecs_to_jiffies(const unsigned int u) | ||
| 559 | { | ||
| 560 | if (u > jiffies_to_usecs(MAX_JIFFY_OFFSET)) | ||
| 561 | return MAX_JIFFY_OFFSET; | ||
| 562 | #if HZ <= USEC_PER_SEC && !(USEC_PER_SEC % HZ) | ||
| 563 | return (u + (USEC_PER_SEC / HZ) - 1) / (USEC_PER_SEC / HZ); | ||
| 564 | #elif HZ > USEC_PER_SEC && !(HZ % USEC_PER_SEC) | ||
| 565 | return u * (HZ / USEC_PER_SEC); | ||
| 566 | #else | ||
| 567 | return (u * HZ + USEC_PER_SEC - 1) / USEC_PER_SEC; | ||
| 568 | #endif | ||
| 569 | } | ||
| 570 | EXPORT_SYMBOL(usecs_to_jiffies); | ||
| 571 | |||
| 572 | /* | ||
| 573 | * The TICK_NSEC - 1 rounds up the value to the next resolution. Note | ||
| 574 | * that a remainder subtract here would not do the right thing as the | ||
| 575 | * resolution values don't fall on second boundries. I.e. the line: | ||
| 576 | * nsec -= nsec % TICK_NSEC; is NOT a correct resolution rounding. | ||
| 577 | * | ||
| 578 | * Rather, we just shift the bits off the right. | ||
| 579 | * | ||
| 580 | * The >> (NSEC_JIFFIE_SC - SEC_JIFFIE_SC) converts the scaled nsec | ||
| 581 | * value to a scaled second value. | ||
| 582 | */ | ||
| 583 | unsigned long | ||
| 584 | timespec_to_jiffies(const struct timespec *value) | ||
| 585 | { | ||
| 586 | unsigned long sec = value->tv_sec; | ||
| 587 | long nsec = value->tv_nsec + TICK_NSEC - 1; | ||
| 588 | |||
| 589 | if (sec >= MAX_SEC_IN_JIFFIES){ | ||
| 590 | sec = MAX_SEC_IN_JIFFIES; | ||
| 591 | nsec = 0; | ||
| 592 | } | ||
| 593 | return (((u64)sec * SEC_CONVERSION) + | ||
| 594 | (((u64)nsec * NSEC_CONVERSION) >> | ||
| 595 | (NSEC_JIFFIE_SC - SEC_JIFFIE_SC))) >> SEC_JIFFIE_SC; | ||
| 596 | |||
| 597 | } | ||
| 598 | EXPORT_SYMBOL(timespec_to_jiffies); | ||
| 599 | |||
| 600 | void | ||
| 601 | jiffies_to_timespec(const unsigned long jiffies, struct timespec *value) | ||
| 602 | { | ||
| 603 | /* | ||
| 604 | * Convert jiffies to nanoseconds and separate with | ||
| 605 | * one divide. | ||
| 606 | */ | ||
| 607 | u64 nsec = (u64)jiffies * TICK_NSEC; | ||
| 608 | value->tv_sec = div_long_long_rem(nsec, NSEC_PER_SEC, &value->tv_nsec); | ||
| 609 | } | ||
| 610 | EXPORT_SYMBOL(jiffies_to_timespec); | ||
| 611 | |||
| 612 | /* Same for "timeval" | ||
| 613 | * | ||
| 614 | * Well, almost. The problem here is that the real system resolution is | ||
| 615 | * in nanoseconds and the value being converted is in micro seconds. | ||
| 616 | * Also for some machines (those that use HZ = 1024, in-particular), | ||
| 617 | * there is a LARGE error in the tick size in microseconds. | ||
| 618 | |||
| 619 | * The solution we use is to do the rounding AFTER we convert the | ||
| 620 | * microsecond part. Thus the USEC_ROUND, the bits to be shifted off. | ||
| 621 | * Instruction wise, this should cost only an additional add with carry | ||
| 622 | * instruction above the way it was done above. | ||
| 623 | */ | ||
| 624 | unsigned long | ||
| 625 | timeval_to_jiffies(const struct timeval *value) | ||
| 626 | { | ||
| 627 | unsigned long sec = value->tv_sec; | ||
| 628 | long usec = value->tv_usec; | ||
| 629 | |||
| 630 | if (sec >= MAX_SEC_IN_JIFFIES){ | ||
| 631 | sec = MAX_SEC_IN_JIFFIES; | ||
| 632 | usec = 0; | ||
| 633 | } | ||
| 634 | return (((u64)sec * SEC_CONVERSION) + | ||
| 635 | (((u64)usec * USEC_CONVERSION + USEC_ROUND) >> | ||
| 636 | (USEC_JIFFIE_SC - SEC_JIFFIE_SC))) >> SEC_JIFFIE_SC; | ||
| 637 | } | ||
| 638 | |||
| 639 | void jiffies_to_timeval(const unsigned long jiffies, struct timeval *value) | ||
| 640 | { | ||
| 641 | /* | ||
| 642 | * Convert jiffies to nanoseconds and separate with | ||
| 643 | * one divide. | ||
| 644 | */ | ||
| 645 | u64 nsec = (u64)jiffies * TICK_NSEC; | ||
| 646 | long tv_usec; | ||
| 647 | |||
| 648 | value->tv_sec = div_long_long_rem(nsec, NSEC_PER_SEC, &tv_usec); | ||
| 649 | tv_usec /= NSEC_PER_USEC; | ||
| 650 | value->tv_usec = tv_usec; | ||
| 651 | } | ||
| 652 | |||
| 653 | /* | ||
| 654 | * Convert jiffies/jiffies_64 to clock_t and back. | ||
| 655 | */ | ||
| 656 | clock_t jiffies_to_clock_t(long x) | ||
| 657 | { | ||
| 658 | #if (TICK_NSEC % (NSEC_PER_SEC / USER_HZ)) == 0 | ||
| 659 | return x / (HZ / USER_HZ); | ||
| 660 | #else | ||
| 661 | u64 tmp = (u64)x * TICK_NSEC; | ||
| 662 | do_div(tmp, (NSEC_PER_SEC / USER_HZ)); | ||
| 663 | return (long)tmp; | ||
| 664 | #endif | ||
| 665 | } | ||
| 666 | EXPORT_SYMBOL(jiffies_to_clock_t); | ||
| 667 | |||
| 668 | unsigned long clock_t_to_jiffies(unsigned long x) | ||
| 669 | { | ||
| 670 | #if (HZ % USER_HZ)==0 | ||
| 671 | if (x >= ~0UL / (HZ / USER_HZ)) | ||
| 672 | return ~0UL; | ||
| 673 | return x * (HZ / USER_HZ); | ||
| 674 | #else | ||
| 675 | u64 jif; | ||
| 676 | |||
| 677 | /* Don't worry about loss of precision here .. */ | ||
| 678 | if (x >= ~0UL / HZ * USER_HZ) | ||
| 679 | return ~0UL; | ||
| 680 | |||
| 681 | /* .. but do try to contain it here */ | ||
| 682 | jif = x * (u64) HZ; | ||
| 683 | do_div(jif, USER_HZ); | ||
| 684 | return jif; | ||
| 685 | #endif | ||
| 686 | } | ||
| 687 | EXPORT_SYMBOL(clock_t_to_jiffies); | ||
| 688 | |||
| 689 | u64 jiffies_64_to_clock_t(u64 x) | ||
| 690 | { | ||
| 691 | #if (TICK_NSEC % (NSEC_PER_SEC / USER_HZ)) == 0 | ||
| 692 | do_div(x, HZ / USER_HZ); | ||
| 693 | #else | ||
| 694 | /* | ||
| 695 | * There are better ways that don't overflow early, | ||
| 696 | * but even this doesn't overflow in hundreds of years | ||
| 697 | * in 64 bits, so.. | ||
| 698 | */ | ||
| 699 | x *= TICK_NSEC; | ||
| 700 | do_div(x, (NSEC_PER_SEC / USER_HZ)); | ||
| 701 | #endif | ||
| 702 | return x; | ||
| 703 | } | ||
| 704 | |||
| 705 | EXPORT_SYMBOL(jiffies_64_to_clock_t); | ||
| 706 | |||
| 707 | u64 nsec_to_clock_t(u64 x) | ||
| 708 | { | ||
| 709 | #if (NSEC_PER_SEC % USER_HZ) == 0 | ||
| 710 | do_div(x, (NSEC_PER_SEC / USER_HZ)); | ||
| 711 | #elif (USER_HZ % 512) == 0 | ||
| 712 | x *= USER_HZ/512; | ||
| 713 | do_div(x, (NSEC_PER_SEC / 512)); | ||
| 714 | #else | ||
| 715 | /* | ||
| 716 | * max relative error 5.7e-8 (1.8s per year) for USER_HZ <= 1024, | ||
| 717 | * overflow after 64.99 years. | ||
| 718 | * exact for HZ=60, 72, 90, 120, 144, 180, 300, 600, 900, ... | ||
| 719 | */ | ||
| 720 | x *= 9; | ||
| 721 | do_div(x, (unsigned long)((9ull * NSEC_PER_SEC + (USER_HZ/2)) / | ||
| 722 | USER_HZ)); | ||
| 723 | #endif | ||
| 724 | return x; | ||
| 725 | } | ||
| 726 | |||
| 473 | #if (BITS_PER_LONG < 64) | 727 | #if (BITS_PER_LONG < 64) |
| 474 | u64 get_jiffies_64(void) | 728 | u64 get_jiffies_64(void) |
| 475 | { | 729 | { |
