From: Luiz Capitulino <lcapitulino@redhat.com>
To: linux-rt-users@vger.kernel.org
Cc: riel@redhat.com, bigeasy@linutronix.de, tglx@linutronix.de,
fweisbec@gmail.com
Subject: [PATCH -rt] kernel/time: unbreak nohz in -rt
Date: Mon, 21 Mar 2016 15:12:38 -0400 [thread overview]
Message-ID: <20160321151238.43fdfc1d@redhat.com> (raw)
nohz support (nohz-full and nohz-idle) is currently
broken in the RT kernel. Meaning that, the tick is
never de-activated even when a core is idle or when
nohz_full= is passed.
The reason for this is that get_next_timer_interrupt()
in the RT kernel *always* returns "basem + TICK_NSEC"
which translates to "there's a timer firing in the
next tick". This causes tick_nohz_stop_sched_tick()
to never deactivate the tick.
This patch is like tylenol, it doesn't fix the problem, it
just reliefs the symptons by making tick_nohz_stop_sched_tick()
succeed if: 1. a core doesn't have any legacy timers
pending and 2. there's no hrtimer firing in the next tick.
Also, note that this issue has another side effect: it
causes the ktimersoftd thread to always take 1%-2% of CPU
time on all cores, even if they are idle. As it turns out,
the tick handling code path unconditionally raises the
TIMER_SOFTIRQ line. This is an upstream kernel behavior.
I believe people are not noticing the CPU usage because
nohz-idle papers over this problem.
Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
---
kernel/time/timer.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/kernel/time/timer.c b/kernel/time/timer.c
index fee8682..2bf49af 100644
--- a/kernel/time/timer.c
+++ b/kernel/time/timer.c
@@ -1451,8 +1451,14 @@ u64 get_next_timer_interrupt(unsigned long basej, u64 basem)
/*
* On PREEMPT_RT we cannot sleep here. As a result we can't take
* the base lock to check when the next timer is pending and so
- * we assume the next jiffy.
+ * we assume the next jiffy if there are active timers.
*/
+ local_irq_disable();
+ if (!base->active_timers) {
+ local_irq_enable();
+ return cmp_next_hrtimer_event(basem, expires);
+ }
+ local_irq_enable();
return basem + TICK_NSEC;
#endif
spin_lock(&base->lock);
--
2.1.0
next reply other threads:[~2016-03-21 19:38 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-03-21 19:12 Luiz Capitulino [this message]
2016-03-29 16:25 ` [PATCH -rt] kernel/time: unbreak nohz in -rt Sebastian Andrzej Siewior
2016-03-29 20:10 ` Luiz Capitulino
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20160321151238.43fdfc1d@redhat.com \
--to=lcapitulino@redhat.com \
--cc=bigeasy@linutronix.de \
--cc=fweisbec@gmail.com \
--cc=linux-rt-users@vger.kernel.org \
--cc=riel@redhat.com \
--cc=tglx@linutronix.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.