From: Peter Zijlstra <peterz@infradead.org>
To: x86@kernel.org
Cc: peterz@infradead.org, linux-kernel@vger.kernel.org,
rostedt@goodmis.org, mhiramat@kernel.org, bristot@redhat.com,
jbaron@akamai.com, torvalds@linux-foundation.org,
tglx@linutronix.de, mingo@kernel.org, namit@vmware.com,
hpa@zytor.com, luto@kernel.org, ard.biesheuvel@linaro.org,
jpoimboe@redhat.com
Subject: [PATCH v2 08/13] tracepoints: Use static_call
Date: Mon, 07 Oct 2019 10:27:16 +0200 [thread overview]
Message-ID: <20191007083830.98511141.6@infradead.org> (raw)
In-Reply-To: 20191007082708.01393931.1@infradead.org
From: Steven Rostedt <rostedt@goodmis.org>
[peterz: updated to new interface]
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
---
include/linux/tracepoint-defs.h | 5 ++
include/linux/tracepoint.h | 75 ++++++++++++++++++++++++++--------------
include/trace/define_trace.h | 14 +++----
kernel/tracepoint.c | 19 ++++++++--
4 files changed, 77 insertions(+), 36 deletions(-)
--- a/include/linux/tracepoint-defs.h
+++ b/include/linux/tracepoint-defs.h
@@ -11,6 +11,8 @@
#include <linux/atomic.h>
#include <linux/static_key.h>
+struct static_call_key;
+
struct trace_print_flags {
unsigned long mask;
const char *name;
@@ -30,6 +32,9 @@ struct tracepoint_func {
struct tracepoint {
const char *name; /* Tracepoint name */
struct static_key key;
+ struct static_call_key *static_call_key;
+ void *static_call_tramp;
+ void *iterator;
int (*regfunc)(void);
void (*unregfunc)(void);
struct tracepoint_func __rcu *funcs;
--- a/include/linux/tracepoint.h
+++ b/include/linux/tracepoint.h
@@ -19,6 +19,7 @@
#include <linux/cpumask.h>
#include <linux/rcupdate.h>
#include <linux/tracepoint-defs.h>
+#include <linux/static_call.h>
struct module;
struct tracepoint;
@@ -92,7 +93,9 @@ extern int syscall_regfunc(void);
extern void syscall_unregfunc(void);
#endif /* CONFIG_HAVE_SYSCALL_TRACEPOINTS */
+#ifndef PARAMS
#define PARAMS(args...) args
+#endif
#define TRACE_DEFINE_ENUM(x)
#define TRACE_DEFINE_SIZEOF(x)
@@ -159,12 +162,11 @@ static inline struct tracepoint *tracepo
* as "(void *, void)". The DECLARE_TRACE_NOARGS() will pass in just
* "void *data", where as the DECLARE_TRACE() will pass in "void *data, proto".
*/
-#define __DO_TRACE(tp, proto, args, cond, rcuidle) \
+#define __DO_TRACE(name, proto, args, cond, rcuidle) \
do { \
struct tracepoint_func *it_func_ptr; \
- void *it_func; \
- void *__data; \
int __maybe_unused __idx = 0; \
+ void *__data; \
\
if (!(cond)) \
return; \
@@ -184,14 +186,11 @@ static inline struct tracepoint *tracepo
rcu_irq_enter_irqson(); \
} \
\
- it_func_ptr = rcu_dereference_raw((tp)->funcs); \
- \
+ it_func_ptr = \
+ rcu_dereference_raw((&__tracepoint_##name)->funcs); \
if (it_func_ptr) { \
- do { \
- it_func = (it_func_ptr)->func; \
- __data = (it_func_ptr)->data; \
- ((void(*)(proto))(it_func))(args); \
- } while ((++it_func_ptr)->func); \
+ __data = (it_func_ptr)->data; \
+ static_call(tp_func_##name)(args); \
} \
\
if (rcuidle) { \
@@ -207,7 +206,7 @@ static inline struct tracepoint *tracepo
static inline void trace_##name##_rcuidle(proto) \
{ \
if (static_key_false(&__tracepoint_##name.key)) \
- __DO_TRACE(&__tracepoint_##name, \
+ __DO_TRACE(name, \
TP_PROTO(data_proto), \
TP_ARGS(data_args), \
TP_CONDITION(cond), 1); \
@@ -229,11 +228,13 @@ static inline struct tracepoint *tracepo
* poking RCU a bit.
*/
#define __DECLARE_TRACE(name, proto, args, cond, data_proto, data_args) \
+ extern int __tracepoint_iter_##name(data_proto); \
+ DECLARE_STATIC_CALL(tp_func_##name, __tracepoint_iter_##name); \
extern struct tracepoint __tracepoint_##name; \
static inline void trace_##name(proto) \
{ \
if (static_key_false(&__tracepoint_##name.key)) \
- __DO_TRACE(&__tracepoint_##name, \
+ __DO_TRACE(name, \
TP_PROTO(data_proto), \
TP_ARGS(data_args), \
TP_CONDITION(cond), 0); \
@@ -279,21 +280,45 @@ static inline struct tracepoint *tracepo
* structures, so we create an array of pointers that will be used for iteration
* on the tracepoints.
*/
-#define DEFINE_TRACE_FN(name, reg, unreg) \
- static const char __tpstrtab_##name[] \
- __attribute__((section("__tracepoints_strings"))) = #name; \
- struct tracepoint __tracepoint_##name \
- __attribute__((section("__tracepoints"), used)) = \
- { __tpstrtab_##name, STATIC_KEY_INIT_FALSE, reg, unreg, NULL };\
- __TRACEPOINT_ENTRY(name);
+#define DEFINE_TRACE_FN(name, reg, unreg, proto, args) \
+ static const char __tpstrtab_##name[] \
+ __attribute__((section("__tracepoints_strings"))) = #name; \
+ extern struct static_call_key tp_func_##name; \
+ int __tracepoint_iter_##name(void *__data, proto); \
+ struct tracepoint __tracepoint_##name \
+ __attribute__((section("__tracepoints"), used)) = \
+ { __tpstrtab_##name, STATIC_KEY_INIT_FALSE, \
+ &STATIC_CALL_NAME(tp_func_##name), \
+ &STATIC_CALL_TRAMP(tp_func_##name), \
+ &__tracepoint_iter_##name, \
+ reg, unreg, NULL }; \
+ __TRACEPOINT_ENTRY(name); \
+ int __tracepoint_iter_##name(void *__data, proto) \
+ { \
+ struct tracepoint_func *it_func_ptr; \
+ void *it_func; \
+ \
+ it_func_ptr = \
+ rcu_dereference_raw((&__tracepoint_##name)->funcs); \
+ do { \
+ it_func = (it_func_ptr)->func; \
+ __data = (it_func_ptr)->data; \
+ ((void(*)(void *, proto))(it_func))(__data, args); \
+ } while ((++it_func_ptr)->func); \
+ return 0; \
+ } \
+ DEFINE_STATIC_CALL(tp_func_##name, __tracepoint_iter_##name);
-#define DEFINE_TRACE(name) \
- DEFINE_TRACE_FN(name, NULL, NULL);
+#define DEFINE_TRACE(name, proto, args) \
+ DEFINE_TRACE_FN(name, NULL, NULL, PARAMS(proto), PARAMS(args));
#define EXPORT_TRACEPOINT_SYMBOL_GPL(name) \
- EXPORT_SYMBOL_GPL(__tracepoint_##name)
+ EXPORT_SYMBOL_GPL(__tracepoint_##name); \
+ EXPORT_STATIC_CALL_GPL(tp_func_##name)
#define EXPORT_TRACEPOINT_SYMBOL(name) \
- EXPORT_SYMBOL(__tracepoint_##name)
+ EXPORT_SYMBOL(__tracepoint_##name); \
+ EXPORT_STATIC_CALL(tp_func_##name)
+
#else /* !TRACEPOINTS_ENABLED */
#define __DECLARE_TRACE(name, proto, args, cond, data_proto, data_args) \
@@ -322,8 +347,8 @@ static inline struct tracepoint *tracepo
return false; \
}
-#define DEFINE_TRACE_FN(name, reg, unreg)
-#define DEFINE_TRACE(name)
+#define DEFINE_TRACE_FN(name, reg, unreg, proto, args)
+#define DEFINE_TRACE(name, proto, args)
#define EXPORT_TRACEPOINT_SYMBOL_GPL(name)
#define EXPORT_TRACEPOINT_SYMBOL(name)
--- a/include/trace/define_trace.h
+++ b/include/trace/define_trace.h
@@ -25,7 +25,7 @@
#undef TRACE_EVENT
#define TRACE_EVENT(name, proto, args, tstruct, assign, print) \
- DEFINE_TRACE(name)
+ DEFINE_TRACE(name, PARAMS(proto), PARAMS(args))
#undef TRACE_EVENT_CONDITION
#define TRACE_EVENT_CONDITION(name, proto, args, cond, tstruct, assign, print) \
@@ -39,12 +39,12 @@
#undef TRACE_EVENT_FN
#define TRACE_EVENT_FN(name, proto, args, tstruct, \
assign, print, reg, unreg) \
- DEFINE_TRACE_FN(name, reg, unreg)
+ DEFINE_TRACE_FN(name, reg, unreg, PARAMS(proto), PARAMS(args))
#undef TRACE_EVENT_FN_COND
#define TRACE_EVENT_FN_COND(name, proto, args, cond, tstruct, \
assign, print, reg, unreg) \
- DEFINE_TRACE_FN(name, reg, unreg)
+ DEFINE_TRACE_FN(name, reg, unreg, PARAMS(proto), PARAMS(args))
#undef TRACE_EVENT_NOP
#define TRACE_EVENT_NOP(name, proto, args, struct, assign, print)
@@ -54,15 +54,15 @@
#undef DEFINE_EVENT
#define DEFINE_EVENT(template, name, proto, args) \
- DEFINE_TRACE(name)
+ DEFINE_TRACE(name, PARAMS(proto), PARAMS(args))
#undef DEFINE_EVENT_FN
#define DEFINE_EVENT_FN(template, name, proto, args, reg, unreg) \
- DEFINE_TRACE_FN(name, reg, unreg)
+ DEFINE_TRACE_FN(name, reg, unreg, PARAMS(proto), PARAMS(args))
#undef DEFINE_EVENT_PRINT
#define DEFINE_EVENT_PRINT(template, name, proto, args, print) \
- DEFINE_TRACE(name)
+ DEFINE_TRACE(name, PARAMS(proto), PARAMS(args))
#undef DEFINE_EVENT_CONDITION
#define DEFINE_EVENT_CONDITION(template, name, proto, args, cond) \
@@ -70,7 +70,7 @@
#undef DECLARE_TRACE
#define DECLARE_TRACE(name, proto, args) \
- DEFINE_TRACE(name)
+ DEFINE_TRACE(name, PARAMS(proto), PARAMS(args))
#undef TRACE_INCLUDE
#undef __TRACE_INCLUDE
--- a/kernel/tracepoint.c
+++ b/kernel/tracepoint.c
@@ -127,7 +127,7 @@ static void debug_print_probes(struct tr
static struct tracepoint_func *
func_add(struct tracepoint_func **funcs, struct tracepoint_func *tp_func,
- int prio)
+ int prio, int *tot_probes)
{
struct tracepoint_func *old, *new;
int nr_probes = 0;
@@ -170,11 +170,12 @@ func_add(struct tracepoint_func **funcs,
new[nr_probes + 1].func = NULL;
*funcs = new;
debug_print_probes(*funcs);
+ *tot_probes = nr_probes + 1;
return old;
}
static void *func_remove(struct tracepoint_func **funcs,
- struct tracepoint_func *tp_func)
+ struct tracepoint_func *tp_func, int *left)
{
int nr_probes = 0, nr_del = 0, i;
struct tracepoint_func *old, *new;
@@ -228,6 +229,7 @@ static int tracepoint_add_func(struct tr
struct tracepoint_func *func, int prio)
{
struct tracepoint_func *old, *tp_funcs;
+ int probes = 0;
int ret;
if (tp->regfunc && !static_key_enabled(&tp->key)) {
@@ -238,7 +240,7 @@ static int tracepoint_add_func(struct tr
tp_funcs = rcu_dereference_protected(tp->funcs,
lockdep_is_held(&tracepoints_mutex));
- old = func_add(&tp_funcs, func, prio);
+ old = func_add(&tp_funcs, func, prio, &probes);
if (IS_ERR(old)) {
WARN_ON_ONCE(PTR_ERR(old) != -ENOMEM);
return PTR_ERR(old);
@@ -253,6 +255,10 @@ static int tracepoint_add_func(struct tr
rcu_assign_pointer(tp->funcs, tp_funcs);
if (!static_key_enabled(&tp->key))
static_key_slow_inc(&tp->key);
+
+ __static_call_update(tp->static_call_key, tp->static_call_tramp,
+ probes == 1 ? tp_funcs->func : tp->iterator);
+
release_probes(old);
return 0;
}
@@ -267,10 +273,11 @@ static int tracepoint_remove_func(struct
struct tracepoint_func *func)
{
struct tracepoint_func *old, *tp_funcs;
+ int probes_left = 0;
tp_funcs = rcu_dereference_protected(tp->funcs,
lockdep_is_held(&tracepoints_mutex));
- old = func_remove(&tp_funcs, func);
+ old = func_remove(&tp_funcs, func, &probes_left);
if (IS_ERR(old)) {
WARN_ON_ONCE(PTR_ERR(old) != -ENOMEM);
return PTR_ERR(old);
@@ -284,6 +291,10 @@ static int tracepoint_remove_func(struct
if (static_key_enabled(&tp->key))
static_key_slow_dec(&tp->key);
}
+
+ __static_call_update(tp->static_call_key, tp->static_call_tramp,
+ probes_left == 1 ? tp_funcs->func : tp->iterator);
+
rcu_assign_pointer(tp->funcs, tp_funcs);
release_probes(old);
return 0;
next prev parent reply other threads:[~2019-10-07 11:25 UTC|newest]
Thread overview: 128+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-10-07 9:02 [RESEND] everything text-poke: ftrace, modules, static_call and jump_label Peter Zijlstra
2019-10-07 8:17 ` [PATCH v3 0/6] Rewrite x86/ftrace to use text_poke() Peter Zijlstra
2019-10-07 8:17 ` [PATCH v3 1/6] x86/alternatives: Teach text_poke_bp() to emulate instructions Peter Zijlstra
2019-10-08 14:29 ` Borislav Petkov
2019-10-08 14:40 ` Steven Rostedt
2019-10-08 14:50 ` Borislav Petkov
2019-10-08 14:48 ` Peter Zijlstra
2019-10-08 14:54 ` Borislav Petkov
2019-10-08 15:04 ` Steven Rostedt
2019-10-08 15:24 ` Borislav Petkov
2019-10-09 12:03 ` Daniel Bristot de Oliveira
2019-10-07 8:17 ` [PATCH v3 2/6] x86/alternatives: Update int3_emulate_push() comment Peter Zijlstra
2019-10-07 8:17 ` [PATCH v3 3/6] x86/alternatives,jump_label: Provide better text_poke() batching interface Peter Zijlstra
2019-10-09 12:04 ` Daniel Bristot de Oliveira
2019-10-07 8:17 ` [PATCH v3 4/6] x86/alternatives: Add and use text_gen_insn() helper Peter Zijlstra
2019-10-08 6:23 ` Masami Hiramatsu
2019-10-08 8:15 ` Peter Zijlstra
2019-10-07 8:17 ` [PATCH v3 5/6] x86/ftrace: Use text_poke() Peter Zijlstra
2019-10-08 14:43 ` Steven Rostedt
2019-10-08 17:11 ` Peter Zijlstra
2019-10-08 17:27 ` Steven Rostedt
2019-10-10 2:41 ` Steven Rostedt
2019-10-10 9:20 ` Peter Zijlstra
2019-10-10 13:19 ` Steven Rostedt
2019-10-10 14:05 ` Peter Zijlstra
2019-10-10 15:54 ` Steven Rostedt
2019-10-10 17:28 ` Peter Zijlstra
2019-10-10 17:48 ` Steven Rostedt
2019-10-11 10:45 ` Peter Zijlstra
2019-10-11 10:47 ` Peter Zijlstra
2019-10-11 10:50 ` Peter Zijlstra
2019-10-11 12:59 ` Peter Zijlstra
2019-10-11 13:33 ` Steven Rostedt
2019-10-11 13:45 ` Peter Zijlstra
2019-10-15 13:07 ` Jessica Yu
2019-10-15 13:56 ` Peter Zijlstra
2019-10-15 14:11 ` Peter Zijlstra
2019-10-15 14:13 ` Miroslav Benes
2019-10-15 15:06 ` Joe Lawrence
2019-10-15 15:31 ` Jessica Yu
2019-10-15 22:17 ` Joe Lawrence
2019-10-15 22:27 ` Steven Rostedt
2019-10-16 7:42 ` Peter Zijlstra
2019-10-16 10:15 ` Miroslav Benes
2019-10-21 15:05 ` Josh Poimboeuf
2020-01-20 16:50 ` Josh Poimboeuf
2020-01-21 8:35 ` Miroslav Benes
2020-01-21 16:10 ` Josh Poimboeuf
2020-01-22 10:09 ` Miroslav Benes
2020-01-22 21:42 ` Josh Poimboeuf
2020-01-28 9:28 ` Miroslav Benes
2020-01-28 15:00 ` Josh Poimboeuf
2020-01-28 15:40 ` Petr Mladek
2020-01-28 17:02 ` Josh Poimboeuf
2020-01-29 0:46 ` Jiri Kosina
2020-01-29 2:17 ` Josh Poimboeuf
2020-01-29 3:14 ` Jiri Kosina
2020-01-29 12:28 ` Miroslav Benes
2020-01-29 15:59 ` Josh Poimboeuf
2020-01-30 9:53 ` Petr Mladek
2020-01-30 14:17 ` Josh Poimboeuf
2020-01-31 7:17 ` Petr Mladek
2020-01-22 12:15 ` Miroslav Benes
2020-01-22 15:05 ` Miroslav Benes
2020-01-22 22:03 ` Josh Poimboeuf
2020-01-23 10:19 ` Martin Jambor
2019-10-16 7:49 ` Peter Zijlstra
2019-10-16 10:20 ` Miroslav Benes
2019-10-16 13:29 ` Miroslav Benes
2019-10-18 13:03 ` Jessica Yu
2019-10-18 13:40 ` Petr Mladek
2019-10-21 14:14 ` Jessica Yu
2019-10-21 15:31 ` Josh Poimboeuf
2019-10-22 8:27 ` Miroslav Benes
2019-10-22 14:31 ` Josh Poimboeuf
2019-10-23 9:04 ` Miroslav Benes
2019-10-16 6:51 ` Miroslav Benes
2019-10-16 9:23 ` Peter Zijlstra
2019-10-16 9:36 ` Jessica Yu
2019-10-16 9:51 ` Peter Zijlstra
2019-10-16 12:39 ` Peter Zijlstra
2019-10-22 8:45 ` Miroslav Benes
2019-10-15 14:42 ` Peter Zijlstra
2019-10-15 18:31 ` Peter Zijlstra
2019-10-15 15:51 ` Jessica Yu
2019-10-15 13:28 ` Steven Rostedt
2019-10-15 13:42 ` Peter Zijlstra
2019-10-15 16:09 ` Jessica Yu
2019-10-07 8:17 ` [PATCH v3 6/6] x86/mm: Remove set_kernel_text_r[ow]() Peter Zijlstra
2019-10-08 15:07 ` [PATCH v3 0/6] Rewrite x86/ftrace to use text_poke() Steven Rostedt
2019-10-07 8:25 ` [PATCH v2 0/4] Propagate module notifier errors Peter Zijlstra
2019-10-07 8:25 ` [PATCH v2 1/4] notifier: Fix broken error handling pattern Peter Zijlstra
2019-10-10 22:01 ` Rafael J. Wysocki
2019-10-07 8:25 ` [PATCH v2 2/4] module: Fix up module_notifier return values Peter Zijlstra
2019-10-23 19:25 ` Steven Rostedt
2019-10-07 8:25 ` [PATCH v2 3/4] module: Properly propagate MODULE_STATE_COMING failure Peter Zijlstra
2019-10-08 13:08 ` Miroslav Benes
2019-10-07 8:25 ` [PATCH v2 4/4] jump_label,module: Fix module lifetime for __jump_label_mod_text_reserved Peter Zijlstra
2019-10-23 19:29 ` Steven Rostedt
2019-10-07 8:27 ` [PATCH v2 00/13] Add static_call() Peter Zijlstra
2019-10-07 8:27 ` [PATCH v2 01/13] compiler.h: Make __ADDRESSABLE() symbol truly unique Peter Zijlstra
2019-10-07 8:27 ` [PATCH v2 02/13] static_call: Add basic static call infrastructure Peter Zijlstra
2019-10-07 11:33 ` Peter Zijlstra
2019-10-07 8:27 ` [PATCH v2 03/13] static_call: Add inline " Peter Zijlstra
2019-10-07 8:27 ` [PATCH v2 04/13] static_call: Avoid kprobes on inline static_call()s Peter Zijlstra
2019-10-07 8:27 ` [PATCH v2 05/13] x86/static_call: Add out-of-line static call implementation Peter Zijlstra
2019-10-07 8:27 ` [PATCH v2 06/13] x86/static_call: Add inline static call implementation for x86-64 Peter Zijlstra
2019-10-07 8:27 ` [PATCH v2 07/13] static_call: Simple self-test Peter Zijlstra
2019-10-07 8:27 ` Peter Zijlstra [this message]
2019-10-07 8:27 ` [PATCH v2 09/13] x86/alternatives: Teach text_poke_bp() to emulate RET Peter Zijlstra
2019-10-07 8:27 ` [PATCH v2 10/13] static_call: Add static_cond_call() Peter Zijlstra
2019-10-07 8:27 ` [PATCH v2 11/13] static_call: Handle tail-calls Peter Zijlstra
2019-10-07 8:27 ` [PATCH v2 12/13] static_call: Allow early init Peter Zijlstra
2019-10-07 8:27 ` [RFC][PATCH v2 13/13] x86/perf, static_call: Optimize x86_pmu methods Peter Zijlstra
2019-10-07 11:33 ` [PATCH v2 00/13] Add static_call() Peter Zijlstra
2019-10-07 8:44 ` [RFC][PATCH 0/9] Variable size jump_label support Peter Zijlstra
2019-10-07 8:44 ` [RFC][PATCH 1/9] jump_label, x86: Strip ASM " Peter Zijlstra
2019-10-07 8:44 ` [RFC][PATCH 2/9] jump_label, x86: Factor out the __jump_table generation Peter Zijlstra
2019-10-07 8:44 ` [RFC][PATCH 3/9] jump_label, x86: Remove init NOP optimization Peter Zijlstra
2019-10-07 8:44 ` [RFC][PATCH 4/9] jump_label, x86: Improve error when we fail expected text Peter Zijlstra
2019-10-07 8:44 ` [RFC][PATCH 5/9] jump_label, x86: Introduce jump_entry_size() Peter Zijlstra
2019-10-07 8:44 ` [RFC][PATCH 6/9] jump_label, x86: Add variable length patching support Peter Zijlstra
2019-10-07 8:44 ` [RFC][PATCH 7/9] jump_label,objtool: Validate variable size jump labels Peter Zijlstra
2019-10-07 8:44 ` [RFC][PATCH 8/9] jump_label,objtool: Generate possible statistics Peter Zijlstra
2019-10-07 8:44 ` [RFC][PATCH 9/9] jump_label, x86: Enable JMP8/NOP2 support Peter Zijlstra
2019-10-07 12:07 ` [RFC][PATCH 0/9] Variable size jump_label support Peter Zijlstra
2019-10-07 12:55 ` Ingo Molnar
2019-10-07 15:08 ` Steven Rostedt
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=20191007083830.98511141.6@infradead.org \
--to=peterz@infradead.org \
--cc=ard.biesheuvel@linaro.org \
--cc=bristot@redhat.com \
--cc=hpa@zytor.com \
--cc=jbaron@akamai.com \
--cc=jpoimboe@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=luto@kernel.org \
--cc=mhiramat@kernel.org \
--cc=mingo@kernel.org \
--cc=namit@vmware.com \
--cc=rostedt@goodmis.org \
--cc=tglx@linutronix.de \
--cc=torvalds@linux-foundation.org \
--cc=x86@kernel.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 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.