mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: "Wangnan (F)" <wangnan0@huawei.com>
To: "平松雅巳 / HIRAMATU,MASAMI" <masami.hiramatsu.pt@hitachi.com>,
	"'Arnaldo Carvalho de Melo'" <acme@redhat.com>
Cc: "acme@kernel.org" <acme@kernel.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	He Kuang <hekuang@huawei.com>,
	"Alexei Starovoitov" <ast@plumgrid.com>,
	Brendan Gregg <brendan.d.gregg@gmail.com>,
	Daniel Borkmann <daniel@iogearbox.net>,
	David Ahern <dsahern@gmail.com>, Jiri Olsa <jolsa@kernel.org>,
	Kaixu Xia <xiakaixu@huawei.com>,
	Namhyung Kim <namhyung@kernel.org>,
	Paul Mackerras <paulus@samba.org>,
	Peter Zijlstra <a.p.zijlstra@chello.nl>,
	Zefan Li <lizefan@huawei.com>,
	"pi3orama@163.com" <pi3orama@163.com>
Subject: Re: [PATCH 23/31] perf tools: Introduce regs_query_register_offset() for x86
Date: Sun, 6 Sep 2015 14:02:53 +0800	[thread overview]
Message-ID: <55EBD70D.9080301@huawei.com> (raw)
In-Reply-To: <50399556C9727B4D88A595C8584AAB37524FFC71@GSjpTKYDCembx32.service.hitachi.net>



On 2015/9/1 23:54, 平松雅巳 / HIRAMATU,MASAMI wrote:
>> From: Arnaldo Carvalho de Melo [mailto:acme@redhat.com]
>>
>> Em Tue, Sep 01, 2015 at 11:47:41AM +0000, 平松雅巳 / HIRAMATU,MASAMI escreveu:
>>>> From: Wang Nan [mailto:wangnan0@huawei.com]
>>>>
>>>> regs_query_register_offset() is a helper function which converts
>>>> register name like "%rax" to offset of a register in 'struct pt_regs',
>>>> which is required by BPF prologue generator. Since the function is
>>>> identical, try to reuse the code in arch/x86/kernel/ptrace.c.
>>>>
>>>> Comment inside dwarf-regs.c list the differences between this
>>>> implementation and kernel code.
>>> Hmm, this also introduce a duplication of the code...
>>> It might be a good time to move them into arch/x86/lib/ and
>>> reuse it directly from perf code.
>> It is strange to, having tried sharing stuff directly from the kernel,
>> to be now in a position where I advocate against it...
>>
>> Copy'n'pasting what I said in another message:
>>
>> -----
>> We would go back to sharing stuff with the kernel, but this time around
>> we would be using something that everybody knows is being shared, which
>> doesn't elliminates the possibility that at some point changes made with
>> the kernel in mind would break the tools/ using code.
>>
>> Perhaps it is better to keep copying what we want and introduce
>> infrastructure to check for differences and warn us as soon as possible
>> so that we would do the copy, test if it doesn't break what we use, etc.
>>
>> I.e. we wouldn't be putting any new burden on the "kernel people", i.e.
>> the burden of having to check that changes they make don't break tools/
>> living code, nor any out of the blue breakage on tools/ for tools/
>> developers to fix when changes are made on the kernel "side" -----
>> ---
>>
>> The "stop sharing directly stuff with the kernel" stance was taken after
>> a report from Linus about breakage due to tools/ using kernel files
>> directly and then a change made in some RCU files broke the tools/perf/
>> build, even with tools/perf/ not using anything RCU related so far.
>>
>> Looking at tools/perf/MANIFEST, the file used to create a detached
>> tarball so that perf can be built outside the kernel sources there are
>> still some kernel source files listed, but those probably need to be
>> copied too...
> OK, so let this apply.
>
> Acked-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
>
> And also we'll need a testcase for this.

I created a testcase for the whole BPF prologue, so I think this can be 
covered?

I'll post them by replying this mail.

Thank you.

> Thank you,
>
>> - Arnaldo
>>
>>> Thank you,
>>>
>>>> get_arch_regstr() switches to regoffset_table and the old string table
>>>> is dropped.
>>>>
>>>> Signed-off-by: Wang Nan <wangnan0@huawei.com>
>>>> Signed-off-by: He Kuang <hekuang@huawei.com>
>>>> Cc: Alexei Starovoitov <ast@plumgrid.com>
>>>> Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
>>>> Cc: Daniel Borkmann <daniel@iogearbox.net>
>>>> Cc: David Ahern <dsahern@gmail.com>
>>>> Cc: He Kuang <hekuang@huawei.com>
>>>> Cc: Jiri Olsa <jolsa@kernel.org>
>>>> Cc: Kaixu Xia <xiakaixu@huawei.com>
>>>> Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
>>>> Cc: Namhyung Kim <namhyung@kernel.org>
>>>> Cc: Paul Mackerras <paulus@samba.org>
>>>> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
>>>> Cc: Zefan Li <lizefan@huawei.com>
>>>> Cc: pi3orama@163.com
>>>> Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
>>>> ---
>>>>   tools/perf/arch/x86/Makefile          |   1 +
>>>>   tools/perf/arch/x86/util/Build        |   1 +
>>>>   tools/perf/arch/x86/util/dwarf-regs.c | 122 ++++++++++++++++++++++++----------
>>>>   3 files changed, 90 insertions(+), 34 deletions(-)
>>>>
>>>> diff --git a/tools/perf/arch/x86/Makefile b/tools/perf/arch/x86/Makefile
>>>> index 21322e0..09ba923 100644
>>>> --- a/tools/perf/arch/x86/Makefile
>>>> +++ b/tools/perf/arch/x86/Makefile
>>>> @@ -2,3 +2,4 @@ ifndef NO_DWARF
>>>>   PERF_HAVE_DWARF_REGS := 1
>>>>   endif
>>>>   HAVE_KVM_STAT_SUPPORT := 1
>>>> +PERF_HAVE_ARCH_REGS_QUERY_REGISTER_OFFSET := 1
>>>> diff --git a/tools/perf/arch/x86/util/Build b/tools/perf/arch/x86/util/Build
>>>> index 2c55e1b..d4d1f23 100644
>>>> --- a/tools/perf/arch/x86/util/Build
>>>> +++ b/tools/perf/arch/x86/util/Build
>>>> @@ -4,6 +4,7 @@ libperf-y += pmu.o
>>>>   libperf-y += kvm-stat.o
>>>>
>>>>   libperf-$(CONFIG_DWARF) += dwarf-regs.o
>>>> +libperf-$(CONFIG_BPF_PROLOGUE) += dwarf-regs.o
>>>>
>>>>   libperf-$(CONFIG_LIBUNWIND)          += unwind-libunwind.o
>>>>   libperf-$(CONFIG_LIBDW_DWARF_UNWIND) += unwind-libdw.o
>>>> diff --git a/tools/perf/arch/x86/util/dwarf-regs.c b/tools/perf/arch/x86/util/dwarf-regs.c
>>>> index a08de0a..de5b936 100644
>>>> --- a/tools/perf/arch/x86/util/dwarf-regs.c
>>>> +++ b/tools/perf/arch/x86/util/dwarf-regs.c
>>>> @@ -21,55 +21,109 @@
>>>>    */
>>>>
>>>>   #include <stddef.h>
>>>> +#include <errno.h> /* for EINVAL */
>>>> +#include <string.h> /* for strcmp */
>>>> +#include <linux/ptrace.h> /* for struct pt_regs */
>>>> +#include <linux/kernel.h> /* for offsetof */
>>>>   #include <dwarf-regs.h>
>>>>
>>>>   /*
>>>> - * Generic dwarf analysis helpers
>>>> + * See arch/x86/kernel/ptrace.c.
>>>> + * Different from it:
>>>> + *
>>>> + *  - Since struct pt_regs is defined differently for user and kernel,
>>>> + *    but we want to use 'ax, bx' instead of 'rax, rbx' (which is struct
>>>> + *    field name of user's pt_regs), we make REG_OFFSET_NAME to accept
>>>> + *    both string name and reg field name.
>>>> + *
>>>> + *  - Since accessing x86_32's pt_regs from x86_64 building is difficult
>>>> + *    and vise versa, we simply fill offset with -1, so
>>>> + *    get_arch_regstr() still works but regs_query_register_offset()
>>>> + *    returns error.
>>>> + *    The only inconvenience caused by it now is that we are not allowed
>>>> + *    to generate BPF prologue for a x86_64 kernel if perf is built for
>>>> + *    x86_32. This is really a rare usecase.
>>>> + *
>>>> + *  - Order is different from kernel's ptrace.c for get_arch_regstr(), which
>>>> + *    is defined by dwarf.
>>>>    */
>>>>
>>>> -#define X86_32_MAX_REGS 8
>>>> -const char *x86_32_regs_table[X86_32_MAX_REGS] = {
>>>> -	"%ax",
>>>> -	"%cx",
>>>> -	"%dx",
>>>> -	"%bx",
>>>> -	"$stack",	/* Stack address instead of %sp */
>>>> -	"%bp",
>>>> -	"%si",
>>>> -	"%di",
>>>> +struct pt_regs_offset {
>>>> +	const char *name;
>>>> +	int offset;
>>>> +};
>>>> +
>>>> +#define REG_OFFSET_END {.name = NULL, .offset = 0}
>>>> +
>>>> +#ifdef __x86_64__
>>>> +# define REG_OFFSET_NAME_64(n, r) {.name = n, .offset = offsetof(struct pt_regs, r)}
>>>> +# define REG_OFFSET_NAME_32(n, r) {.name = n, .offset = -1}
>>>> +#else
>>>> +# define REG_OFFSET_NAME_64(n, r) {.name = n, .offset = -1}
>>>> +# define REG_OFFSET_NAME_32(n, r) {.name = n, .offset = offsetof(struct pt_regs, r)}
>>>> +#endif
>>>> +
>>>> +static const struct pt_regs_offset x86_32_regoffset_table[] = {
>>>> +	REG_OFFSET_NAME_32("%ax",	eax),
>>>> +	REG_OFFSET_NAME_32("%cx",	ecx),
>>>> +	REG_OFFSET_NAME_32("%dx",	edx),
>>>> +	REG_OFFSET_NAME_32("%bx",	ebx),
>>>> +	REG_OFFSET_NAME_32("$stack",	esp),	/* Stack address instead of %sp */
>>>> +	REG_OFFSET_NAME_32("%bp",	ebp),
>>>> +	REG_OFFSET_NAME_32("%si",	esi),
>>>> +	REG_OFFSET_NAME_32("%di",	edi),
>>>> +	REG_OFFSET_END,
>>>>   };
>>>>
>>>> -#define X86_64_MAX_REGS 16
>>>> -const char *x86_64_regs_table[X86_64_MAX_REGS] = {
>>>> -	"%ax",
>>>> -	"%dx",
>>>> -	"%cx",
>>>> -	"%bx",
>>>> -	"%si",
>>>> -	"%di",
>>>> -	"%bp",
>>>> -	"%sp",
>>>> -	"%r8",
>>>> -	"%r9",
>>>> -	"%r10",
>>>> -	"%r11",
>>>> -	"%r12",
>>>> -	"%r13",
>>>> -	"%r14",
>>>> -	"%r15",
>>>> +static const struct pt_regs_offset x86_64_regoffset_table[] = {
>>>> +	REG_OFFSET_NAME_64("%ax",	rax),
>>>> +	REG_OFFSET_NAME_64("%dx",	rdx),
>>>> +	REG_OFFSET_NAME_64("%cx",	rcx),
>>>> +	REG_OFFSET_NAME_64("%bx",	rbx),
>>>> +	REG_OFFSET_NAME_64("%si",	rsi),
>>>> +	REG_OFFSET_NAME_64("%di",	rdi),
>>>> +	REG_OFFSET_NAME_64("%bp",	rbp),
>>>> +	REG_OFFSET_NAME_64("%sp",	rsp),
>>>> +	REG_OFFSET_NAME_64("%r8",	r8),
>>>> +	REG_OFFSET_NAME_64("%r9",	r9),
>>>> +	REG_OFFSET_NAME_64("%r10",	r10),
>>>> +	REG_OFFSET_NAME_64("%r11",	r11),
>>>> +	REG_OFFSET_NAME_64("%r12",	r12),
>>>> +	REG_OFFSET_NAME_64("%r13",	r13),
>>>> +	REG_OFFSET_NAME_64("%r14",	r14),
>>>> +	REG_OFFSET_NAME_64("%r15",	r15),
>>>> +	REG_OFFSET_END,
>>>>   };
>>>>
>>>>   /* TODO: switching by dwarf address size */
>>>>   #ifdef __x86_64__
>>>> -#define ARCH_MAX_REGS X86_64_MAX_REGS
>>>> -#define arch_regs_table x86_64_regs_table
>>>> +#define regoffset_table x86_64_regoffset_table
>>>>   #else
>>>> -#define ARCH_MAX_REGS X86_32_MAX_REGS
>>>> -#define arch_regs_table x86_32_regs_table
>>>> +#define regoffset_table x86_32_regoffset_table
>>>>   #endif
>>>>
>>>> +/* Minus 1 for the ending REG_OFFSET_END */
>>>> +#define ARCH_MAX_REGS ((sizeof(regoffset_table) / sizeof(regoffset_table[0])) - 1)
>>>> +
>>>>   /* Return architecture dependent register string (for kprobe-tracer) */
>>>>   const char *get_arch_regstr(unsigned int n)
>>>>   {
>>>> -	return (n < ARCH_MAX_REGS) ? arch_regs_table[n] : NULL;
>>>> +	return (n < ARCH_MAX_REGS) ? regoffset_table[n].name : NULL;
>>>> +}
>>>> +
>>>> +/* Reuse code from arch/x86/kernel/ptrace.c */
>>>> +/**
>>>> + * regs_query_register_offset() - query register offset from its name
>>>> + * @name:	the name of a register
>>>> + *
>>>> + * regs_query_register_offset() returns the offset of a register in struct
>>>> + * pt_regs from its name. If the name is invalid, this returns -EINVAL;
>>>> + */
>>>> +int regs_query_register_offset(const char *name)
>>>> +{
>>>> +	const struct pt_regs_offset *roff;
>>>> +	for (roff = regoffset_table; roff->name != NULL; roff++)
>>>> +		if (!strcmp(roff->name, name))
>>>> +			return roff->offset;
>>>> +	return -EINVAL;
>>>>   }
>>>> --
>>>> 1.8.3.4



  reply	other threads:[~2015-09-06  6:03 UTC|newest]

Thread overview: 94+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-08-29  4:21 [GIT PULL 00/31] perf tools: filtering events using eBPF programs Wang Nan
2015-08-29  4:21 ` [PATCH 01/31] bpf tools: New API to get name from a BPF object Wang Nan
2015-08-29  4:21 ` [PATCH 02/31] perf tools: Don't set cmdline_group_boundary if no evsel is collected Wang Nan
2015-08-31 19:20   ` Arnaldo Carvalho de Melo
2015-09-01 10:37     ` Wangnan (F)
2015-09-01 10:38     ` Jiri Olsa
2015-09-01 12:44       ` Wangnan (F)
2015-09-02  2:53   ` [PATCH] perf tools: Don't set leader if parser doesn't collect an evsel Wang Nan
2015-09-02  3:01     ` Wangnan (F)
2015-09-02  5:57     ` 平松雅巳 / HIRAMATU,MASAMI
2015-09-02  6:09       ` Wangnan (F)
     [not found]       ` <1441176553-116129-1-git-send-email-wangnan0@huawei.com>
2015-09-02  6:53         ` [PATCH] perf tools: Don't write to evsel if parser doesn't collect evsel Wangnan (F)
2015-09-02 10:31           ` 平松雅巳 / HIRAMATU,MASAMI
2015-09-02 11:54           ` Jiri Olsa
2015-09-02 12:05             ` pi3orama
2015-09-02 12:46               ` Jiri Olsa
2015-09-02 13:55               ` Arnaldo Carvalho de Melo
2015-09-02 14:04                 ` pi3orama
2015-09-02 14:43                   ` Arnaldo Carvalho de Melo
2015-09-02 22:24                     ` pi3orama
2015-08-29  4:21 ` [PATCH 03/31] perf tools: Introduce dummy evsel Wang Nan
2015-08-31 19:38   ` Arnaldo Carvalho de Melo
2015-09-03  0:11   ` Namhyung Kim
2015-09-03  0:42     ` pi3orama
2015-09-06  5:55   ` [PATCH] perf tools: Allow BPF placeholder dummy events to collect --filter options Wang Nan
2015-09-06  5:56     ` [PATCH] perf tools: Sync setting of real bpf events with placeholder Wang Nan
2015-08-29  4:21 ` [PATCH 04/31] perf tools: Make perf depend on libbpf Wang Nan
2015-08-29  4:21 ` [PATCH 05/31] perf ebpf: Add the libbpf glue Wang Nan
2015-08-29  4:21 ` [PATCH 06/31] perf tools: Enable passing bpf object file to --event Wang Nan
2015-08-29  4:21 ` [PATCH 07/31] perf probe: Attach trace_probe_event with perf_probe_event Wang Nan
2015-09-02  4:32   ` Namhyung Kim
2015-09-02  5:40     ` Wangnan (F)
2015-08-29  4:21 ` [PATCH 08/31] perf record, bpf: Parse and probe eBPF programs probe points Wang Nan
2015-08-29  4:21 ` [PATCH 09/31] perf bpf: Collect 'struct perf_probe_event' for bpf_program Wang Nan
2015-08-29  4:21 ` [PATCH 10/31] perf record: Load all eBPF object into kernel Wang Nan
2015-08-29  4:21 ` [PATCH 11/31] perf tools: Add bpf_fd field to evsel and config it Wang Nan
2015-08-29  4:21 ` [PATCH 12/31] perf tools: Allow filter option to be applied to bof object Wang Nan
2015-08-29  4:21 ` [PATCH 13/31] perf tools: Attach eBPF program to perf event Wang Nan
2015-08-29  4:21 ` [PATCH 14/31] perf tools: Suppress probing messages when probing by BPF loading Wang Nan
2015-09-03  0:20   ` Namhyung Kim
2015-09-03  2:42     ` 平松雅巳 / HIRAMATU,MASAMI
2015-09-03 12:10     ` [PATCH perf/core ] perf-probe: Output the result of adding/deleting probe in buildin-probe Masami Hiramatsu
2015-09-03 12:18       ` 平松雅巳 / HIRAMATU,MASAMI
2015-09-03 17:25         ` Namhyung Kim
2015-09-03 20:28       ` Arnaldo Carvalho de Melo
2015-09-04  1:30         ` 平松雅巳 / HIRAMATU,MASAMI
2015-08-29  4:21 ` [PATCH 15/31] perf record: Add clang options for compiling BPF scripts Wang Nan
2015-08-29  4:21 ` [PATCH 16/31] perf tools: Infrastructure for compiling scriptlets when passing '.c' to --event Wang Nan
2015-08-29  4:21 ` [PATCH 17/31] perf tests: Enforce LLVM test for BPF test Wang Nan
2015-09-01  5:59   ` Wangnan (F)
2015-08-29  4:21 ` [PATCH 18/31] perf test: Add 'perf test BPF' Wang Nan
2015-09-02 12:45   ` Namhyung Kim
2015-09-05 12:21     ` Wang Nan
2015-08-29  4:21 ` [PATCH 19/31] bpf tools: Load a program with different instances using preprocessor Wang Nan
2015-08-29  4:21 ` [PATCH 20/31] perf probe: Reset args and nargs for probe_trace_event when failure Wang Nan
2015-08-29  4:21 ` [PATCH 21/31] perf tools: Move linux/filter.h to tools/include Wang Nan
2015-08-31 20:35   ` Arnaldo Carvalho de Melo
2015-09-01 19:39   ` Arnaldo Carvalho de Melo
2015-09-01 19:47     ` Arnaldo Carvalho de Melo
2015-09-01 21:08     ` pi3orama
2015-09-01 21:43       ` Arnaldo Carvalho de Melo
2015-09-08 14:31   ` [tip:perf/core] perf tools: Copy " tip-bot for He Kuang
2015-08-29  4:21 ` [PATCH 22/31] perf tools: Add BPF_PROLOGUE config options for further patches Wang Nan
2015-08-31 20:39   ` Arnaldo Carvalho de Melo
2015-09-01  6:59   ` Wang Nan
2015-09-01  6:59     ` [PATCH 23/31] perf tools: Introduce regs_query_register_offset() for x86 Wang Nan
2015-09-01 11:47       ` 平松雅巳 / HIRAMATU,MASAMI
2015-09-01 13:52         ` Wangnan (F)
2015-09-01 14:50           ` Arnaldo Carvalho de Melo
2015-09-01 14:14         ` Arnaldo Carvalho de Melo
2015-09-01 15:54           ` 平松雅巳 / HIRAMATU,MASAMI
2015-09-06  6:02             ` Wangnan (F) [this message]
2015-09-06  6:04               ` [PATCH] perf test: Enforce LLVM test, add kbuild test Wang Nan
2015-09-06  6:04                 ` [PATCH] perf test: Test BPF prologue Wang Nan
2015-09-02 14:08     ` [PATCH 22/31] perf tools: Add BPF_PROLOGUE config options for further patches Namhyung Kim
2015-08-29  4:21 ` [PATCH 23/31] perf tools: Introduce arch_get_reg_info() for x86 Wang Nan
2015-08-31 20:43   ` Arnaldo Carvalho de Melo
2015-09-01  2:39     ` Wangnan (F)
2015-08-29  4:21 ` [PATCH 24/31] perf tools: Add prologue for BPF programs for fetching arguments Wang Nan
2015-08-29  4:21 ` [PATCH 25/31] perf tools: Generate prologue for BPF programs Wang Nan
2015-08-29  4:22 ` [PATCH 26/31] perf tools: Use same BPF program if arguments are identical Wang Nan
2015-08-29  4:22 ` [PATCH 27/31] perf record: Support custom vmlinux path Wang Nan
2015-09-01 20:19   ` Arnaldo Carvalho de Melo
2015-09-01 20:21     ` Arnaldo Carvalho de Melo
2015-09-01 21:00       ` pi3orama
2015-09-01 21:33         ` Arnaldo Carvalho de Melo
2015-08-29  4:22 ` [PATCH 28/31] perf probe: Init symbol as kprobe Wang Nan
2015-09-01 20:11   ` Arnaldo Carvalho de Melo
2015-09-02  1:22     ` Wangnan (F)
2015-09-02  1:38     ` 平松雅巳 / HIRAMATU,MASAMI
2015-08-29  4:22 ` [PATCH 29/31] perf tools: Support attach BPF program on uprobe events Wang Nan
2015-08-29  4:22 ` [PATCH 30/31] perf tools: Fix cross compiling error Wang Nan
2015-08-29  4:22 ` [PATCH 31/31] tools lib traceevent: Support function __get_dynamic_array_len Wang Nan
2015-09-08 14:31   ` [tip:perf/core] " tip-bot for He Kuang

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=55EBD70D.9080301@huawei.com \
    --to=wangnan0@huawei.com \
    --cc=a.p.zijlstra@chello.nl \
    --cc=acme@kernel.org \
    --cc=acme@redhat.com \
    --cc=ast@plumgrid.com \
    --cc=brendan.d.gregg@gmail.com \
    --cc=daniel@iogearbox.net \
    --cc=dsahern@gmail.com \
    --cc=hekuang@huawei.com \
    --cc=jolsa@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=lizefan@huawei.com \
    --cc=masami.hiramatsu.pt@hitachi.com \
    --cc=namhyung@kernel.org \
    --cc=paulus@samba.org \
    --cc=pi3orama@163.com \
    --cc=xiakaixu@huawei.com \
    /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

Powered by JetHome