All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Mi, Dapeng" <dapeng1.mi@linux.intel.com>
To: Ian Rogers <irogers@google.com>
Cc: Peter Zijlstra <peterz@infradead.org>,
	Ingo Molnar <mingo@redhat.com>,
	Arnaldo Carvalho de Melo <acme@kernel.org>,
	Namhyung Kim <namhyung@kernel.org>,
	Thomas Gleixner <tglx@linutronix.de>,
	Dave Hansen <dave.hansen@linux.intel.com>,
	Adrian Hunter <adrian.hunter@intel.com>,
	Jiri Olsa <jolsa@kernel.org>,
	Alexander Shishkin <alexander.shishkin@linux.intel.com>,
	Andi Kleen <ak@linux.intel.com>,
	Eranian Stephane <eranian@google.com>,
	Mark Rutland <mark.rutland@arm.com>,
	broonie@kernel.org, Ravi Bangoria <ravi.bangoria@amd.com>,
	linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org,
	Zide Chen <zide.chen@intel.com>,
	Falcon Thomas <thomas.falcon@intel.com>,
	Dapeng Mi <dapeng1.mi@intel.com>,
	Xudong Hao <xudong.hao@intel.com>,
	Kan Liang <kan.liang@linux.intel.com>
Subject: Re: [Patch v5 17/19] perf headers: Sync with the kernel headers
Date: Wed, 21 Jan 2026 10:03:28 +0800	[thread overview]
Message-ID: <c255f088-5992-45d4-92d7-cdbc9b5e446d@linux.intel.com> (raw)
In-Reply-To: <CAP-5=fWHmTeb7SAvpmMVvi8p_otqU6iSaRO29svyPi3MjhT4Mw@mail.gmail.com>


On 1/21/2026 2:11 AM, Ian Rogers wrote:
> On Tue, Jan 20, 2026 at 1:22 AM Mi, Dapeng <dapeng1.mi@linux.intel.com> wrote:
>>
>> On 1/20/2026 4:00 PM, Ian Rogers wrote:
>>> On Mon, Jan 19, 2026 at 11:43 PM Mi, Dapeng <dapeng1.mi@linux.intel.com> wrote:
>>>> On 1/20/2026 3:16 PM, Ian Rogers wrote:
>>>>> On Tue, Dec 2, 2025 at 10:59 PM Dapeng Mi <dapeng1.mi@linux.intel.com> wrote:
>>>>>> From: Kan Liang <kan.liang@linux.intel.com>
>>>>>>
>>>>>> Update include/uapi/linux/perf_event.h and
>>>>>> arch/x86/include/uapi/asm/perf_regs.h to support extended regs.
>>>>>>
>>>>>> Signed-off-by: Kan Liang <kan.liang@linux.intel.com>
>>>>>> Co-developed-by: Dapeng Mi <dapeng1.mi@linux.intel.com>
>>>>>> Signed-off-by: Dapeng Mi <dapeng1.mi@linux.intel.com>
>>>>>> ---
>>>>>>  tools/arch/x86/include/uapi/asm/perf_regs.h | 62 +++++++++++++++++++++
>>>>>>  tools/include/uapi/linux/perf_event.h       | 45 +++++++++++++--
>>>>>>  2 files changed, 103 insertions(+), 4 deletions(-)
>>>>>>
>>>>>> diff --git a/tools/arch/x86/include/uapi/asm/perf_regs.h b/tools/arch/x86/include/uapi/asm/perf_regs.h
>>>>>> index 7c9d2bb3833b..f3561ed10041 100644
>>>>>> --- a/tools/arch/x86/include/uapi/asm/perf_regs.h
>>>>>> +++ b/tools/arch/x86/include/uapi/asm/perf_regs.h
>>>>>> @@ -27,9 +27,34 @@ enum perf_event_x86_regs {
>>>>>>         PERF_REG_X86_R13,
>>>>>>         PERF_REG_X86_R14,
>>>>>>         PERF_REG_X86_R15,
>>>>>> +       /*
>>>>>> +        * The EGPRs/SSP and XMM have overlaps. Only one can be used
>>>>>> +        * at a time. For the ABI type PERF_SAMPLE_REGS_ABI_SIMD,
>>>>>> +        * utilize EGPRs/SSP. For the other ABI type, XMM is used.
>>>>>> +        *
>>>>>> +        * Extended GPRs (EGPRs)
>>>>>> +        */
>>>>>> +       PERF_REG_X86_R16,
>>>>>> +       PERF_REG_X86_R17,
>>>>>> +       PERF_REG_X86_R18,
>>>>>> +       PERF_REG_X86_R19,
>>>>>> +       PERF_REG_X86_R20,
>>>>>> +       PERF_REG_X86_R21,
>>>>>> +       PERF_REG_X86_R22,
>>>>>> +       PERF_REG_X86_R23,
>>>>>> +       PERF_REG_X86_R24,
>>>>>> +       PERF_REG_X86_R25,
>>>>>> +       PERF_REG_X86_R26,
>>>>>> +       PERF_REG_X86_R27,
>>>>>> +       PERF_REG_X86_R28,
>>>>>> +       PERF_REG_X86_R29,
>>>>>> +       PERF_REG_X86_R30,
>>>>>> +       PERF_REG_X86_R31,
>>>>>> +       PERF_REG_X86_SSP,
>>>>>>         /* These are the limits for the GPRs. */
>>>>>>         PERF_REG_X86_32_MAX = PERF_REG_X86_GS + 1,
>>>>>>         PERF_REG_X86_64_MAX = PERF_REG_X86_R15 + 1,
>>>>>> +       PERF_REG_MISC_MAX = PERF_REG_X86_SSP + 1,
>>>>>>
>>>>>>         /* These all need two bits set because they are 128bit */
>>>>>>         PERF_REG_X86_XMM0  = 32,
>>>>>> @@ -54,5 +79,42 @@ enum perf_event_x86_regs {
>>>>>>  };
>>>>>>
>>>>>>  #define PERF_REG_EXTENDED_MASK (~((1ULL << PERF_REG_X86_XMM0) - 1))
>>>>>> +#define PERF_X86_EGPRS_MASK    GENMASK_ULL(PERF_REG_X86_R31, PERF_REG_X86_R16)
>>>>>> +
>>>>>> +enum {
>>>>>> +       PERF_REG_X86_XMM,
>>>>>> +       PERF_REG_X86_YMM,
>>>>>> +       PERF_REG_X86_ZMM,
>>>>>> +       PERF_REG_X86_MAX_SIMD_REGS,
>>>>>> +
>>>>>> +       PERF_REG_X86_OPMASK = 0,
>>>>>> +       PERF_REG_X86_MAX_PRED_REGS = 1,
>>>>>> +};
>>>>>> +
>>>>>> +enum {
>>>>>> +       PERF_X86_SIMD_XMM_REGS      = 16,
>>>>>> +       PERF_X86_SIMD_YMM_REGS      = 16,
>>>>>> +       PERF_X86_SIMD_ZMMH_REGS     = 16,
>>>>>> +       PERF_X86_SIMD_ZMM_REGS      = 32,
>>>>>> +       PERF_X86_SIMD_VEC_REGS_MAX  = PERF_X86_SIMD_ZMM_REGS,
>>>>>> +
>>>>>> +       PERF_X86_SIMD_OPMASK_REGS   = 8,
>>>>>> +       PERF_X86_SIMD_PRED_REGS_MAX = PERF_X86_SIMD_OPMASK_REGS,
>>>>>> +};
>>>>>> +
>>>>>> +#define PERF_X86_SIMD_PRED_MASK                GENMASK(PERF_X86_SIMD_PRED_REGS_MAX - 1, 0)
>>>>>> +#define PERF_X86_SIMD_VEC_MASK         GENMASK_ULL(PERF_X86_SIMD_VEC_REGS_MAX - 1, 0)
>>>>>> +
>>>>>> +#define PERF_X86_H16ZMM_BASE           PERF_X86_SIMD_ZMMH_REGS
>>>>>> +
>>>>>> +enum {
>>>>>> +       PERF_X86_OPMASK_QWORDS   = 1,
>>>>>> +       PERF_X86_XMM_QWORDS      = 2,
>>>>>> +       PERF_X86_YMMH_QWORDS     = 2,
>>>>>> +       PERF_X86_YMM_QWORDS      = 4,
>>>>>> +       PERF_X86_ZMMH_QWORDS     = 4,
>>>>>> +       PERF_X86_ZMM_QWORDS      = 8,
>>>>>> +       PERF_X86_SIMD_QWORDS_MAX = PERF_X86_ZMM_QWORDS,
>>>>>> +};
>>>>>>
>>>>>>  #endif /* _ASM_X86_PERF_REGS_H */
>>>>>> diff --git a/tools/include/uapi/linux/perf_event.h b/tools/include/uapi/linux/perf_event.h
>>>>>> index d292f96bc06f..f1474da32622 100644
>>>>>> --- a/tools/include/uapi/linux/perf_event.h
>>>>>> +++ b/tools/include/uapi/linux/perf_event.h
>>>>>> @@ -314,8 +314,9 @@ enum {
>>>>>>   */
>>>>>>  enum perf_sample_regs_abi {
>>>>>>         PERF_SAMPLE_REGS_ABI_NONE               = 0,
>>>>>> -       PERF_SAMPLE_REGS_ABI_32                 = 1,
>>>>>> -       PERF_SAMPLE_REGS_ABI_64                 = 2,
>>>>>> +       PERF_SAMPLE_REGS_ABI_32                 = (1 << 0),
>>>>>> +       PERF_SAMPLE_REGS_ABI_64                 = (1 << 1),
>>>>>> +       PERF_SAMPLE_REGS_ABI_SIMD               = (1 << 2),
>>>>>>  };
>>>>>>
>>>>>>  /*
>>>>>> @@ -382,6 +383,7 @@ enum perf_event_read_format {
>>>>>>  #define PERF_ATTR_SIZE_VER6                    120     /* Add: aux_sample_size */
>>>>>>  #define PERF_ATTR_SIZE_VER7                    128     /* Add: sig_data */
>>>>>>  #define PERF_ATTR_SIZE_VER8                    136     /* Add: config3 */
>>>>>> +#define PERF_ATTR_SIZE_VER9                    168     /* Add: sample_simd_{pred,vec}_reg_* */
>>>>>>
>>>>>>  /*
>>>>>>   * 'struct perf_event_attr' contains various attributes that define
>>>>>> @@ -545,6 +547,25 @@ struct perf_event_attr {
>>>>>>         __u64   sig_data;
>>>>>>
>>>>>>         __u64   config3; /* extension of config2 */
>>>>>> +
>>>>>> +
>>>>>> +       /*
>>>>>> +        * Defines set of SIMD registers to dump on samples.
>>>>>> +        * The sample_simd_regs_enabled !=0 implies the
>>>>>> +        * set of SIMD registers is used to config all SIMD registers.
>>>>>> +        * If !sample_simd_regs_enabled, sample_regs_XXX may be used to
>>>>>> +        * config some SIMD registers on X86.
>>>>>> +        */
>>>>>> +       union {
>>>>>> +               __u16 sample_simd_regs_enabled;
>>>>>> +               __u16 sample_simd_pred_reg_qwords;
>>>>>> +       };
>>>>>> +       __u32 sample_simd_pred_reg_intr;
>>>>>> +       __u32 sample_simd_pred_reg_user;
>>>>>> +       __u16 sample_simd_vec_reg_qwords;
>>>>>> +       __u64 sample_simd_vec_reg_intr;
>>>>>> +       __u64 sample_simd_vec_reg_user;
>>>>>> +       __u32 __reserved_4;
>>>>>>  };
>>>>>>
>>>>>>  /*
>>>>>> @@ -1018,7 +1039,15 @@ enum perf_event_type {
>>>>>>          *      } && PERF_SAMPLE_BRANCH_STACK
>>>>>>          *
>>>>>>          *      { u64                   abi; # enum perf_sample_regs_abi
>>>>>> -        *        u64                   regs[weight(mask)]; } && PERF_SAMPLE_REGS_USER
>>>>>> +        *        u64                   regs[weight(mask)];
>>>>>> +        *        struct {
>>>>>> +        *              u16 nr_vectors;
>>>>>> +        *              u16 vector_qwords;
>>>>>> +        *              u16 nr_pred;
>>>>>> +        *              u16 pred_qwords;
>>>>>> +        *              u64 data[nr_vectors * vector_qwords + nr_pred * pred_qwords];
>>>>>> +        *        } && (abi & PERF_SAMPLE_REGS_ABI_SIMD)
>>>>> Why can't these values be taken from the perf_event_attr? The abi is
>>>>> needed as there could be both 32-bit and 64-bit samples for the same
>>>>> event - presumably x32 appears as 64-bit. If the ABI has SIMD within
>>>>> it (implied by the "} && (abi & PERF_SAMPLE_REGS_ABI_SIMD)" below)
>>>>> then why can't we just use the perf_event_attr values? For example,
>>>>> data could be "data[weight(sample_simd_vec_reg_user) *
>>>>> sample_simd_vec_reg_qwords + weight(sample_simd_pred_reg_user) *
>>>>> sample_simd_pred_reg_qwords]".
>>>> The main reason is that the sampled SIMD regs could only be a subset of the
>>>> requested SIMD regs in perf_event_attr, so we need to show the bitmask and
>>>> qwords length explicitly in the sample record.
>>> But this doesn't happen in any other register sampling, why in this case?
>>>
>>> Perhaps add comments along the lines:
>>> u16 nr_vectors;  // weight(sample_simd_vec_reg_user) except when ...
>>>
>>> My random guess as to why the value differs from the weight would be
>>> some kind of optimization around register values of 0. And even if the
>>> number of registers is reduced, why is the number of qwords being
>>> altered?
>> Yes. E.g., the user may want to sample ZMM registers (ZMM0 ~ ZMM31), but
>> the result is that only XMM registers (XMM0 ~ XMM15) are sampled at some
>> time, so both the registers number and qwords length are not identical with
>> the perf_event_attr values in some sampling records. Thus we need to
>> explicitly indicates the sampled registers number and length.
>>
>> Besides, containing these 4 fields in sampling records makes the sampling
>> records be parsed more easily and don't need to retrieve information from
>> corresponding perf_event_attr. Thanks.
> Sgtm (well you still need to look at the perf_event_attr for
> regs[weight(mask)] immediately before this, but anyway). Can we add
> comments to that effect? Something like:
> ```
>        *              u16 nr_vectors;  # 0..weight(sample_simd_vec_reg_user)
>        *              u16 vector_qwords; # 0..sample_simd_vec_reg_qwords
>        *              u16 nr_pred; # 0..weight(sample_simd_pred_reg_user)
>        *              u16 pred_qwords; 0..sample_simd_pred_reg_qwords
> ```
> At least this hints at an optimization rather than a duplication bug.

Sure. Thanks.


>
> Thanks,
> Ian
>
>>> Thanks,
>>> Ian
>>>
>>>>>> +        *      } && PERF_SAMPLE_REGS_USER
>>>>>>          *
>>>>>>          *      { u64                   size;
>>>>>>          *        char                  data[size];
>>>>>> @@ -1045,7 +1074,15 @@ enum perf_event_type {
>>>>>>          *      { u64                   data_src; } && PERF_SAMPLE_DATA_SRC
>>>>>>          *      { u64                   transaction; } && PERF_SAMPLE_TRANSACTION
>>>>>>          *      { u64                   abi; # enum perf_sample_regs_abi
>>>>>> -        *        u64                   regs[weight(mask)]; } && PERF_SAMPLE_REGS_INTR
>>>>>> +        *        u64                   regs[weight(mask)];
>>>>>> +        *        struct {
>>>>>> +        *              u16 nr_vectors;
>>>>>> +        *              u16 vector_qwords;
>>>>>> +        *              u16 nr_pred;
>>>>>> +        *              u16 pred_qwords;
>>>>>> +        *              u64 data[nr_vectors * vector_qwords + nr_pred * pred_qwords];
>>>>>> +        *        } && (abi & PERF_SAMPLE_REGS_ABI_SIMD)
>>>>> Same comment.
>>>>>
>>>>> Thanks,
>>>>> Ian
>>>>>
>>>>>> +        *      } && PERF_SAMPLE_REGS_INTR
>>>>>>          *      { u64                   phys_addr;} && PERF_SAMPLE_PHYS_ADDR
>>>>>>          *      { u64                   cgroup;} && PERF_SAMPLE_CGROUP
>>>>>>          *      { u64                   data_page_size;} && PERF_SAMPLE_DATA_PAGE_SIZE
>>>>>> --
>>>>>> 2.34.1
>>>>>>

  reply	other threads:[~2026-01-21  2:03 UTC|newest]

Thread overview: 86+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-12-03  6:54 [Patch v5 00/19] Support SIMD/eGPRs/SSP registers sampling for perf Dapeng Mi
2025-12-03  6:54 ` [Patch v5 01/19] perf: Eliminate duplicate arch-specific functions definations Dapeng Mi
2025-12-03  6:54 ` [Patch v5 02/19] perf/x86: Use x86_perf_regs in the x86 nmi handler Dapeng Mi
2025-12-03  6:54 ` [Patch v5 03/19] perf/x86: Introduce x86-specific x86_pmu_setup_regs_data() Dapeng Mi
2025-12-03  6:54 ` [Patch v5 04/19] x86/fpu/xstate: Add xsaves_nmi() helper Dapeng Mi
2025-12-03  6:54 ` [Patch v5 05/19] perf: Move and rename has_extended_regs() for ARCH-specific use Dapeng Mi
2025-12-03  6:54 ` [Patch v5 06/19] perf/x86: Add support for XMM registers in non-PEBS and REGS_USER Dapeng Mi
2025-12-04 15:17   ` Peter Zijlstra
2025-12-04 15:47     ` Peter Zijlstra
2025-12-05  6:37       ` Mi, Dapeng
2025-12-04 18:59     ` Dave Hansen
2025-12-05  8:42       ` Peter Zijlstra
2025-12-03  6:54 ` [Patch v5 07/19] perf: Add sampling support for SIMD registers Dapeng Mi
2025-12-05 11:07   ` Peter Zijlstra
2025-12-08  5:24     ` Mi, Dapeng
2025-12-05 11:40   ` Peter Zijlstra
2025-12-08  6:00     ` Mi, Dapeng
2025-12-03  6:54 ` [Patch v5 08/19] perf/x86: Enable XMM sampling using sample_simd_vec_reg_* fields Dapeng Mi
2025-12-05 11:25   ` Peter Zijlstra
2025-12-08  6:10     ` Mi, Dapeng
2025-12-03  6:54 ` [Patch v5 09/19] perf/x86: Enable YMM " Dapeng Mi
2025-12-03  6:54 ` [Patch v5 10/19] perf/x86: Enable ZMM " Dapeng Mi
2025-12-03  6:54 ` [Patch v5 11/19] perf/x86: Enable OPMASK sampling using sample_simd_pred_reg_* fields Dapeng Mi
2025-12-03  6:54 ` [Patch v5 12/19] perf/x86: Enable eGPRs sampling using sample_regs_* fields Dapeng Mi
2025-12-05 12:16   ` Peter Zijlstra
2025-12-08  6:11     ` Mi, Dapeng
2025-12-03  6:54 ` [Patch v5 13/19] perf/x86: Enable SSP " Dapeng Mi
2025-12-05 12:20   ` Peter Zijlstra
2025-12-08  6:21     ` Mi, Dapeng
2025-12-24  5:45   ` Ravi Bangoria
2025-12-24  6:26     ` Mi, Dapeng
2026-01-06  6:55       ` Mi, Dapeng
2025-12-03  6:54 ` [Patch v5 14/19] perf/x86/intel: Enable PERF_PMU_CAP_SIMD_REGS capability Dapeng Mi
2025-12-03  6:54 ` [Patch v5 15/19] perf/x86/intel: Enable arch-PEBS based SIMD/eGPRs/SSP sampling Dapeng Mi
2025-12-03  6:54 ` [Patch v5 16/19] perf/x86: Activate back-to-back NMI detection for arch-PEBS induced NMIs Dapeng Mi
2025-12-05 12:39   ` Peter Zijlstra
2025-12-07 20:44     ` Andi Kleen
2025-12-08  6:46     ` Mi, Dapeng
2025-12-08  8:50       ` Peter Zijlstra
2025-12-08  8:53         ` Mi, Dapeng
2025-12-03  6:54 ` [Patch v5 17/19] perf headers: Sync with the kernel headers Dapeng Mi
2025-12-03 23:43   ` Ian Rogers
2025-12-04  1:37     ` Mi, Dapeng
2025-12-04  7:28       ` Ian Rogers
2026-01-20  7:01   ` Ian Rogers
2026-01-20  7:25     ` Mi, Dapeng
2026-01-20  7:16   ` Ian Rogers
2026-01-20  7:43     ` Mi, Dapeng
2026-01-20  8:00       ` Ian Rogers
2026-01-20  9:22         ` Mi, Dapeng
2026-01-20 18:11           ` Ian Rogers
2026-01-21  2:03             ` Mi, Dapeng [this message]
2025-12-03  6:54 ` [Patch v5 18/19] perf parse-regs: Support new SIMD sampling format Dapeng Mi
2025-12-04  0:17   ` Ian Rogers
2025-12-04  2:58     ` Mi, Dapeng
2025-12-04  7:49       ` Ian Rogers
2025-12-04  9:20         ` Mi, Dapeng
2025-12-04 16:16           ` Ian Rogers
2025-12-05  4:00             ` Mi, Dapeng
2025-12-05  6:38               ` Ian Rogers
2025-12-05  8:10                 ` Mi, Dapeng
2025-12-05 16:35                   ` Ian Rogers
2025-12-08  4:20                     ` Mi, Dapeng
2026-01-06  7:27                       ` Mi, Dapeng
2026-01-17  5:50                         ` Ian Rogers
2026-01-19  6:55                           ` Mi, Dapeng
2026-01-19 20:25                             ` Ian Rogers
2026-01-20  3:04                               ` Mi, Dapeng
2026-01-20  5:16                                 ` Ian Rogers
2026-01-20  6:46                                   ` Mi, Dapeng
2026-01-20  6:56                                     ` Ian Rogers
2026-01-20  7:39   ` Ian Rogers
2026-01-20  9:04     ` Mi, Dapeng
2026-01-20 18:20       ` Ian Rogers
2026-01-21  5:17         ` Mi, Dapeng
2026-01-21  7:09           ` Ian Rogers
2026-01-21  7:52             ` Mi, Dapeng
2026-01-21 14:48               ` Ian Rogers
2026-01-22  1:49                 ` Mi, Dapeng
2026-01-22  7:27                   ` Ian Rogers
2026-01-22  8:29                     ` Mi, Dapeng
2025-12-03  6:55 ` [Patch v5 19/19] perf regs: Enable dumping of SIMD registers Dapeng Mi
2025-12-04  0:24 ` [Patch v5 00/19] Support SIMD/eGPRs/SSP registers sampling for perf Ian Rogers
2025-12-04  3:28   ` Mi, Dapeng
2025-12-16  4:42 ` Ravi Bangoria
2025-12-16  6:59   ` Mi, Dapeng

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=c255f088-5992-45d4-92d7-cdbc9b5e446d@linux.intel.com \
    --to=dapeng1.mi@linux.intel.com \
    --cc=acme@kernel.org \
    --cc=adrian.hunter@intel.com \
    --cc=ak@linux.intel.com \
    --cc=alexander.shishkin@linux.intel.com \
    --cc=broonie@kernel.org \
    --cc=dapeng1.mi@intel.com \
    --cc=dave.hansen@linux.intel.com \
    --cc=eranian@google.com \
    --cc=irogers@google.com \
    --cc=jolsa@kernel.org \
    --cc=kan.liang@linux.intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-perf-users@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=mingo@redhat.com \
    --cc=namhyung@kernel.org \
    --cc=peterz@infradead.org \
    --cc=ravi.bangoria@amd.com \
    --cc=tglx@linutronix.de \
    --cc=thomas.falcon@intel.com \
    --cc=xudong.hao@intel.com \
    --cc=zide.chen@intel.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 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.