|
@@ -66,7 +66,6 @@
|
|
|
*/
|
|
|
DEFINE_PER_CPU(struct hrtimer_cpu_base, hrtimer_bases) =
|
|
|
{
|
|
|
-
|
|
|
.lock = __RAW_SPIN_LOCK_UNLOCKED(hrtimer_bases.lock),
|
|
|
.clock_base =
|
|
|
{
|
|
@@ -74,25 +73,21 @@ DEFINE_PER_CPU(struct hrtimer_cpu_base, hrtimer_bases) =
|
|
|
.index = HRTIMER_BASE_MONOTONIC,
|
|
|
.clockid = CLOCK_MONOTONIC,
|
|
|
.get_time = &ktime_get,
|
|
|
- .resolution = KTIME_LOW_RES,
|
|
|
},
|
|
|
{
|
|
|
.index = HRTIMER_BASE_REALTIME,
|
|
|
.clockid = CLOCK_REALTIME,
|
|
|
.get_time = &ktime_get_real,
|
|
|
- .resolution = KTIME_LOW_RES,
|
|
|
},
|
|
|
{
|
|
|
.index = HRTIMER_BASE_BOOTTIME,
|
|
|
.clockid = CLOCK_BOOTTIME,
|
|
|
.get_time = &ktime_get_boottime,
|
|
|
- .resolution = KTIME_LOW_RES,
|
|
|
},
|
|
|
{
|
|
|
.index = HRTIMER_BASE_TAI,
|
|
|
.clockid = CLOCK_TAI,
|
|
|
.get_time = &ktime_get_clocktai,
|
|
|
- .resolution = KTIME_LOW_RES,
|
|
|
},
|
|
|
}
|
|
|
};
|
|
@@ -478,6 +473,8 @@ static ktime_t __hrtimer_get_next_event(struct hrtimer_cpu_base *cpu_base)
|
|
|
* High resolution timer enabled ?
|
|
|
*/
|
|
|
static int hrtimer_hres_enabled __read_mostly = 1;
|
|
|
+unsigned int hrtimer_resolution __read_mostly = LOW_RES_NSEC;
|
|
|
+EXPORT_SYMBOL_GPL(hrtimer_resolution);
|
|
|
|
|
|
/*
|
|
|
* Enable / Disable high resolution mode
|
|
@@ -660,7 +657,7 @@ static void retrigger_next_event(void *arg)
|
|
|
*/
|
|
|
static int hrtimer_switch_to_hres(void)
|
|
|
{
|
|
|
- int i, cpu = smp_processor_id();
|
|
|
+ int cpu = smp_processor_id();
|
|
|
struct hrtimer_cpu_base *base = &per_cpu(hrtimer_bases, cpu);
|
|
|
unsigned long flags;
|
|
|
|
|
@@ -676,8 +673,7 @@ static int hrtimer_switch_to_hres(void)
|
|
|
return 0;
|
|
|
}
|
|
|
base->hres_active = 1;
|
|
|
- for (i = 0; i < HRTIMER_MAX_CLOCK_BASES; i++)
|
|
|
- base->clock_base[i].resolution = KTIME_HIGH_RES;
|
|
|
+ hrtimer_resolution = HIGH_RES_NSEC;
|
|
|
|
|
|
tick_setup_sched_timer();
|
|
|
/* "Retrigger" the interrupt to get things going */
|
|
@@ -820,8 +816,8 @@ u64 hrtimer_forward(struct hrtimer *timer, ktime_t now, ktime_t interval)
|
|
|
if (delta.tv64 < 0)
|
|
|
return 0;
|
|
|
|
|
|
- if (interval.tv64 < timer->base->resolution.tv64)
|
|
|
- interval.tv64 = timer->base->resolution.tv64;
|
|
|
+ if (interval.tv64 < hrtimer_resolution)
|
|
|
+ interval.tv64 = hrtimer_resolution;
|
|
|
|
|
|
if (unlikely(delta.tv64 >= interval.tv64)) {
|
|
|
s64 incr = ktime_to_ns(interval);
|
|
@@ -963,7 +959,7 @@ int __hrtimer_start_range_ns(struct hrtimer *timer, ktime_t tim,
|
|
|
* timeouts. This will go away with the GTOD framework.
|
|
|
*/
|
|
|
#ifdef CONFIG_TIME_LOW_RES
|
|
|
- tim = ktime_add_safe(tim, base->resolution);
|
|
|
+ tim = ktime_add_safe(tim, ktime_set(0, hrtimer_resolution));
|
|
|
#endif
|
|
|
}
|
|
|
|
|
@@ -1193,12 +1189,8 @@ EXPORT_SYMBOL_GPL(hrtimer_init);
|
|
|
*/
|
|
|
int hrtimer_get_res(const clockid_t which_clock, struct timespec *tp)
|
|
|
{
|
|
|
- struct hrtimer_cpu_base *cpu_base;
|
|
|
- int base = hrtimer_clockid_to_base(which_clock);
|
|
|
-
|
|
|
- cpu_base = raw_cpu_ptr(&hrtimer_bases);
|
|
|
- *tp = ktime_to_timespec(cpu_base->clock_base[base].resolution);
|
|
|
-
|
|
|
+ tp->tv_sec = 0;
|
|
|
+ tp->tv_nsec = hrtimer_resolution;
|
|
|
return 0;
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(hrtimer_get_res);
|