diff options
Diffstat (limited to 'kernel/time/clocksource.c')
| -rw-r--r-- | kernel/time/clocksource.c | 52 |
1 files changed, 34 insertions, 18 deletions
diff --git a/kernel/time/clocksource.c b/kernel/time/clocksource.c index 50a8736757f3..ba3e502c955a 100644 --- a/kernel/time/clocksource.c +++ b/kernel/time/clocksource.c | |||
| @@ -479,6 +479,7 @@ static inline void clocksource_dequeue_watchdog(struct clocksource *cs) { } | |||
| 479 | static inline void clocksource_resume_watchdog(void) { } | 479 | static inline void clocksource_resume_watchdog(void) { } |
| 480 | static inline int __clocksource_watchdog_kthread(void) { return 0; } | 480 | static inline int __clocksource_watchdog_kthread(void) { return 0; } |
| 481 | static bool clocksource_is_watchdog(struct clocksource *cs) { return false; } | 481 | static bool clocksource_is_watchdog(struct clocksource *cs) { return false; } |
| 482 | void clocksource_mark_unstable(struct clocksource *cs) { } | ||
| 482 | 483 | ||
| 483 | #endif /* CONFIG_CLOCKSOURCE_WATCHDOG */ | 484 | #endif /* CONFIG_CLOCKSOURCE_WATCHDOG */ |
| 484 | 485 | ||
| @@ -537,40 +538,55 @@ static u32 clocksource_max_adjustment(struct clocksource *cs) | |||
| 537 | } | 538 | } |
| 538 | 539 | ||
| 539 | /** | 540 | /** |
| 540 | * clocksource_max_deferment - Returns max time the clocksource can be deferred | 541 | * clocks_calc_max_nsecs - Returns maximum nanoseconds that can be converted |
| 541 | * @cs: Pointer to clocksource | 542 | * @mult: cycle to nanosecond multiplier |
| 542 | * | 543 | * @shift: cycle to nanosecond divisor (power of two) |
| 544 | * @maxadj: maximum adjustment value to mult (~11%) | ||
| 545 | * @mask: bitmask for two's complement subtraction of non 64 bit counters | ||
| 543 | */ | 546 | */ |
| 544 | static u64 clocksource_max_deferment(struct clocksource *cs) | 547 | u64 clocks_calc_max_nsecs(u32 mult, u32 shift, u32 maxadj, u64 mask) |
| 545 | { | 548 | { |
| 546 | u64 max_nsecs, max_cycles; | 549 | u64 max_nsecs, max_cycles; |
| 547 | 550 | ||
| 548 | /* | 551 | /* |
| 549 | * Calculate the maximum number of cycles that we can pass to the | 552 | * Calculate the maximum number of cycles that we can pass to the |
| 550 | * cyc2ns function without overflowing a 64-bit signed result. The | 553 | * cyc2ns function without overflowing a 64-bit signed result. The |
| 551 | * maximum number of cycles is equal to ULLONG_MAX/(cs->mult+cs->maxadj) | 554 | * maximum number of cycles is equal to ULLONG_MAX/(mult+maxadj) |
| 552 | * which is equivalent to the below. | 555 | * which is equivalent to the below. |
| 553 | * max_cycles < (2^63)/(cs->mult + cs->maxadj) | 556 | * max_cycles < (2^63)/(mult + maxadj) |
| 554 | * max_cycles < 2^(log2((2^63)/(cs->mult + cs->maxadj))) | 557 | * max_cycles < 2^(log2((2^63)/(mult + maxadj))) |
| 555 | * max_cycles < 2^(log2(2^63) - log2(cs->mult + cs->maxadj)) | 558 | * max_cycles < 2^(log2(2^63) - log2(mult + maxadj)) |
| 556 | * max_cycles < 2^(63 - log2(cs->mult + cs->maxadj)) | 559 | * max_cycles < 2^(63 - log2(mult + maxadj)) |
| 557 | * max_cycles < 1 << (63 - log2(cs->mult + cs->maxadj)) | 560 | * max_cycles < 1 << (63 - log2(mult + maxadj)) |
| 558 | * Please note that we add 1 to the result of the log2 to account for | 561 | * Please note that we add 1 to the result of the log2 to account for |
| 559 | * any rounding errors, ensure the above inequality is satisfied and | 562 | * any rounding errors, ensure the above inequality is satisfied and |
| 560 | * no overflow will occur. | 563 | * no overflow will occur. |
| 561 | */ | 564 | */ |
| 562 | max_cycles = 1ULL << (63 - (ilog2(cs->mult + cs->maxadj) + 1)); | 565 | max_cycles = 1ULL << (63 - (ilog2(mult + maxadj) + 1)); |
| 563 | 566 | ||
| 564 | /* | 567 | /* |
| 565 | * The actual maximum number of cycles we can defer the clocksource is | 568 | * The actual maximum number of cycles we can defer the clocksource is |
| 566 | * determined by the minimum of max_cycles and cs->mask. | 569 | * determined by the minimum of max_cycles and mask. |
| 567 | * Note: Here we subtract the maxadj to make sure we don't sleep for | 570 | * Note: Here we subtract the maxadj to make sure we don't sleep for |
| 568 | * too long if there's a large negative adjustment. | 571 | * too long if there's a large negative adjustment. |
| 569 | */ | 572 | */ |
| 570 | max_cycles = min_t(u64, max_cycles, (u64) cs->mask); | 573 | max_cycles = min(max_cycles, mask); |
| 571 | max_nsecs = clocksource_cyc2ns(max_cycles, cs->mult - cs->maxadj, | 574 | max_nsecs = clocksource_cyc2ns(max_cycles, mult - maxadj, shift); |
| 572 | cs->shift); | 575 | |
| 576 | return max_nsecs; | ||
| 577 | } | ||
| 578 | |||
| 579 | /** | ||
| 580 | * clocksource_max_deferment - Returns max time the clocksource can be deferred | ||
| 581 | * @cs: Pointer to clocksource | ||
| 582 | * | ||
| 583 | */ | ||
| 584 | static u64 clocksource_max_deferment(struct clocksource *cs) | ||
| 585 | { | ||
| 586 | u64 max_nsecs; | ||
| 573 | 587 | ||
| 588 | max_nsecs = clocks_calc_max_nsecs(cs->mult, cs->shift, cs->maxadj, | ||
| 589 | cs->mask); | ||
| 574 | /* | 590 | /* |
| 575 | * To ensure that the clocksource does not wrap whilst we are idle, | 591 | * To ensure that the clocksource does not wrap whilst we are idle, |
| 576 | * limit the time the clocksource can be deferred by 12.5%. Please | 592 | * limit the time the clocksource can be deferred by 12.5%. Please |
| @@ -893,7 +909,7 @@ sysfs_show_current_clocksources(struct device *dev, | |||
| 893 | return count; | 909 | return count; |
| 894 | } | 910 | } |
| 895 | 911 | ||
| 896 | size_t sysfs_get_uname(const char *buf, char *dst, size_t cnt) | 912 | ssize_t sysfs_get_uname(const char *buf, char *dst, size_t cnt) |
| 897 | { | 913 | { |
| 898 | size_t ret = cnt; | 914 | size_t ret = cnt; |
| 899 | 915 | ||
| @@ -924,7 +940,7 @@ static ssize_t sysfs_override_clocksource(struct device *dev, | |||
| 924 | struct device_attribute *attr, | 940 | struct device_attribute *attr, |
| 925 | const char *buf, size_t count) | 941 | const char *buf, size_t count) |
| 926 | { | 942 | { |
| 927 | size_t ret; | 943 | ssize_t ret; |
| 928 | 944 | ||
| 929 | mutex_lock(&clocksource_mutex); | 945 | mutex_lock(&clocksource_mutex); |
| 930 | 946 | ||
| @@ -952,7 +968,7 @@ static ssize_t sysfs_unbind_clocksource(struct device *dev, | |||
| 952 | { | 968 | { |
| 953 | struct clocksource *cs; | 969 | struct clocksource *cs; |
| 954 | char name[CS_NAME_LEN]; | 970 | char name[CS_NAME_LEN]; |
| 955 | size_t ret; | 971 | ssize_t ret; |
| 956 | 972 | ||
| 957 | ret = sysfs_get_uname(buf, name, count); | 973 | ret = sysfs_get_uname(buf, name, count); |
| 958 | if (ret < 0) | 974 | if (ret < 0) |
