diff options
author | André Fabian Silva Delgado <emulatorman@parabola.nu> | 2014-01-26 19:01:05 -0200 |
---|---|---|
committer | André Fabian Silva Delgado <emulatorman@parabola.nu> | 2014-01-26 19:01:05 -0200 |
commit | c86596e71aee61771edf51523a929ab67f55d0b5 (patch) | |
tree | 903df92b8234e128d89d731db71d8e85a8fcc24b /kernels/linux-libre-rt/timers-do-not-raise-softirq-unconditionally.patch | |
parent | 8e4c1b534edef301389b636be34b729a9a2d8ff3 (diff) |
linux-libre-rt-3.12.8_rt11-1: updating version
Diffstat (limited to 'kernels/linux-libre-rt/timers-do-not-raise-softirq-unconditionally.patch')
-rw-r--r-- | kernels/linux-libre-rt/timers-do-not-raise-softirq-unconditionally.patch | 156 |
1 files changed, 0 insertions, 156 deletions
diff --git a/kernels/linux-libre-rt/timers-do-not-raise-softirq-unconditionally.patch b/kernels/linux-libre-rt/timers-do-not-raise-softirq-unconditionally.patch deleted file mode 100644 index d8f01f2d6..000000000 --- a/kernels/linux-libre-rt/timers-do-not-raise-softirq-unconditionally.patch +++ /dev/null @@ -1,156 +0,0 @@ -From 35b6173e6176fc978c635f9e07f1778eff7b76e7 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner <tglx@linutronix.de> -Date: Thu, 7 Nov 2013 12:21:11 +0100 -Subject: [PATCH] timers: do not raise softirq unconditionally - -Mike, - -On Thu, 7 Nov 2013, Mike Galbraith wrote: - -> On Thu, 2013-11-07 at 04:26 +0100, Mike Galbraith wrote: -> > On Wed, 2013-11-06 at 18:49 +0100, Thomas Gleixner wrote: -> -> > > I bet you are trying to work around some of the side effects of the -> > > occasional tick which is still necessary despite of full nohz, right? -> > -> > Nope, I wanted to check out cost of nohz_full for rt, and found that it -> > doesn't work at all instead, looked, and found that the sole running -> > task has just awakened ksoftirqd when it wants to shut the tick down, so -> > that shutdown never happens. -> -> Like so in virgin 3.10-rt. Box is x3550 M3 booted nowatchdog -> rcu_nocbs=1-3 nohz_full=1-3, and CPUs1-3 are completely isolated via -> cpusets as well. - -well, that very same problem is in mainline if you add "threadirqs" to -the command line. But we can be smart about this. The untested patch -below should address that issue. If that works on mainline we can -adapt it for RT (needs a trylock(&base->lock) there). - -Though it's not a full solution. It needs some thought versus the -softirq code of timers. Assume we have only one timer queued 1000 -ticks into the future. So this change will cause the timer softirq not -to be called until that timer expires and then the timer softirq is -going to do 1000 loops until it catches up with jiffies. That's -anything but pretty ... - -What worries me more is this one: - - pert-5229 [003] d..h1.. 684.482618: softirq_raise: vec=9 [action=RCU] - -The CPU has no callbacks as you shoved them over to cpu 0, so why is -the RCU softirq raised? - -Thanks, - - tglx ------------------- -Message-id: <alpine.DEB.2.02.1311071158350.23353@ionos.tec.linutronix.de> -|CONFIG_NO_HZ_FULL + CONFIG_PREEMPT_RT_FULL = nogo -Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> ---- - include/linux/hrtimer.h | 3 +-- - kernel/hrtimer.c | 31 +++++++------------------------ - kernel/timer.c | 23 ++++++++++++++++++++--- - 3 files changed, 28 insertions(+), 29 deletions(-) - ---- a/include/linux/hrtimer.h -+++ b/include/linux/hrtimer.h -@@ -461,9 +461,8 @@ extern int schedule_hrtimeout_range_cloc - unsigned long delta, const enum hrtimer_mode mode, int clock); - extern int schedule_hrtimeout(ktime_t *expires, const enum hrtimer_mode mode); - --/* Soft interrupt function to run the hrtimer queues: */ -+/* Called from the periodic timer tick */ - extern void hrtimer_run_queues(void); --extern void hrtimer_run_pending(void); - - /* Bootup initialization: */ - extern void __init hrtimers_init(void); ---- a/kernel/hrtimer.c -+++ b/kernel/hrtimer.c -@@ -1694,30 +1694,6 @@ static void run_hrtimer_softirq(struct s - } - - /* -- * Called from timer softirq every jiffy, expire hrtimers: -- * -- * For HRT its the fall back code to run the softirq in the timer -- * softirq context in case the hrtimer initialization failed or has -- * not been done yet. -- */ --void hrtimer_run_pending(void) --{ -- if (hrtimer_hres_active()) -- return; -- -- /* -- * This _is_ ugly: We have to check in the softirq context, -- * whether we can switch to highres and / or nohz mode. The -- * clocksource switch happens in the timer interrupt with -- * xtime_lock held. Notification from there only sets the -- * check bit in the tick_oneshot code, otherwise we might -- * deadlock vs. xtime_lock. -- */ -- if (tick_check_oneshot_change(!hrtimer_is_hres_enabled())) -- hrtimer_switch_to_hres(); --} -- --/* - * Called from hardirq context every jiffy - */ - void hrtimer_run_queues(void) -@@ -1730,6 +1706,13 @@ void hrtimer_run_queues(void) - if (hrtimer_hres_active()) - return; - -+ /* -+ * Check whether we can switch to highres mode. -+ */ -+ if (tick_check_oneshot_change(!hrtimer_is_hres_enabled()) -+ && hrtimer_switch_to_hres()) -+ return; -+ - for (index = 0; index < HRTIMER_MAX_CLOCK_BASES; index++) { - base = &cpu_base->clock_base[index]; - if (!timerqueue_getnext(&base->active)) ---- a/kernel/timer.c -+++ b/kernel/timer.c -@@ -1439,8 +1439,6 @@ static void run_timer_softirq(struct sof - { - struct tvec_base *base = __this_cpu_read(tvec_bases); - -- hrtimer_run_pending(); -- - if (time_after_eq(jiffies, base->timer_jiffies)) - __run_timers(base); - } -@@ -1450,8 +1448,27 @@ static void run_timer_softirq(struct sof - */ - void run_local_timers(void) - { -+ struct tvec_base *base = __this_cpu_read(tvec_bases); -+ - hrtimer_run_queues(); -- raise_softirq(TIMER_SOFTIRQ); -+ /* -+ * We can access this lockless as we are in the timer -+ * interrupt. If there are no timers queued, nothing to do in -+ * the timer softirq. -+ */ -+ if (!spin_do_trylock(&base->lock)) { -+ raise_softirq(TIMER_SOFTIRQ); -+ return; -+ } -+ if (!base->active_timers) -+ goto out; -+ -+ /* Check whether the next pending timer has expired */ -+ if (time_before_eq(base->next_timer, jiffies)) -+ raise_softirq(TIMER_SOFTIRQ); -+out: -+ rt_spin_unlock_after_trylock_in_irq(&base->lock); -+ - } - - #ifdef __ARCH_WANT_SYS_ALARM |