Re: sched_clock() uses are broken

Andi Kleen
2006-05-02T16:44:04Z

Russell King <rmk+lkml@arm.linux.org.uk> writes:
>
> However, this is not the case. On x86 with TSC, it returns a 54 bit
> number. This means that when t1 < t0, time_passed_ns becomes a very
> large number which no longer represents the amount of time.

Good point. For a 1Ghz system this would happen every ~0.57 years.

The problem is there is AFAIK no non destructive[1] way to find out how
many bits the TSC has

Destructive would be to overwrite it with -1 and see how many stick.

> All uses in kernel/sched.c seem to be aflicted by this problem.
>
> There are several solutions to this - the most obvious being that we
> need a function which returns the nanosecond difference between two
> sched_clock() return values, and this function needs to know how to
> handle the case where sched_clock() has wrapped.

Ok it can be done with a simple test.

>
> IOW:
>
> t0 = sched_clock();
> /* do something */
> t1 = sched_clock();
>
> time_passed = sched_clock_diff(t1, t0);
>
> Comments?

Agreed it's a problem, but probably a small one. At worst you'll get
a small scheduling hickup every half year, which should be hardly
that big an issue.

Might chose to just ignore it with a big fat comment?

-Andi