diff options
Diffstat (limited to 'kernel/timer.c')
| -rw-r--r-- | kernel/timer.c | 211 |
1 files changed, 1 insertions, 210 deletions
diff --git a/kernel/timer.c b/kernel/timer.c index 4f55622b0d3..5fccc7cbf3b 100644 --- a/kernel/timer.c +++ b/kernel/timer.c | |||
| @@ -41,12 +41,6 @@ | |||
| 41 | #include <asm/timex.h> | 41 | #include <asm/timex.h> |
| 42 | #include <asm/io.h> | 42 | #include <asm/io.h> |
| 43 | 43 | ||
| 44 | #ifdef CONFIG_TIME_INTERPOLATION | ||
| 45 | static void time_interpolator_update(long delta_nsec); | ||
| 46 | #else | ||
| 47 | #define time_interpolator_update(x) | ||
| 48 | #endif | ||
| 49 | |||
| 50 | u64 jiffies_64 __cacheline_aligned_in_smp = INITIAL_JIFFIES; | 44 | u64 jiffies_64 __cacheline_aligned_in_smp = INITIAL_JIFFIES; |
| 51 | 45 | ||
| 52 | EXPORT_SYMBOL(jiffies_64); | 46 | EXPORT_SYMBOL(jiffies_64); |
| @@ -587,209 +581,6 @@ struct timespec wall_to_monotonic __attribute__ ((aligned (16))); | |||
| 587 | 581 | ||
| 588 | EXPORT_SYMBOL(xtime); | 582 | EXPORT_SYMBOL(xtime); |
| 589 | 583 | ||
| 590 | /* Don't completely fail for HZ > 500. */ | ||
| 591 | int tickadj = 500/HZ ? : 1; /* microsecs */ | ||
| 592 | |||
| 593 | |||
| 594 | /* | ||
| 595 | * phase-lock loop variables | ||
| 596 | */ | ||
| 597 | /* TIME_ERROR prevents overwriting the CMOS clock */ | ||
| 598 | int time_state = TIME_OK; /* clock synchronization status */ | ||
| 599 | int time_status = STA_UNSYNC; /* clock status bits */ | ||
| 600 | long time_offset; /* time adjustment (us) */ | ||
| 601 | long time_constant = 2; /* pll time constant */ | ||
| 602 | long time_tolerance = MAXFREQ; /* frequency tolerance (ppm) */ | ||
| 603 | long time_precision = 1; /* clock precision (us) */ | ||
| 604 | long time_maxerror = NTP_PHASE_LIMIT; /* maximum error (us) */ | ||
| 605 | long time_esterror = NTP_PHASE_LIMIT; /* estimated error (us) */ | ||
| 606 | long time_freq = (((NSEC_PER_SEC + HZ/2) % HZ - HZ/2) << SHIFT_USEC) / NSEC_PER_USEC; | ||
| 607 | /* frequency offset (scaled ppm)*/ | ||
| 608 | static long time_adj; /* tick adjust (scaled 1 / HZ) */ | ||
| 609 | long time_reftime; /* time at last adjustment (s) */ | ||
| 610 | long time_adjust; | ||
| 611 | long time_next_adjust; | ||
| 612 | |||
| 613 | /* | ||
| 614 | * this routine handles the overflow of the microsecond field | ||
| 615 | * | ||
| 616 | * The tricky bits of code to handle the accurate clock support | ||
| 617 | * were provided by Dave Mills (Mills@UDEL.EDU) of NTP fame. | ||
| 618 | * They were originally developed for SUN and DEC kernels. | ||
| 619 | * All the kudos should go to Dave for this stuff. | ||
| 620 | * | ||
| 621 | */ | ||
| 622 | static void second_overflow(void) | ||
| 623 | { | ||
| 624 | long ltemp; | ||
| 625 | |||
| 626 | /* Bump the maxerror field */ | ||
| 627 | time_maxerror += time_tolerance >> SHIFT_USEC; | ||
| 628 | if (time_maxerror > NTP_PHASE_LIMIT) { | ||
| 629 | time_maxerror = NTP_PHASE_LIMIT; | ||
| 630 | time_status |= STA_UNSYNC; | ||
| 631 | } | ||
| 632 | |||
| 633 | /* | ||
| 634 | * Leap second processing. If in leap-insert state at the end of the | ||
| 635 | * day, the system clock is set back one second; if in leap-delete | ||
| 636 | * state, the system clock is set ahead one second. The microtime() | ||
| 637 | * routine or external clock driver will insure that reported time is | ||
| 638 | * always monotonic. The ugly divides should be replaced. | ||
| 639 | */ | ||
| 640 | switch (time_state) { | ||
| 641 | case TIME_OK: | ||
| 642 | if (time_status & STA_INS) | ||
| 643 | time_state = TIME_INS; | ||
| 644 | else if (time_status & STA_DEL) | ||
| 645 | time_state = TIME_DEL; | ||
| 646 | break; | ||
| 647 | case TIME_INS: | ||
| 648 | if (xtime.tv_sec % 86400 == 0) { | ||
| 649 | xtime.tv_sec--; | ||
| 650 | wall_to_monotonic.tv_sec++; | ||
| 651 | /* | ||
| 652 | * The timer interpolator will make time change | ||
| 653 | * gradually instead of an immediate jump by one second | ||
| 654 | */ | ||
| 655 | time_interpolator_update(-NSEC_PER_SEC); | ||
| 656 | time_state = TIME_OOP; | ||
| 657 | clock_was_set(); | ||
| 658 | printk(KERN_NOTICE "Clock: inserting leap second " | ||
| 659 | "23:59:60 UTC\n"); | ||
| 660 | } | ||
| 661 | break; | ||
| 662 | case TIME_DEL: | ||
| 663 | if ((xtime.tv_sec + 1) % 86400 == 0) { | ||
| 664 | xtime.tv_sec++; | ||
| 665 | wall_to_monotonic.tv_sec--; | ||
| 666 | /* | ||
| 667 | * Use of time interpolator for a gradual change of | ||
| 668 | * time | ||
| 669 | */ | ||
| 670 | time_interpolator_update(NSEC_PER_SEC); | ||
| 671 | time_state = TIME_WAIT; | ||
| 672 | clock_was_set(); | ||
| 673 | printk(KERN_NOTICE "Clock: deleting leap second " | ||
| 674 | "23:59:59 UTC\n"); | ||
| 675 | } | ||
| 676 | break; | ||
| 677 | case TIME_OOP: | ||
| 678 | time_state = TIME_WAIT; | ||
| 679 | break; | ||
| 680 | case TIME_WAIT: | ||
| 681 | if (!(time_status & (STA_INS | STA_DEL))) | ||
| 682 | time_state = TIME_OK; | ||
| 683 | } | ||
| 684 | |||
| 685 | /* | ||
| 686 | * Compute the phase adjustment for the next second. In PLL mode, the | ||
| 687 | * offset is reduced by a fixed factor times the time constant. In FLL | ||
| 688 | * mode the offset is used directly. In either mode, the maximum phase | ||
| 689 | * adjustment for each second is clamped so as to spread the adjustment | ||
| 690 | * over not more than the number of seconds between updates. | ||
| 691 | */ | ||
| 692 | ltemp = time_offset; | ||
| 693 | if (!(time_status & STA_FLL)) | ||
| 694 | ltemp = shift_right(ltemp, SHIFT_KG + time_constant); | ||
| 695 | ltemp = min(ltemp, (MAXPHASE / MINSEC) << SHIFT_UPDATE); | ||
| 696 | ltemp = max(ltemp, -(MAXPHASE / MINSEC) << SHIFT_UPDATE); | ||
| 697 | time_offset -= ltemp; | ||
| 698 | time_adj = ltemp << (SHIFT_SCALE - SHIFT_HZ - SHIFT_UPDATE); | ||
| 699 | |||
| 700 | /* | ||
| 701 | * Compute the frequency estimate and additional phase adjustment due | ||
| 702 | * to frequency error for the next second. | ||
| 703 | */ | ||
| 704 | ltemp = time_freq; | ||
| 705 | time_adj += shift_right(ltemp,(SHIFT_USEC + SHIFT_HZ - SHIFT_SCALE)); | ||
| 706 | |||
| 707 | #if HZ == 100 | ||
| 708 | /* | ||
| 709 | * Compensate for (HZ==100) != (1 << SHIFT_HZ). Add 25% and 3.125% to | ||
| 710 | * get 128.125; => only 0.125% error (p. 14) | ||
| 711 | */ | ||
| 712 | time_adj += shift_right(time_adj, 2) + shift_right(time_adj, 5); | ||
| 713 | #endif | ||
| 714 | #if HZ == 250 | ||
| 715 | /* | ||
| 716 | * Compensate for (HZ==250) != (1 << SHIFT_HZ). Add 1.5625% and | ||
| 717 | * 0.78125% to get 255.85938; => only 0.05% error (p. 14) | ||
| 718 | */ | ||
| 719 | time_adj += shift_right(time_adj, 6) + shift_right(time_adj, 7); | ||
| 720 | #endif | ||
| 721 | #if HZ == 1000 | ||
| 722 | /* | ||
| 723 | * Compensate for (HZ==1000) != (1 << SHIFT_HZ). Add 1.5625% and | ||
| 724 | * 0.78125% to get 1023.4375; => only 0.05% error (p. 14) | ||
| 725 | */ | ||
| 726 | time_adj += shift_right(time_adj, 6) + shift_right(time_adj, 7); | ||
| 727 | #endif | ||
| 728 | } | ||
| 729 | |||
| 730 | /* | ||
| 731 | * Returns how many microseconds we need to add to xtime this tick | ||
| 732 | * in doing an adjustment requested with adjtime. | ||
| 733 | */ | ||
| 734 | static long adjtime_adjustment(void) | ||
| 735 | { | ||
| 736 | long time_adjust_step; | ||
| 737 | |||
| 738 | time_adjust_step = time_adjust; | ||
| 739 | if (time_adjust_step) { | ||
| 740 | /* | ||
| 741 | * We are doing an adjtime thing. Prepare time_adjust_step to | ||
| 742 | * be within bounds. Note that a positive time_adjust means we | ||
| 743 | * want the clock to run faster. | ||
| 744 | * | ||
| 745 | * Limit the amount of the step to be in the range | ||
| 746 | * -tickadj .. +tickadj | ||
| 747 | */ | ||
| 748 | time_adjust_step = min(time_adjust_step, (long)tickadj); | ||
| 749 | time_adjust_step = max(time_adjust_step, (long)-tickadj); | ||
| 750 | } | ||
| 751 | return time_adjust_step; | ||
| 752 | } | ||
| 753 | |||
| 754 | /* in the NTP reference this is called "hardclock()" */ | ||
| 755 | static void update_ntp_one_tick(void) | ||
| 756 | { | ||
| 757 | long time_adjust_step; | ||
| 758 | |||
| 759 | time_adjust_step = adjtime_adjustment(); | ||
| 760 | if (time_adjust_step) | ||
| 761 | /* Reduce by this step the amount of time left */ | ||
| 762 | time_adjust -= time_adjust_step; | ||
| 763 | |||
| 764 | /* Changes by adjtime() do not take effect till next tick. */ | ||
| 765 | if (time_next_adjust != 0) { | ||
| 766 | time_adjust = time_next_adjust; | ||
| 767 | time_next_adjust = 0; | ||
| 768 | } | ||
| 769 | } | ||
| 770 | |||
| 771 | /* | ||
| 772 | * Return how long ticks are at the moment, that is, how much time | ||
| 773 | * update_wall_time_one_tick will add to xtime next time we call it | ||
| 774 | * (assuming no calls to do_adjtimex in the meantime). | ||
| 775 | * The return value is in fixed-point nanoseconds shifted by the | ||
| 776 | * specified number of bits to the right of the binary point. | ||
| 777 | * This function has no side-effects. | ||
| 778 | */ | ||
| 779 | u64 current_tick_length(void) | ||
| 780 | { | ||
| 781 | long delta_nsec; | ||
| 782 | u64 ret; | ||
| 783 | |||
| 784 | /* calculate the finest interval NTP will allow. | ||
| 785 | * ie: nanosecond value shifted by (SHIFT_SCALE - 10) | ||
| 786 | */ | ||
| 787 | delta_nsec = tick_nsec + adjtime_adjustment() * 1000; | ||
| 788 | ret = (u64)delta_nsec << TICK_LENGTH_SHIFT; | ||
| 789 | ret += (s64)time_adj << (TICK_LENGTH_SHIFT - (SHIFT_SCALE - 10)); | ||
| 790 | |||
| 791 | return ret; | ||
| 792 | } | ||
| 793 | 584 | ||
| 794 | /* XXX - all of this timekeeping code should be later moved to time.c */ | 585 | /* XXX - all of this timekeeping code should be later moved to time.c */ |
| 795 | #include <linux/clocksource.h> | 586 | #include <linux/clocksource.h> |
| @@ -1775,7 +1566,7 @@ unsigned long time_interpolator_get_offset(void) | |||
| 1775 | #define INTERPOLATOR_ADJUST 65536 | 1566 | #define INTERPOLATOR_ADJUST 65536 |
| 1776 | #define INTERPOLATOR_MAX_SKIP 10*INTERPOLATOR_ADJUST | 1567 | #define INTERPOLATOR_MAX_SKIP 10*INTERPOLATOR_ADJUST |
| 1777 | 1568 | ||
| 1778 | static void time_interpolator_update(long delta_nsec) | 1569 | void time_interpolator_update(long delta_nsec) |
| 1779 | { | 1570 | { |
| 1780 | u64 counter; | 1571 | u64 counter; |
| 1781 | unsigned long offset; | 1572 | unsigned long offset; |
