Commit 8adbf78e authored by Martin Schwidefsky's avatar Martin Schwidefsky

s390,time: revert direct ktime path for s390 clockevent device

Git commit 4f37a68c
"s390: Use direct ktime path for s390 clockevent device" makes use
of the CLOCK_EVT_FEAT_KTIME clockevent option to avoid the delta
calculation with ktime_get() in clockevents_program_event and the
get_tod_clock() in s390_next_event. This is based on the assumption
that the difference between the internal ktime and the hardware
clock is reflected in the wall_to_monotonic delta. But this is not
true, the ntp corrections are applied via changes to the tk->mult
multiplier and this is not reflected in wall_to_monotonic.

In theory this could be solved by using the raw monotonic clock
but it is simpler to switch back to the standard clock delta
calculation.
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent 79c74ecb
...@@ -108,20 +108,10 @@ static void fixup_clock_comparator(unsigned long long delta) ...@@ -108,20 +108,10 @@ static void fixup_clock_comparator(unsigned long long delta)
set_clock_comparator(S390_lowcore.clock_comparator); set_clock_comparator(S390_lowcore.clock_comparator);
} }
static int s390_next_ktime(ktime_t expires, static int s390_next_event(unsigned long delta,
struct clock_event_device *evt) struct clock_event_device *evt)
{ {
struct timespec ts; S390_lowcore.clock_comparator = get_tod_clock() + delta;
u64 nsecs;
ts.tv_sec = ts.tv_nsec = 0;
monotonic_to_bootbased(&ts);
nsecs = ktime_to_ns(ktime_add(timespec_to_ktime(ts), expires));
do_div(nsecs, 125);
S390_lowcore.clock_comparator = sched_clock_base_cc + (nsecs << 9);
/* Program the maximum value if we have an overflow (== year 2042) */
if (unlikely(S390_lowcore.clock_comparator < sched_clock_base_cc))
S390_lowcore.clock_comparator = -1ULL;
set_clock_comparator(S390_lowcore.clock_comparator); set_clock_comparator(S390_lowcore.clock_comparator);
return 0; return 0;
} }
...@@ -146,15 +136,14 @@ void init_cpu_timer(void) ...@@ -146,15 +136,14 @@ void init_cpu_timer(void)
cpu = smp_processor_id(); cpu = smp_processor_id();
cd = &per_cpu(comparators, cpu); cd = &per_cpu(comparators, cpu);
cd->name = "comparator"; cd->name = "comparator";
cd->features = CLOCK_EVT_FEAT_ONESHOT | cd->features = CLOCK_EVT_FEAT_ONESHOT;
CLOCK_EVT_FEAT_KTIME;
cd->mult = 16777; cd->mult = 16777;
cd->shift = 12; cd->shift = 12;
cd->min_delta_ns = 1; cd->min_delta_ns = 1;
cd->max_delta_ns = LONG_MAX; cd->max_delta_ns = LONG_MAX;
cd->rating = 400; cd->rating = 400;
cd->cpumask = cpumask_of(cpu); cd->cpumask = cpumask_of(cpu);
cd->set_next_ktime = s390_next_ktime; cd->set_next_event = s390_next_event;
cd->set_mode = s390_set_mode; cd->set_mode = s390_set_mode;
clockevents_register_device(cd); clockevents_register_device(cd);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment