Hi Thomas,
I couldn't understand one part of hrtimer (obviously there are others as well, but here I am sure I couldn't understood it :)).
In switch_hrtimer_base() we are calling hrtimer_check_target() which guarantees this:
/* * With HIGHRES=y we do not migrate the timer when it is expiring * before the next event on the target cpu because we cannot reprogram * the target cpu hardware and we would cause it to fire late. * * Called with cpu_base->lock of target cpu held. */
But switch_hrtimer_base() is only called from one place, i.e. __hrtimer_start_range_ns() and at the point (where we call switch_hrtimer_base()) expiration time is not yet known as we call this routine later:
hrtimer_set_expires_range_ns()
So, do we really need to call hrtimer_check_target() at all in switch_hrtimer_base()? Or do we need to move hrtimer_set_expires_range_ns() before calling switch_hrtimer_base() ??
-- viresh
On Fri, 28 Mar 2014, Viresh Kumar wrote:
Hi Thomas,
I couldn't understand one part of hrtimer (obviously there are others as well, but here I am sure I couldn't understood it :)).
In switch_hrtimer_base() we are calling hrtimer_check_target() which guarantees this:
/*
- With HIGHRES=y we do not migrate the timer when it is expiring
- before the next event on the target cpu because we cannot reprogram
- the target cpu hardware and we would cause it to fire late.
- Called with cpu_base->lock of target cpu held.
*/
But switch_hrtimer_base() is only called from one place, i.e. __hrtimer_start_range_ns() and at the point (where we call switch_hrtimer_base()) expiration time is not yet known as we call this routine later:
hrtimer_set_expires_range_ns()
So, do we really need to call hrtimer_check_target() at all in switch_hrtimer_base()? Or do we need to move hrtimer_set_expires_range_ns() before calling switch_hrtimer_base() ??
Yes, we should move setting the expiry time before we call switch_hrtimer_base().
Thanks,
tglx
linaro-kernel@lists.linaro.org