On Mon, Aug 05 2024 at 14:41, Felix Moessbauer wrote: > RT tasks do not have any timerslack, as this induces jitter. By > that, the timer slack is already ignored in the nanosleep family and > schedule_hrtimeout_range() (fixed in 0c52310f2600). > > The hrtimer_start_range_ns function is indirectly used by glibc-2.33+ > for timed waits on condition variables. These are sometimes used in > RT applications for realtime queue processing. At least on the > combination of kernel 5.10 and glibc-2.31, the timed wait on condition > variables in rt tasks was precise (no slack), however glibc-2.33 > changed the internal wait implementation, exposing the kernel bug. That's hardly a bug. It's an oversight. > This patch makes the timer slack consistent across all hrtimer "This patch" .... > programming code, by ignoring the timerslack for rt tasks also in the > last remaining location in hrtimer_start_range_ns(). > > Similar to 0c52310f2600, this fix should be backported as well. This is not part of the change log. > Cc: stable@xxxxxxxxxxxxxxx > Signed-off-by: Felix Moessbauer <felix.moessbauer@xxxxxxxxxxx> > --- > kernel/time/hrtimer.c | 6 +++++- > 1 file changed, 5 insertions(+), 1 deletion(-) > > diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c > index 2b1469f61d9c..1b26e095114d 100644 > --- a/kernel/time/hrtimer.c > +++ b/kernel/time/hrtimer.c > @@ -1274,7 +1274,7 @@ static int __hrtimer_start_range_ns(struct hrtimer *timer, ktime_t tim, > * hrtimer_start_range_ns - (re)start an hrtimer > * @timer: the timer to be added > * @tim: expiry time > - * @delta_ns: "slack" range for the timer > + * @delta_ns: "slack" range for the timer for SCHED_OTHER tasks > * @mode: timer mode: absolute (HRTIMER_MODE_ABS) or > * relative (HRTIMER_MODE_REL), and pinned (HRTIMER_MODE_PINNED); > * softirq based mode is considered for debug purpose only! > @@ -1299,6 +1299,10 @@ void hrtimer_start_range_ns(struct hrtimer *timer, ktime_t tim, > > base = lock_hrtimer_base(timer, &flags); > > + /* rt-tasks do not have a timer slack for obvious reasons */ > + if (rt_task(current)) > + delta_ns = 0; task_is_realtime() please Thanks, tglx