linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Frederic Weisbecker <fweisbec@gmail.com>
To: LKML <linux-kernel@vger.kernel.org>
Cc: Frederic Weisbecker <fweisbec@gmail.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	Ingo Molnar <mingo@kernel.org>, Kevin Hilman <khilman@linaro.org>,
	"Paul E. McKenney" <paulmck@linux.vnet.ibm.com>,
	Peter Zijlstra <peterz@infradead.org>,
	Thomas Gleixner <tglx@linutronix.de>,
	Viresh Kumar <viresh.kumar@linaro.org>
Subject: [PATCH 3/6] nohz: Support nohz full remote kick
Date: Tue, 10 Jun 2014 17:15:06 +0200	[thread overview]
Message-ID: <1402413309-3415-4-git-send-email-fweisbec@gmail.com> (raw)
In-Reply-To: <1402413309-3415-1-git-send-email-fweisbec@gmail.com>

Remotely kicking a full nohz CPU in order to make it re-evaluate its
next tick is currently implemented using the scheduler IPI.

However this bloats a scheduler fast path with an off-topic feature.
The scheduler tick was abused here for its cool "callable
anywhere/anytime" properties.

But now that the irq work subsystem can queue remote callbacks, it's
a perfect fit to safely queue IPIs when interrupts are disabled
without worrying about concurrent callers.

So lets implement remote kick on top of irq work. This is going to
be used when a new event requires the next tick to be recalculated:
more than 1 task competing on the CPU, timer armed, ...

Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Kevin Hilman <khilman@linaro.org>
Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Viresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
---
 include/linux/tick.h     |  9 ++++++++-
 kernel/time/tick-sched.c | 10 ++++++----
 2 files changed, 14 insertions(+), 5 deletions(-)

diff --git a/include/linux/tick.h b/include/linux/tick.h
index b84773c..8a4987f 100644
--- a/include/linux/tick.h
+++ b/include/linux/tick.h
@@ -181,7 +181,13 @@ static inline bool tick_nohz_full_cpu(int cpu)
 
 extern void tick_nohz_init(void);
 extern void __tick_nohz_full_check(void);
-extern void tick_nohz_full_kick(void);
+extern void tick_nohz_full_kick_cpu(int cpu);
+
+static inline void tick_nohz_full_kick(void)
+{
+	tick_nohz_full_kick_cpu(smp_processor_id());
+}
+
 extern void tick_nohz_full_kick_all(void);
 extern void __tick_nohz_task_switch(struct task_struct *tsk);
 #else
@@ -189,6 +195,7 @@ static inline void tick_nohz_init(void) { }
 static inline bool tick_nohz_full_enabled(void) { return false; }
 static inline bool tick_nohz_full_cpu(int cpu) { return false; }
 static inline void __tick_nohz_full_check(void) { }
+static inline void tick_nohz_full_kick_cpu(int cpu) { }
 static inline void tick_nohz_full_kick(void) { }
 static inline void tick_nohz_full_kick_all(void) { }
 static inline void __tick_nohz_task_switch(struct task_struct *tsk) { }
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c
index 6558b7a..3d63944 100644
--- a/kernel/time/tick-sched.c
+++ b/kernel/time/tick-sched.c
@@ -224,13 +224,15 @@ static DEFINE_PER_CPU(struct irq_work, nohz_full_kick_work) = {
 };
 
 /*
- * Kick the current CPU if it's full dynticks in order to force it to
+ * Kick the CPU if it's full dynticks in order to force it to
  * re-evaluate its dependency on the tick and restart it if necessary.
  */
-void tick_nohz_full_kick(void)
+void tick_nohz_full_kick_cpu(int cpu)
 {
-	if (tick_nohz_full_cpu(smp_processor_id()))
-		irq_work_queue(&__get_cpu_var(nohz_full_kick_work));
+	if (!tick_nohz_full_cpu(cpu))
+		return;
+
+	irq_work_queue_on(&per_cpu(nohz_full_kick_work, cpu), cpu);
 }
 
 static void nohz_full_kick_ipi(void *info)
-- 
1.8.3.1


  parent reply	other threads:[~2014-06-10 15:15 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-06-10 15:15 [PATCH 0/6] nohz: Move nohz kick out of scheduler IPI, v8 Frederic Weisbecker
2014-06-10 15:15 ` [PATCH 1/6] irq_work: Split raised and lazy lists Frederic Weisbecker
2014-06-10 15:15 ` [PATCH 2/6] irq_work: Implement remote queueing Frederic Weisbecker
2014-06-24 20:33   ` Stephen Warren
2014-06-24 20:35     ` Stephen Warren
2014-06-25  5:12     ` Peter Zijlstra
2014-06-25  5:17       ` Peter Zijlstra
2014-06-25  6:37         ` Srivatsa S. Bhat
2014-06-25  9:36           ` Peter Zijlstra
2014-06-25  9:39             ` Peter Zijlstra
2014-06-25  9:50               ` Srivatsa S. Bhat
2014-06-25  9:54                 ` Srivatsa S. Bhat
2014-06-25 10:19                   ` Peter Zijlstra
2014-06-25 10:57                     ` Srivatsa S. Bhat
2014-06-25 16:23                     ` Stephen Warren
2014-06-25 16:38                       ` Peter Zijlstra
2014-06-25 16:57                         ` Srivatsa S. Bhat
2014-06-28 18:19                           ` Borislav Petkov
2014-07-03 14:52                         ` Frederic Weisbecker
2014-07-04  5:10                         ` Sachin Kamat
2014-07-01 19:13                       ` Stephen Warren
2014-06-10 15:15 ` Frederic Weisbecker [this message]
2014-06-10 15:15 ` [PATCH 4/6] nohz: Switch to nohz full remote kick on timer enqueue Frederic Weisbecker
2014-06-10 15:15 ` [PATCH 5/6] nohz: Use nohz own full kick on 2nd task enqueue Frederic Weisbecker
2014-06-10 15:15 ` [PATCH 6/6] nohz: Use IPI implicit full barrier against rq->nr_running r/w Frederic Weisbecker
2014-06-10 15:48   ` Peter Zijlstra
2014-06-10 16:24     ` Frederic Weisbecker
2014-06-10 15:48 ` [PATCH 0/6] nohz: Move nohz kick out of scheduler IPI, v8 Peter Zijlstra
2014-06-10 16:18   ` Frederic Weisbecker

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=1402413309-3415-4-git-send-email-fweisbec@gmail.com \
    --to=fweisbec@gmail.com \
    --cc=akpm@linux-foundation.org \
    --cc=khilman@linaro.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=paulmck@linux.vnet.ibm.com \
    --cc=peterz@infradead.org \
    --cc=tglx@linutronix.de \
    --cc=viresh.kumar@linaro.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).