From: Paul Mundt <lethal@linux-sh.org> To: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de>, Daniel Walker <dwalker@fifo99.com>, Linus Walleij <linus.ml.walleij@gmail.com>, Ingo Molnar <mingo@elte.hu>, Andrew Victor <linux@maxim.org.za>, Haavard Skinnemoen <hskinnemoen@atmel.com>, Andrew Morton <akpm@linux-foundation.org>, linux-kernel@vger.kernel.org, linux-sh@vger.kernel.org, linux-arm-kernel@lists.arm.linux.org.uk, John Stultz <johnstul@linux.vnet.ibm.com> Subject: Re: [PATCH] sched: Support current clocksource handling in fallback sched_clock(). Date: Thu, 28 May 2009 13:20:23 +0000 [thread overview] Message-ID: <20090528132023.GA29364@linux-sh.org> (raw) In-Reply-To: <1243515570.6600.96.camel@laptop> On Thu, May 28, 2009 at 02:59:30PM +0200, Peter Zijlstra wrote: > On Thu, 2009-05-28 at 21:42 +0900, Paul Mundt wrote: > > > unsigned long long __attribute__((weak)) sched_clock(void) > > { > > - return (unsigned long long)(jiffies - INITIAL_JIFFIES) > > - * (NSEC_PER_SEC / HZ); > > + struct clocksource *clock = ACCESS_ONCE(sched_clocksource); > > + > > + return cyc2ns(clock, clocksource_read(clock)); > > } > > > > > @@ -440,7 +444,17 @@ void clocksource_unregister(struct clocksource *cs) > > list_del(&cs->list); > > if (clocksource_override = cs) > > clocksource_override = NULL; > > + > > next_clocksource = select_clocksource(); > > + > > + /* > > + * If select_clocksource() fails to find another suitable > > + * clocksource for sched_clocksource and we are unregistering > > + * it, switch back to jiffies. > > + */ > > + if (sched_clocksource = cs) > > + sched_clocksource = &clocksource_jiffies; > > + > > spin_unlock_irqrestore(&clocksource_lock, flags); > > } > > > CPU0 CPU1 > > clock = ACCESS_ONCE(sched_clocksource); > > unload module > clocksource_unregister() > sched_clocksource = jiffies > unmap data/text > > cyc2ns(clock, clocksource_read(clock)) <--- fireworks > Right, lets try that again.. -- include/linux/clocksource.h | 4 +++- kernel/sched_clock.c | 13 +++++++++++-- kernel/time/clocksource.c | 19 +++++++++++++++++++ kernel/time/jiffies.c | 2 +- 4 files changed, 34 insertions(+), 4 deletions(-) diff --git a/include/linux/clocksource.h b/include/linux/clocksource.h index c56457c..2109940 100644 --- a/include/linux/clocksource.h +++ b/include/linux/clocksource.h @@ -202,7 +202,8 @@ struct clocksource { #endif }; -extern struct clocksource *clock; /* current clocksource */ +extern struct clocksource *clock; /* current clocksource */ +extern struct clocksource *sched_clocksource; /* sched_clock() clocksource */ /* * Clock source flags bits:: @@ -212,6 +213,7 @@ extern struct clocksource *clock; /* current clocksource */ #define CLOCK_SOURCE_WATCHDOG 0x10 #define CLOCK_SOURCE_VALID_FOR_HRES 0x20 +#define CLOCK_SOURCE_USE_FOR_SCHED_CLOCK 0x40 /* simplify initialization of mask field */ #define CLOCKSOURCE_MASK(bits) (cycle_t)((bits) < 64 ? ((1ULL<<(bits))-1) : -1) diff --git a/kernel/sched_clock.c b/kernel/sched_clock.c index e1d16c9..b51d48d 100644 --- a/kernel/sched_clock.c +++ b/kernel/sched_clock.c @@ -30,6 +30,8 @@ #include <linux/percpu.h> #include <linux/ktime.h> #include <linux/sched.h> +#include <linux/clocksource.h> +#include <linux/rcupdate.h> /* * Scheduler clock - returns current time in nanosec units. @@ -38,8 +40,15 @@ */ unsigned long long __attribute__((weak)) sched_clock(void) { - return (unsigned long long)(jiffies - INITIAL_JIFFIES) - * (NSEC_PER_SEC / HZ); + unsigned long long time; + struct clocksource *clock; + + rcu_read_lock(); + clock = rcu_dereference(sched_clocksource); + time = cyc2ns(clock, clocksource_read(clock)); + rcu_read_unlock(); + + return time; } static __read_mostly int sched_clock_running; diff --git a/kernel/time/clocksource.c b/kernel/time/clocksource.c index 80189f6..3795954 100644 --- a/kernel/time/clocksource.c +++ b/kernel/time/clocksource.c @@ -25,6 +25,7 @@ */ #include <linux/clocksource.h> +#include <linux/rcupdate.h> #include <linux/sysdev.h> #include <linux/init.h> #include <linux/module.h> @@ -109,6 +110,7 @@ EXPORT_SYMBOL(timecounter_cyc2time); /* XXX - Would like a better way for initializing curr_clocksource */ extern struct clocksource clocksource_jiffies; +struct clocksource *sched_clocksource = &clocksource_jiffies; /*[Clocksource internal variables]--------- * curr_clocksource: @@ -362,6 +364,9 @@ static struct clocksource *select_clocksource(void) if (next = curr_clocksource) return NULL; + if (next->flags & CLOCK_SOURCE_USE_FOR_SCHED_CLOCK) + sched_clocksource = next; + return next; } @@ -440,7 +445,21 @@ void clocksource_unregister(struct clocksource *cs) list_del(&cs->list); if (clocksource_override = cs) clocksource_override = NULL; + next_clocksource = select_clocksource(); + + /* + * If select_clocksource() fails to find another suitable + * clocksource for sched_clocksource and we are unregistering + * it, switch back to jiffies. + */ + if (sched_clocksource = cs) { + rcu_assign_pointer(sched_clocksource, &clocksource_jiffies); + spin_unlock_irqrestore(&clocksource_lock, flags); + synchronize_rcu(); + return; + } + spin_unlock_irqrestore(&clocksource_lock, flags); } diff --git a/kernel/time/jiffies.c b/kernel/time/jiffies.c index c3f6c30..727d881 100644 --- a/kernel/time/jiffies.c +++ b/kernel/time/jiffies.c @@ -52,7 +52,7 @@ static cycle_t jiffies_read(struct clocksource *cs) { - return (cycle_t) jiffies; + return (cycle_t) (jiffies - INITIAL_JIFFIES); } struct clocksource clocksource_jiffies = {
WARNING: multiple messages have this Message-ID (diff)
From: Paul Mundt <lethal@linux-sh.org> To: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de>, Daniel Walker <dwalker@fifo99.com>, Linus Walleij <linus.ml.walleij@gmail.com>, Ingo Molnar <mingo@elte.hu>, Andrew Victor <linux@maxim.org.za>, Haavard Skinnemoen <hskinnemoen@atmel.com>, Andrew Morton <akpm@linux-foundation.org>, linux-kernel@vger.kernel.org, linux-sh@vger.kernel.org, linux-arm-kernel@lists.arm.linux.org.uk, John Stultz <johnstul@linux.vnet.ibm.com> Subject: Re: [PATCH] sched: Support current clocksource handling in fallback sched_clock(). Date: Thu, 28 May 2009 22:20:23 +0900 [thread overview] Message-ID: <20090528132023.GA29364@linux-sh.org> (raw) In-Reply-To: <1243515570.6600.96.camel@laptop> On Thu, May 28, 2009 at 02:59:30PM +0200, Peter Zijlstra wrote: > On Thu, 2009-05-28 at 21:42 +0900, Paul Mundt wrote: > > > unsigned long long __attribute__((weak)) sched_clock(void) > > { > > - return (unsigned long long)(jiffies - INITIAL_JIFFIES) > > - * (NSEC_PER_SEC / HZ); > > + struct clocksource *clock = ACCESS_ONCE(sched_clocksource); > > + > > + return cyc2ns(clock, clocksource_read(clock)); > > } > > > > > @@ -440,7 +444,17 @@ void clocksource_unregister(struct clocksource *cs) > > list_del(&cs->list); > > if (clocksource_override == cs) > > clocksource_override = NULL; > > + > > next_clocksource = select_clocksource(); > > + > > + /* > > + * If select_clocksource() fails to find another suitable > > + * clocksource for sched_clocksource and we are unregistering > > + * it, switch back to jiffies. > > + */ > > + if (sched_clocksource == cs) > > + sched_clocksource = &clocksource_jiffies; > > + > > spin_unlock_irqrestore(&clocksource_lock, flags); > > } > > > CPU0 CPU1 > > clock = ACCESS_ONCE(sched_clocksource); > > unload module > clocksource_unregister() > sched_clocksource = jiffies > unmap data/text > > cyc2ns(clock, clocksource_read(clock)) <--- fireworks > Right, lets try that again.. -- include/linux/clocksource.h | 4 +++- kernel/sched_clock.c | 13 +++++++++++-- kernel/time/clocksource.c | 19 +++++++++++++++++++ kernel/time/jiffies.c | 2 +- 4 files changed, 34 insertions(+), 4 deletions(-) diff --git a/include/linux/clocksource.h b/include/linux/clocksource.h index c56457c..2109940 100644 --- a/include/linux/clocksource.h +++ b/include/linux/clocksource.h @@ -202,7 +202,8 @@ struct clocksource { #endif }; -extern struct clocksource *clock; /* current clocksource */ +extern struct clocksource *clock; /* current clocksource */ +extern struct clocksource *sched_clocksource; /* sched_clock() clocksource */ /* * Clock source flags bits:: @@ -212,6 +213,7 @@ extern struct clocksource *clock; /* current clocksource */ #define CLOCK_SOURCE_WATCHDOG 0x10 #define CLOCK_SOURCE_VALID_FOR_HRES 0x20 +#define CLOCK_SOURCE_USE_FOR_SCHED_CLOCK 0x40 /* simplify initialization of mask field */ #define CLOCKSOURCE_MASK(bits) (cycle_t)((bits) < 64 ? ((1ULL<<(bits))-1) : -1) diff --git a/kernel/sched_clock.c b/kernel/sched_clock.c index e1d16c9..b51d48d 100644 --- a/kernel/sched_clock.c +++ b/kernel/sched_clock.c @@ -30,6 +30,8 @@ #include <linux/percpu.h> #include <linux/ktime.h> #include <linux/sched.h> +#include <linux/clocksource.h> +#include <linux/rcupdate.h> /* * Scheduler clock - returns current time in nanosec units. @@ -38,8 +40,15 @@ */ unsigned long long __attribute__((weak)) sched_clock(void) { - return (unsigned long long)(jiffies - INITIAL_JIFFIES) - * (NSEC_PER_SEC / HZ); + unsigned long long time; + struct clocksource *clock; + + rcu_read_lock(); + clock = rcu_dereference(sched_clocksource); + time = cyc2ns(clock, clocksource_read(clock)); + rcu_read_unlock(); + + return time; } static __read_mostly int sched_clock_running; diff --git a/kernel/time/clocksource.c b/kernel/time/clocksource.c index 80189f6..3795954 100644 --- a/kernel/time/clocksource.c +++ b/kernel/time/clocksource.c @@ -25,6 +25,7 @@ */ #include <linux/clocksource.h> +#include <linux/rcupdate.h> #include <linux/sysdev.h> #include <linux/init.h> #include <linux/module.h> @@ -109,6 +110,7 @@ EXPORT_SYMBOL(timecounter_cyc2time); /* XXX - Would like a better way for initializing curr_clocksource */ extern struct clocksource clocksource_jiffies; +struct clocksource *sched_clocksource = &clocksource_jiffies; /*[Clocksource internal variables]--------- * curr_clocksource: @@ -362,6 +364,9 @@ static struct clocksource *select_clocksource(void) if (next == curr_clocksource) return NULL; + if (next->flags & CLOCK_SOURCE_USE_FOR_SCHED_CLOCK) + sched_clocksource = next; + return next; } @@ -440,7 +445,21 @@ void clocksource_unregister(struct clocksource *cs) list_del(&cs->list); if (clocksource_override == cs) clocksource_override = NULL; + next_clocksource = select_clocksource(); + + /* + * If select_clocksource() fails to find another suitable + * clocksource for sched_clocksource and we are unregistering + * it, switch back to jiffies. + */ + if (sched_clocksource == cs) { + rcu_assign_pointer(sched_clocksource, &clocksource_jiffies); + spin_unlock_irqrestore(&clocksource_lock, flags); + synchronize_rcu(); + return; + } + spin_unlock_irqrestore(&clocksource_lock, flags); } diff --git a/kernel/time/jiffies.c b/kernel/time/jiffies.c index c3f6c30..727d881 100644 --- a/kernel/time/jiffies.c +++ b/kernel/time/jiffies.c @@ -52,7 +52,7 @@ static cycle_t jiffies_read(struct clocksource *cs) { - return (cycle_t) jiffies; + return (cycle_t) (jiffies - INITIAL_JIFFIES); } struct clocksource clocksource_jiffies = {
next prev parent reply other threads:[~2009-05-28 13:20 UTC|newest] Thread overview: 114+ messages / expand[flat|nested] mbox.gz Atom feed top 2009-05-26 6:15 [PATCH] sched: Support current clocksource handling in fallback sched_clock() Paul Mundt 2009-05-26 6:15 ` Paul Mundt 2009-05-26 14:31 ` [PATCH] sched: Support current clocksource handling in fallback Linus Walleij 2009-05-26 14:31 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Linus Walleij 2009-05-26 14:38 ` [PATCH] sched: Support current clocksource handling in Peter Zijlstra 2009-05-26 14:38 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Peter Zijlstra 2009-05-26 20:17 ` [PATCH] sched: Support current clocksource handling in fallback Thomas Gleixner 2009-05-26 20:17 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Thomas Gleixner 2009-05-26 23:08 ` Paul Mundt 2009-05-26 23:08 ` Paul Mundt 2009-05-26 23:13 ` Paul Mundt 2009-05-26 23:13 ` Paul Mundt 2009-05-26 23:25 ` [PATCH] sched: Support current clocksource handling in john stultz 2009-05-26 23:25 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() john stultz 2009-05-26 23:44 ` Paul Mundt 2009-05-26 23:44 ` Paul Mundt 2009-05-27 0:18 ` [PATCH] sched: Support current clocksource handling in fallback Thomas Gleixner 2009-05-27 0:18 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Thomas Gleixner 2009-05-27 0:22 ` [PATCH] sched: Support current clocksource handling in john stultz 2009-05-27 0:22 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() john stultz 2009-05-27 0:26 ` Paul Mundt 2009-05-27 0:26 ` Paul Mundt 2009-05-27 1:09 ` [PATCH] sched: Support current clocksource handling in john stultz 2009-05-27 1:09 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() john stultz 2009-05-27 0:27 ` [PATCH] sched: Support current clocksource handling in fallback Thomas Gleixner 2009-05-27 0:27 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Thomas Gleixner 2009-05-26 23:49 ` [PATCH] sched: Support current clocksource handling in fallback Thomas Gleixner 2009-05-26 23:49 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Thomas Gleixner 2009-05-27 0:15 ` Paul Mundt 2009-05-27 0:15 ` Paul Mundt 2009-05-27 16:25 ` [PATCH] sched: Support current clocksource handling in Daniel Walker 2009-05-27 16:25 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Daniel Walker 2009-05-28 8:44 ` Paul Mundt 2009-05-28 8:44 ` Paul Mundt 2009-05-28 9:19 ` Paul Mundt 2009-05-28 9:19 ` Paul Mundt 2009-05-28 9:34 ` [PATCH] sched: Support current clocksource handling in Peter Zijlstra 2009-05-28 9:34 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Peter Zijlstra 2009-05-28 11:09 ` Paul Mundt 2009-05-28 11:09 ` Paul Mundt 2009-05-28 12:22 ` [PATCH] sched: Support current clocksource handling in fallback Thomas Gleixner 2009-05-28 12:22 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Thomas Gleixner 2009-05-28 12:40 ` [PATCH] sched: Support current clocksource handling in Peter Zijlstra 2009-05-28 12:40 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Peter Zijlstra 2009-05-28 12:42 ` Paul Mundt 2009-05-28 12:42 ` Paul Mundt 2009-05-28 12:53 ` [PATCH] sched: Support current clocksource handling in fallback Thomas Gleixner 2009-05-28 12:53 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Thomas Gleixner 2009-05-28 12:59 ` [PATCH] sched: Support current clocksource handling in Peter Zijlstra 2009-05-28 12:59 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Peter Zijlstra 2009-05-28 13:20 ` Paul Mundt [this message] 2009-05-28 13:20 ` Paul Mundt 2009-05-28 16:13 ` [PATCH] sched: Support current clocksource handling in Daniel Walker 2009-05-28 16:13 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Daniel Walker 2009-05-28 16:32 ` [PATCH] sched: Support current clocksource handling in Peter Zijlstra 2009-05-28 16:32 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Peter Zijlstra 2009-05-28 16:40 ` Paul Mundt 2009-05-28 16:40 ` Paul Mundt 2009-05-28 16:52 ` [PATCH] sched: Support current clocksource handling in Daniel Walker 2009-05-28 16:52 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Daniel Walker 2009-05-28 16:58 ` Paul Mundt 2009-05-28 16:58 ` Paul Mundt 2009-05-28 17:38 ` [PATCH] sched: Support current clocksource handling in Daniel Walker 2009-05-28 17:38 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Daniel Walker 2009-05-28 17:46 ` [PATCH] sched: Support current clocksource handling in fallback Thomas Gleixner 2009-05-28 17:46 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Thomas Gleixner 2009-05-28 17:53 ` Paul Mundt 2009-05-28 17:53 ` Paul Mundt 2009-05-28 18:10 ` [PATCH] sched: Support current clocksource handling in Daniel Walker 2009-05-28 18:10 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Daniel Walker 2009-05-28 18:27 ` Paul Mundt 2009-05-28 18:27 ` Paul Mundt 2009-05-28 19:04 ` [PATCH] sched: Support current clocksource handling in Daniel Walker 2009-05-28 19:04 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Daniel Walker 2009-05-28 19:34 ` Paul Mundt 2009-05-28 19:34 ` Paul Mundt 2009-05-28 19:41 ` [PATCH] sched: Support current clocksource handling in Daniel Walker 2009-05-28 19:41 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Daniel Walker 2009-05-28 23:37 ` Paul Mundt 2009-05-28 23:37 ` Paul Mundt 2009-05-28 18:44 ` [PATCH] sched: Support current clocksource handling in fallback Thomas Gleixner 2009-05-28 18:44 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Thomas Gleixner 2009-05-28 17:00 ` [PATCH] sched: Support current clocksource handling in fallback Thomas Gleixner 2009-05-28 17:00 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Thomas Gleixner 2009-05-28 17:07 ` [PATCH] sched: Support current clocksource handling in John Stultz 2009-05-28 17:07 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() John Stultz 2009-05-26 20:23 ` [PATCH] sched: Support current clocksource handling in john stultz 2009-05-26 20:23 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() john stultz 2009-05-26 20:30 ` [PATCH] sched: Support current clocksource handling in Peter Zijlstra 2009-05-26 20:30 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Peter Zijlstra 2009-05-26 20:40 ` [PATCH] sched: Support current clocksource handling in john stultz 2009-05-26 20:40 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() john stultz 2009-05-26 20:55 ` [PATCH] sched: Support current clocksource handling in Peter Zijlstra 2009-05-26 20:55 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Peter Zijlstra 2009-05-26 23:00 ` [PATCH] sched: Support current clocksource handling in john stultz 2009-05-26 23:00 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() john stultz 2009-05-26 23:24 ` [PATCH] sched: Support current clocksource handling in fallback Mangalampalli, JayantX 2009-05-26 23:24 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Mangalampalli, JayantX 2009-05-27 0:04 ` [PATCH] sched: Support current clocksource handling in fallback Thomas Gleixner 2009-05-27 0:04 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Thomas Gleixner 2009-05-26 23:39 ` [PATCH] sched: Support current clocksource handling in fallback Thomas Gleixner 2009-05-26 23:39 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Thomas Gleixner 2009-05-27 6:58 ` [PATCH] sched: Support current clocksource handling in Peter Zijlstra 2009-05-27 6:58 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Peter Zijlstra 2009-05-26 20:39 ` [PATCH] sched: Support current clocksource handling in fallback Thomas Gleixner 2009-05-26 20:39 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Thomas Gleixner 2009-05-26 14:43 ` Paul Mundt 2009-05-26 14:43 ` Paul Mundt 2009-05-26 14:50 ` [PATCH] sched: Support current clocksource handling in Peter Zijlstra 2009-05-26 14:50 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Peter Zijlstra 2009-05-26 14:53 ` Paul Mundt 2009-05-26 14:53 ` Paul Mundt 2009-05-26 15:02 ` [PATCH] sched: Support current clocksource handling in fallback Matthieu CASTET 2009-05-26 15:02 ` [PATCH] sched: Support current clocksource handling in fallback sched_clock() Matthieu CASTET
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=20090528132023.GA29364@linux-sh.org \ --to=lethal@linux-sh.org \ --cc=akpm@linux-foundation.org \ --cc=dwalker@fifo99.com \ --cc=hskinnemoen@atmel.com \ --cc=johnstul@linux.vnet.ibm.com \ --cc=linus.ml.walleij@gmail.com \ --cc=linux-arm-kernel@lists.arm.linux.org.uk \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-sh@vger.kernel.org \ --cc=linux@maxim.org.za \ --cc=mingo@elte.hu \ --cc=peterz@infradead.org \ --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: linkBe 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.