All of lore.kernel.org
 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>,
	Anton Blanchard <anton@au1.ibm.com>, Avi Kivity <avi@redhat.com>,
	Ingo Molnar <mingo@elte.hu>, Lai Jiangshan <laijs@cn.fujitsu.com>,
	"Paul E . McKenney" <paulmck@linux.vnet.ibm.com>,
	Paul Menage <menage@google.com>,
	Peter Zijlstra <a.p.zijlstra@chello.nl>,
	Stephen Hemminger <shemminger@vyatta.com>,
	Thomas Gleixner <tglx@linutronix.de>,
	Tim Pepper <lnxninja@linux.vnet.ibm.com>
Subject: [PATCH 13/32] nohz: Adaptive tick stop and restart on nohz cpuset
Date: Mon, 15 Aug 2011 17:52:10 +0200	[thread overview]
Message-ID: <1313423549-27093-14-git-send-email-fweisbec@gmail.com> (raw)
In-Reply-To: <1313423549-27093-1-git-send-email-fweisbec@gmail.com>

When a CPU is included in a nohz cpuset, try to switch
it to nohz mode from the timer interrupt if it is the
only non-idle task running.

Then restart the tick if necessary from the wakeup path
if we are enqueuing a second task while the timer is stopped,
so that the scheduler tick is rearmed.

This assumes we are using TTWU_QUEUE sched feature so I need
to handle the off case (or actually not handle it but properly),
because we need the adaptive tick restart and what will come
along in further patches to be done locally and before the new
task ever gets scheduled.

I also need to look at the ARCH_WANT_INTERRUPTS_ON_CTXW case
and the remote wakeups.

Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Anton Blanchard <anton@au1.ibm.com>
Cc: Avi Kivity <avi@redhat.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Lai Jiangshan <laijs@cn.fujitsu.com>
Cc: Paul E . McKenney <paulmck@linux.vnet.ibm.com>
Cc: Paul Menage <menage@google.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Stephen Hemminger <shemminger@vyatta.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Tim Pepper <lnxninja@linux.vnet.ibm.com>
---
 include/linux/cpuset.h   |    4 +++
 include/linux/sched.h    |    6 ++++
 include/linux/tick.h     |   12 ++++++++-
 init/Kconfig             |    2 +-
 kernel/sched.c           |   35 +++++++++++++++++++++++++
 kernel/softirq.c         |    4 +-
 kernel/time/tick-sched.c |   63 ++++++++++++++++++++++++++++++++++++++-------
 7 files changed, 112 insertions(+), 14 deletions(-)

diff --git a/include/linux/cpuset.h b/include/linux/cpuset.h
index 62e5d5a..799b9a4 100644
--- a/include/linux/cpuset.h
+++ b/include/linux/cpuset.h
@@ -264,6 +264,10 @@ static inline bool cpuset_adaptive_nohz(void)
 	return false;
 }
 
+extern void cpuset_update_nohz(void);
+#else
+static inline void cpuset_update_nohz(void) { }
+
 #endif /* CONFIG_CPUSETS_NO_HZ */
 
 #endif /* _LINUX_CPUSET_H */
diff --git a/include/linux/sched.h b/include/linux/sched.h
index dbe021a..53a95b5 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -2652,6 +2652,12 @@ static inline void inc_syscw(struct task_struct *tsk)
 #define TASK_SIZE_OF(tsk)	TASK_SIZE
 #endif
 
+#ifdef CONFIG_CPUSETS_NO_HZ
+extern bool cpuset_nohz_can_stop_tick(void);
+#else
+static inline bool cpuset_nohz_can_stop_tick(void) { return false; }
+#endif
+
 #ifdef CONFIG_MM_OWNER
 extern void mm_update_next_owner(struct mm_struct *mm);
 extern void mm_init_owner(struct mm_struct *mm, struct task_struct *p);
diff --git a/include/linux/tick.h b/include/linux/tick.h
index 849a0b2..cc4880e 100644
--- a/include/linux/tick.h
+++ b/include/linux/tick.h
@@ -122,11 +122,21 @@ static inline int tick_oneshot_mode_active(void) { return 0; }
 # ifdef CONFIG_NO_HZ
 extern void tick_nohz_enter_idle(void);
 extern void tick_nohz_exit_idle(void);
+extern void tick_nohz_restart_sched_tick(void);
 extern void tick_nohz_irq_exit(void);
 extern ktime_t tick_nohz_get_sleep_length(void);
 extern u64 get_cpu_idle_time_us(int cpu, u64 *last_update_time);
 extern u64 get_cpu_iowait_time_us(int cpu, u64 *last_update_time);
-# else
+
+#ifdef CONFIG_CPUSETS_NO_HZ
+DECLARE_PER_CPU(int, task_nohz_mode);
+
+extern int tick_nohz_adaptive_mode(void);
+#else /* !CPUSETS_NO_HZ */
+static inline int tick_nohz_adaptive_mode(void) { return 0; }
+#endif /* CPUSETS_NO_HZ */
+
+# else /* !NO_HZ */
 static inline void tick_nohz_enter_idle(void) { }
 static inline void tick_nohz_exit_idle(void) { }
 
diff --git a/init/Kconfig b/init/Kconfig
index 0cb591a..7a144ad 100644
--- a/init/Kconfig
+++ b/init/Kconfig
@@ -626,7 +626,7 @@ config PROC_PID_CPUSET
 
 config CPUSETS_NO_HZ
        bool "Tickless cpusets"
-       depends on CPUSETS && HAVE_CPUSETS_NO_HZ
+       depends on CPUSETS && HAVE_CPUSETS_NO_HZ && NO_HZ && HIGH_RES_TIMERS
        help
          This options let you apply a nohz property to a cpuset such
 	 that the periodic timer tick tries to be avoided when possible on
diff --git a/kernel/sched.c b/kernel/sched.c
index 609a867..0e1aa4e 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -2433,6 +2433,38 @@ static void update_avg(u64 *avg, u64 sample)
 }
 #endif
 
+#ifdef CONFIG_CPUSETS_NO_HZ
+DEFINE_PER_CPU(int, task_nohz_mode);
+
+bool cpuset_nohz_can_stop_tick(void)
+{
+	struct rq *rq;
+
+	rq = this_rq();
+
+	/* More than one running task need preemption */
+	if (rq->nr_running > 1)
+		return false;
+
+	return true;
+}
+
+static void cpuset_nohz_restart_tick(void)
+{
+	__get_cpu_var(task_nohz_mode) = 0;
+	tick_nohz_restart_sched_tick();
+}
+
+void cpuset_update_nohz(void)
+{
+	if (!tick_nohz_adaptive_mode())
+		return;
+
+	if (!cpuset_nohz_can_stop_tick())
+		cpuset_nohz_restart_tick();
+}
+#endif
+
 static void
 ttwu_stat(struct task_struct *p, int cpu, int wake_flags)
 {
@@ -2560,6 +2592,8 @@ static void sched_ttwu_pending(void)
 		ttwu_do_activate(rq, p, 0);
 	}
 
+	cpuset_update_nohz();
+
 	raw_spin_unlock(&rq->lock);
 }
 
@@ -2620,6 +2654,7 @@ static void ttwu_queue(struct task_struct *p, int cpu)
 
 	raw_spin_lock(&rq->lock);
 	ttwu_do_activate(rq, p, 0);
+	cpuset_update_nohz();
 	raw_spin_unlock(&rq->lock);
 }
 
diff --git a/kernel/softirq.c b/kernel/softirq.c
index 67a1401..2dbeeb9 100644
--- a/kernel/softirq.c
+++ b/kernel/softirq.c
@@ -297,7 +297,7 @@ void irq_enter(void)
 	int cpu = smp_processor_id();
 
 	rcu_irq_enter();
-	if (idle_cpu(cpu) && !in_interrupt()) {
+	if ((idle_cpu(cpu) || tick_nohz_adaptive_mode()) && !in_interrupt()) {
 		/*
 		 * Prevent raise_softirq from needlessly waking up ksoftirqd
 		 * here, as softirq will be serviced on return from interrupt.
@@ -342,7 +342,7 @@ void irq_exit(void)
 	rcu_irq_exit();
 #ifdef CONFIG_NO_HZ
 	/* Make sure that timer wheel updates are propagated */
-	if (idle_cpu(smp_processor_id()) && !in_interrupt() && !need_resched())
+	if (!in_interrupt())
 		tick_nohz_irq_exit();
 #endif
 	preempt_enable_no_resched();
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c
index 5f41ef7..fb97cd0 100644
--- a/kernel/time/tick-sched.c
+++ b/kernel/time/tick-sched.c
@@ -499,12 +499,7 @@ static void tick_nohz_restart(struct tick_sched *ts, ktime_t now)
 	}
 }
 
-/**
- * tick_nohz_restart_sched_tick - restart the idle tick from the idle task
- *
- * Restart the idle tick when the CPU is woken up from idle
- */
-static void tick_nohz_restart_sched_tick(ktime_t now, struct tick_sched *ts)
+static void __tick_nohz_restart_sched_tick(ktime_t now, struct tick_sched *ts)
 {
 	int cpu = smp_processor_id();
 
@@ -522,6 +517,31 @@ static void tick_nohz_restart_sched_tick(ktime_t now, struct tick_sched *ts)
 	tick_nohz_restart(ts, now);
 }
 
+/**
+ * tick_nohz_restart_sched_tick - restart the idle tick from the idle task
+ *
+ * Restart the idle tick when the CPU is woken up from idle
+ */
+void tick_nohz_restart_sched_tick(void)
+{
+	struct tick_sched *ts = &__get_cpu_var(tick_cpu_sched);
+	unsigned long flags;
+	ktime_t now;
+
+	local_irq_save(flags);
+
+	if (!ts->tick_stopped) {
+		local_irq_restore(flags);
+		return;
+	}
+
+	now = ktime_get();
+	__tick_nohz_restart_sched_tick(now, ts);
+
+	local_irq_restore(flags);
+}
+
+
 static void tick_nohz_account_idle_ticks(struct tick_sched *ts)
 {
 #ifndef CONFIG_VIRT_CPU_ACCOUNTING
@@ -560,7 +580,7 @@ void tick_nohz_exit_idle(void)
 	if (ts->tick_stopped) {
 		rcu_exit_nohz();
 		select_nohz_load_balancer(0);
-		tick_nohz_restart_sched_tick(now, ts);
+		__tick_nohz_restart_sched_tick(now, ts);
 		tick_nohz_account_idle_ticks(ts);
 	}
 
@@ -570,9 +590,14 @@ void tick_nohz_exit_idle(void)
 void tick_nohz_irq_exit(void)
 {
 	struct tick_sched *ts = &__get_cpu_var(tick_cpu_sched);
+	int cpu = smp_processor_id();
 
-	if (ts->inidle)
-		__tick_nohz_enter_idle(ts, smp_processor_id());
+	if (ts->inidle && !need_resched())
+		__tick_nohz_enter_idle(ts, cpu);
+	else if (tick_nohz_adaptive_mode() && !idle_cpu(cpu)) {
+		if (tick_nohz_can_stop_tick(cpu, ts))
+			tick_nohz_stop_sched_tick(ktime_get(), cpu, ts);
+	}
 }
 
 static int tick_nohz_reprogram(struct tick_sched *ts, ktime_t now)
@@ -732,6 +757,20 @@ void tick_check_idle(int cpu)
 
 #ifdef CONFIG_CPUSETS_NO_HZ
 
+int tick_nohz_adaptive_mode(void)
+{
+	return __get_cpu_var(task_nohz_mode);
+}
+
+static void tick_nohz_cpuset_stop_tick(int user)
+{
+	if (!cpuset_adaptive_nohz() || tick_nohz_adaptive_mode())
+		return;
+
+	if (cpuset_nohz_can_stop_tick())
+		__get_cpu_var(task_nohz_mode) = 1;
+}
+
 /*
  * Take the timer duty if nobody is taking care of it.
  * If a CPU already does and and it's in a nohz cpuset,
@@ -752,6 +791,8 @@ static void tick_do_timer_check_handler(int cpu)
 
 #else
 
+static void tick_nohz_cpuset_stop_tick(int user) { }
+
 static void tick_do_timer_check_handler(int cpu)
 {
 #ifdef CONFIG_NO_HZ
@@ -796,6 +837,7 @@ static enum hrtimer_restart tick_sched_timer(struct hrtimer *timer)
 	 * no valid regs pointer
 	 */
 	if (regs) {
+		int user = user_mode(regs);
 		/*
 		 * When we are idle and the tick is stopped, we have to touch
 		 * the watchdog as we might not schedule for a really long
@@ -809,8 +851,9 @@ static enum hrtimer_restart tick_sched_timer(struct hrtimer *timer)
 			if (idle_cpu(cpu))
 				ts->idle_jiffies++;
 		}
-		update_process_times(user_mode(regs));
+		update_process_times(user);
 		profile_tick(CPU_PROFILING);
+		tick_nohz_cpuset_stop_tick(user);
 	}
 
 	hrtimer_forward(timer, now, tick_period);
-- 
1.7.5.4


  parent reply	other threads:[~2011-08-15 15:57 UTC|newest]

Thread overview: 139+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-08-15 15:51 [RFC PATCH 00/32] Nohz cpusets (was: Nohz Tasks) Frederic Weisbecker
2011-08-15 15:51 ` [PATCH 01/32 RESEND] nohz: Drop useless call in tick_nohz_start_idle() Frederic Weisbecker
2011-08-29 14:23   ` Peter Zijlstra
2011-08-29 17:10     ` Frederic Weisbecker
2011-08-15 15:51 ` [PATCH 02/32 RESEND] nohz: Drop ts->idle_active Frederic Weisbecker
2011-08-29 14:23   ` Peter Zijlstra
2011-08-29 16:15     ` Frederic Weisbecker
2011-08-15 15:52 ` [PATCH 03/32 RESEND] nohz: Drop useless ts->inidle check before rearming the tick Frederic Weisbecker
2011-08-29 14:23   ` Peter Zijlstra
2011-08-29 16:58     ` Frederic Weisbecker
2011-08-15 15:52 ` [PATCH 04/32] nohz: Separate idle sleeping time accounting from nohz switching Frederic Weisbecker
2011-08-29 14:23   ` Peter Zijlstra
2011-08-29 16:32     ` Frederic Weisbecker
2011-08-29 17:44       ` Peter Zijlstra
2011-08-29 22:53         ` Frederic Weisbecker
2011-08-29 14:23   ` Peter Zijlstra
2011-08-29 17:01     ` Frederic Weisbecker
2011-08-15 15:52 ` [PATCH 05/32] nohz: Move rcu dynticks idle mode handling to idle enter/exit APIs Frederic Weisbecker
2011-08-29 14:25   ` Peter Zijlstra
2011-08-29 17:11     ` Frederic Weisbecker
2011-08-29 17:49       ` Peter Zijlstra
2011-08-29 17:59         ` Frederic Weisbecker
2011-08-29 18:06           ` Peter Zijlstra
2011-08-29 23:35             ` Frederic Weisbecker
2011-08-30 11:17               ` Peter Zijlstra
2011-08-30 14:11                 ` Frederic Weisbecker
2011-08-30 14:13                   ` Peter Zijlstra
2011-08-30 14:27                     ` Frederic Weisbecker
2011-08-30 11:19               ` Peter Zijlstra
2011-08-30 14:26                 ` Frederic Weisbecker
2011-08-30 15:22                   ` Peter Zijlstra
2011-08-30 18:45                     ` Frederic Weisbecker
2011-08-30 11:21               ` Peter Zijlstra
2011-08-30 14:32                 ` Frederic Weisbecker
2011-08-30 15:26                   ` Peter Zijlstra
2011-08-30 15:33                     ` Frederic Weisbecker
2011-08-30 15:42                       ` Peter Zijlstra
2011-08-30 18:53                         ` Frederic Weisbecker
2011-08-30 20:58                       ` Peter Zijlstra
2011-08-30 22:24                         ` Frederic Weisbecker
2011-08-31  9:17                           ` Peter Zijlstra
2011-08-31 13:37                             ` Frederic Weisbecker
2011-08-31 14:41                               ` Peter Zijlstra
2011-09-01 16:40                                 ` Paul E. McKenney
2011-09-01 17:13                                   ` Peter Zijlstra
2011-09-02  1:41                                     ` Paul E. McKenney
2011-09-02  8:24                                       ` Peter Zijlstra
2011-09-04 19:37                                         ` Paul E. McKenney
2011-09-05 14:28                                           ` Peter Zijlstra
2011-08-15 15:52 ` [PATCH 06/32] nohz: Move idle ticks stats tracking out of nohz handlers Frederic Weisbecker
2011-08-29 14:28   ` Peter Zijlstra
2011-09-06  0:35     ` Frederic Weisbecker
2011-08-15 15:52 ` [PATCH 07/32] nohz: Rename ts->idle_tick to ts->last_tick Frederic Weisbecker
2011-08-15 15:52 ` [PATCH 08/32] nohz: Move nohz load balancer selection into idle logic Frederic Weisbecker
2011-08-29 14:45   ` Peter Zijlstra
2011-09-08 14:08     ` Frederic Weisbecker
2011-09-08 17:16       ` Paul E. McKenney
2011-08-15 15:52 ` [PATCH 09/32] nohz: Move ts->idle_calls into strict " Frederic Weisbecker
2011-08-29 14:47   ` Peter Zijlstra
2011-08-29 17:34     ` Frederic Weisbecker
2011-08-29 17:59       ` Peter Zijlstra
2011-08-29 18:23         ` Frederic Weisbecker
2011-08-29 18:33           ` Peter Zijlstra
2011-08-30 14:45             ` Frederic Weisbecker
2011-08-30 15:33               ` Peter Zijlstra
2011-09-06 16:35                 ` Frederic Weisbecker
2011-08-15 15:52 ` [PATCH 10/32] nohz: Move next idle expiring time record into idle logic area Frederic Weisbecker
2011-08-15 15:52 ` [PATCH 11/32] cpuset: Set up interface for nohz flag Frederic Weisbecker
2011-08-15 15:52 ` [PATCH 12/32] nohz: Try not to give the timekeeping duty to a cpuset nohz cpu Frederic Weisbecker
2011-08-29 14:55   ` Peter Zijlstra
2011-08-30 15:17     ` Frederic Weisbecker
2011-08-30 15:30       ` Dimitri Sivanich
2011-08-30 15:37       ` Peter Zijlstra
2011-08-30 22:44         ` Frederic Weisbecker
2011-08-15 15:52 ` Frederic Weisbecker [this message]
2011-08-29 15:25   ` [PATCH 13/32] nohz: Adaptive tick stop and restart on nohz cpuset Peter Zijlstra
2011-09-06 13:03     ` Frederic Weisbecker
2011-08-29 15:28   ` Peter Zijlstra
2011-08-29 18:02     ` Frederic Weisbecker
2011-08-29 18:07       ` Peter Zijlstra
2011-08-29 18:28         ` Frederic Weisbecker
2011-08-30 12:44           ` Peter Zijlstra
2011-08-30 14:38             ` Frederic Weisbecker
2011-08-30 15:28               ` Peter Zijlstra
2011-08-29 15:32   ` Peter Zijlstra
2011-08-15 15:52 ` [PATCH 14/32] nohz/cpuset: Don't turn off the tick if rcu needs it Frederic Weisbecker
2011-08-16 20:13   ` Paul E. McKenney
2011-08-17  2:10     ` Frederic Weisbecker
2011-08-17  2:49       ` Paul E. McKenney
2011-08-29 15:36   ` Peter Zijlstra
2011-08-15 15:52 ` [PATCH 15/32] nohz/cpuset: Restart tick when switching to idle task Frederic Weisbecker
2011-08-29 15:43   ` Peter Zijlstra
2011-08-30 15:04     ` Frederic Weisbecker
2011-08-30 15:35       ` Peter Zijlstra
2011-08-15 15:52 ` [PATCH 16/32] nohz/cpuset: Wake up adaptive nohz CPU when a timer gets enqueued Frederic Weisbecker
2011-08-29 15:51   ` Peter Zijlstra
2011-08-29 15:55   ` Peter Zijlstra
2011-08-30 15:06     ` Frederic Weisbecker
2011-08-15 15:52 ` [PATCH 17/32] x86: New cpuset nohz irq vector Frederic Weisbecker
2011-08-15 15:52 ` [PATCH 18/32] nohz/cpuset: Don't stop the tick if posix cpu timers are running Frederic Weisbecker
2011-08-29 15:59   ` Peter Zijlstra
2011-08-15 15:52 ` [PATCH 19/32] nohz/cpuset: Restart tick when nohz flag is cleared on cpuset Frederic Weisbecker
2011-08-29 16:02   ` Peter Zijlstra
2011-08-30 15:10     ` Frederic Weisbecker
2011-08-15 15:52 ` [PATCH 20/32] nohz/cpuset: Restart the tick if printk needs it Frederic Weisbecker
2011-08-15 15:52 ` [PATCH 21/32] rcu: Restart the tick on non-responding adaptive nohz CPUs Frederic Weisbecker
2011-08-15 15:52 ` [PATCH 22/32] rcu: Restart tick if we enqueue a callback in a nohz/cpuset CPU Frederic Weisbecker
2011-08-16 20:20   ` Paul E. McKenney
2011-08-17  2:18     ` Frederic Weisbecker
2011-08-15 15:52 ` [PATCH 23/32] nohz/cpuset: Account user and system times in adaptive nohz mode Frederic Weisbecker
2011-08-15 15:52 ` [PATCH 24/32] nohz/cpuset: Handle kernel entry/exit to account cputime Frederic Weisbecker
2011-08-16 20:38   ` Paul E. McKenney
2011-08-17  2:30     ` Frederic Weisbecker
2011-08-15 15:52 ` [PATCH 25/32] nohz/cpuset: New API to flush cputimes on nohz cpusets Frederic Weisbecker
2011-08-15 15:52 ` [PATCH 26/32] nohz/cpuset: Flush cputime on threads in nohz cpusets when waiting leader Frederic Weisbecker
2011-08-15 15:52 ` [PATCH 27/32] nohz/cpuset: Flush cputimes on procfs stat file read Frederic Weisbecker
2011-08-15 15:52 ` [PATCH 28/32] nohz/cpuset: Flush cputimes for getrusage() and times() syscalls Frederic Weisbecker
2011-08-15 15:52 ` [PATCH 29/32] x86: Syscall hooks for nohz cpusets Frederic Weisbecker
2011-08-15 15:52 ` [PATCH 30/32] x86: Exception " Frederic Weisbecker
2011-08-15 15:52 ` [PATCH 31/32] rcu: Switch to extended quiescent state in userspace from nohz cpuset Frederic Weisbecker
2011-08-16 20:44   ` Paul E. McKenney
2011-08-17  2:43     ` Frederic Weisbecker
2011-08-15 15:52 ` [PATCH 32/32] nohz/cpuset: Disable under some configs Frederic Weisbecker
2011-08-17 16:36 ` [RFC PATCH 00/32] Nohz cpusets (was: Nohz Tasks) Avi Kivity
2011-08-18 13:25   ` Frederic Weisbecker
2011-08-20  7:45     ` Paul Menage
2011-08-23 16:36       ` Frederic Weisbecker
2011-08-24 14:41 ` Gilad Ben-Yossef
2011-08-30 14:06   ` Frederic Weisbecker
2011-08-31  3:47     ` Mike Galbraith
2011-08-31  9:28       ` Peter Zijlstra
2011-08-31 10:26         ` Mike Galbraith
2011-08-31 10:33           ` Peter Zijlstra
2011-08-31 14:00             ` Gilad Ben-Yossef
2011-08-31 14:26               ` Peter Zijlstra
2011-08-31 14:05           ` Gilad Ben-Yossef
2011-08-31 16:12             ` Mike Galbraith
2011-08-31 13:57     ` Gilad Ben-Yossef
2011-08-31 14:30       ` Peter Zijlstra

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=1313423549-27093-14-git-send-email-fweisbec@gmail.com \
    --to=fweisbec@gmail.com \
    --cc=a.p.zijlstra@chello.nl \
    --cc=akpm@linux-foundation.org \
    --cc=anton@au1.ibm.com \
    --cc=avi@redhat.com \
    --cc=laijs@cn.fujitsu.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=lnxninja@linux.vnet.ibm.com \
    --cc=menage@google.com \
    --cc=mingo@elte.hu \
    --cc=paulmck@linux.vnet.ibm.com \
    --cc=shemminger@vyatta.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.