From: Ian Rogers <irogers@google.com>
To: irogers@google.com, acme@kernel.org, james.clark@linaro.org,
namhyung@kernel.org
Cc: 9erthalion6@gmail.com, adrian.hunter@intel.com, alex@ghiti.fr,
alexandre.chartre@oracle.com, andrii@kernel.org,
ankur.a.arora@oracle.com, aou@eecs.berkeley.edu,
bpf@vger.kernel.org, collin.funk1@gmail.com,
costa.shul@redhat.com, daniel@iogearbox.net,
dapeng1.mi@linux.intel.com, dsterba@suse.com, eddyz87@gmail.com,
howardchu95@gmail.com, jolsa@kernel.org, leo.yan@arm.com,
linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org,
martin.lau@linux.dev, memxor@gmail.com, mingo@redhat.com,
mmayer@broadcom.com, nathan@kernel.org, palmer@dabbelt.com,
peterz@infradead.org, pjw@kernel.org, qmo@kernel.org,
ricky.ringler@proton.me, song@kernel.org,
swapnil.sapkal@amd.com, terrelln@fb.com, tglozar@redhat.com,
thomas.falcon@intel.com, yonghong.song@linux.dev
Subject: [PATCH v4 00/14] perf build: Reduce build time by nearly half
Date: Fri, 15 May 2026 10:38:37 -0700 [thread overview]
Message-ID: <20260515173852.1378571-1-irogers@google.com> (raw)
In-Reply-To: <CAP-5=fWfrGMV4EafqkwQO-R33c_szXcxVLgH0c4k2zt3zj4HdQ@mail.gmail.com>
This patch series refactors Kbuild internals, BPF skeleton generation,
Python AST pre-computation, and foundational tooling dependencies across
the perf tool build system. By eliminating umbrella target synchronization
barriers, decoupling static library prerequisites, parallelizing single-core
script generators, and eradicating redundant feature checks, this series
unlocks absolute theoretical peak multi-core concurrency during Kbuild startup.
On a 28-core build workstation (make -j28 all from scratch), clean build
latency improves by over 44%:
Before:
real 0m29.006s
user 2m46.019s
sys 0m30.610s
After:
real 0m16.091s
user 2m40.135s
sys 0m25.740s
Saving 12.9 full seconds time per clean build. Furthermore, nothing to
build incremental builds are improved by nearly 7x:
Before:
real 0m11.528s
user 0m9.633s
sys 0m6.965s
After:
real 0m1.717s
user 0m1.682s
sys 0m0.960s
Summary of Patches:
1: Fast-Path Feature Detection
- Refactors test-clang-bpf-co-re.bin and test-bpftool-skeletons.bin feature
checks to redirect grep output to .make.output and touch $@ upon success
(> $(@:.bin=.make.output) 2>&1 && touch $@). This perfectly matches standard
Kbuild feature check conventions and ensures the target files are touched on
disk purely upon success, allowing Kbuild to cache positive detections and avoid
continuous sub-make re-evaluations during incremental builds. For
test-clang-bpf-co-re.bin, adds explicit source prerequisite test-clang-bpf-co-re.c
and simplifies Clang recipe using $<.
2-4: Flattening Umbrella Prepare Barriers
- builtin-trace embedded inclusions and pmu-events generation are completely
decoupled from the sequential "prepare" umbrella target, eliminating Make
AST double-parsing overhead and unchoking parallel compilation barriers.
5-7: Decoupling & Pre-generating BPF Skeletons
- BPF skeleton rules are extracted out of Makefile.perf into bpf_skel.mak.
- Decouples bpftool bootstrap from top-level static libbpf dependencies,
attaching bpf-skel-prepare directly to the umbrella prepare target. This
allows Make to pre-compile bpftool and dump vmlinux.h in the background at
build startup, removing the 7-second serialization bottleneck before BPF
object compilation.
- Ensures benchmark skeleton intermediate .bpf.o files are cleanly removed
during make clean, and adds bpf-skel-prepare to .PHONY.
8-9: Foundational Linkage Optimization
- Moves static libsymbol library prerequisites out of the prepare step.
- Eliminates redundant libbpf sub-make feature checks during static builds.
10-11: jevents.py Concurrency & Deduplication
- Splits the massive 2.8 MB big_c_string literal out of pmu-events.c into a
dedicated pmu-events-string.c compilation unit. This slices C compilation
latency in half by compiling string and struct tables simultaneously across
separate CPU cores while preserving zero dynamic ELF relocations. Adds
pmu-events-string.c to .gitignore, includes pmu-events.h for global extern
declarations, defers file closures to ensure identical timestamps, and uses
Make 4.0 compatible dependency chaining with robust self-correction checks.
- Pre-populates jevents.py JSON ASTs and metric formulas in parallel across
all available CPU cores using ProcessPoolExecutor (accelerating Python
execution by 11x, from 3.3s down to ~290ms). Moves _init_worker to top-level
scope to ensure clean pickling under spawn multiprocessing start methods.
12: Out-of-Tree Incremental Rebuild Fix
- Prefixes SCRIPTS (perf-archive, perf-iostat) with $(OUTPUT) to prevent
Make from continuously re-executing script installation rules on already
built out-of-tree builds.
13-14: AST Parsing Optimization & Shell Fork Eradication
- Converts ZENS, ARMS, and INTELS in pmu-events/Build from recursive assignment
(=) to simply expanded assignment (:=) and replaces model_name/vendor_name
with pure GNU Make string functions. This guarantees Make executes directory
probing shell forks exactly once during AST parsing and evaluates path macros
purely in memory, completely eradicating over 7,800 redundant sub-processes
during out-of-tree build evaluation.
- Converts llvm-config shell queries in Makefile.config from recursive assignment
(=) to simply expanded assignment (:=). This eliminates ~185 redundant sub-processes
that were previously executed across object compilation dependency checks.
Changes since v3:
- Streamlined series to 14 patches by dropping Patches 1, 2, and 9 to focus on
the most uncontroversial, high-impact architectural gains.
- tools build (Patch 1): Refactored test-bpftool-skeletons.bin and
test-clang-bpf-co-re.bin feature check recipes to match standard Kbuild
conventions by redirecting grep output to .make.output and touching $@ upon
success (> $(@:.bin=.make.output) 2>&1 && touch $@). Added explicit source
file prerequisite test-clang-bpf-co-re.c and simplified Clang recipe using $<.
- perf build (Patch 7): Fixed missing prerequisite on bpf-skel-prepare in
bpf_skel.mak by making it depend directly on explicit $(BPFTOOL) $(VMLINUX_H)
prerequisites, preventing it from executing as a no-op during prepare.
- perf pmu-events (Patch 10): Added extern const char big_c_string[]; declaration
to pmu-events.h and included it in output_string_file to satisfy Clang
-Wmissing-variable-declarations compiler warnings. Deferred closing
output_string_file until the absolute tail of main() to ensure identical
timestamps with output_file, preventing redundant incremental rebuilds. Updated
the secondary target rule in pmu-events/Build to verify the file exists on disk
and force a rebuild if manually deleted, ensuring 100% self-correcting builds.
Ian Rogers (14):
tools build: Fix feature checks to touch target files on success
perf trace beauty: Make beauty generated C code standalone .o files
perf build: Decouple pmu-events from prepare umbrella target
perf build: Remove empty archheaders target
perf build: Move BPF skeleton generation out of Makefile.perf
perf build: Encapsulate vmlinux.h and bpftool in bpf_skel.mak
perf build: Pre-generate BPF skeleton tooling during umbrella prepare
phase
perf build: Move libsymbol dependency out of prepare step
perf build: Remove redundant libbpf feature check for static builds
perf pmu-events: Split big_c_string storage into standalone
compilation unit
perf pmu-events: Parallelize JSON and metric pre-computation in
jevents.py
perf build: Prefix SCRIPTS with output directory to fix continuous
rebuilds
perf pmu-events: Convert recursive shell assignments and macros to
Make built-ins
perf build: Convert llvm-config shell queries to simply expanded
variables
tools/build/feature/Makefile | 8 +-
tools/perf/.gitignore | 1 +
tools/perf/Build | 2 +
tools/perf/Makefile.config | 19 +-
tools/perf/Makefile.perf | 423 ++----------------
tools/perf/bench/Build | 6 +
.../bpf_skel/bench_uprobe.bpf.c | 0
tools/perf/bench/uprobe.c | 2 +-
tools/perf/bpf_skel.mak | 109 +++++
tools/perf/builtin-trace.c | 32 +-
tools/perf/pmu-events/Build | 26 +-
tools/perf/pmu-events/jevents.py | 57 ++-
tools/perf/pmu-events/pmu-events.h | 2 +
tools/perf/trace/beauty/Build | 276 ++++++++++++
tools/perf/trace/beauty/arch_errno_names.c | 2 +
tools/perf/trace/beauty/arch_errno_names.sh | 2 +-
tools/perf/trace/beauty/beauty.h | 60 +++
tools/perf/trace/beauty/eventfd.c | 6 +-
tools/perf/trace/beauty/fsconfig.c | 5 +
tools/perf/trace/beauty/futex_op.c | 5 +-
tools/perf/trace/beauty/futex_val3.c | 5 +-
tools/perf/trace/beauty/mmap.c | 24 +-
tools/perf/trace/beauty/mode_t.c | 6 +-
tools/perf/trace/beauty/msg_flags.c | 8 +-
tools/perf/trace/beauty/open_flags.c | 2 +
tools/perf/trace/beauty/perf_event_open.c | 21 +-
tools/perf/trace/beauty/pid.c | 5 +-
tools/perf/trace/beauty/sched_policy.c | 8 +-
tools/perf/trace/beauty/seccomp.c | 12 +-
tools/perf/trace/beauty/signum.c | 6 +-
tools/perf/trace/beauty/socket_type.c | 6 +-
.../perf/{util => trace/beauty}/syscalltbl.c | 0
.../perf/{util => trace/beauty}/syscalltbl.h | 0
tools/perf/trace/beauty/tracepoints/Build | 21 +
tools/perf/trace/beauty/waitid_options.c | 8 +-
tools/perf/util/Build | 17 +-
tools/perf/util/bpf-trace-summary.c | 2 +-
tools/perf/util/env.c | 4 -
tools/perf/util/env.h | 1 +
39 files changed, 685 insertions(+), 514 deletions(-)
rename tools/perf/{util => bench}/bpf_skel/bench_uprobe.bpf.c (100%)
create mode 100644 tools/perf/bpf_skel.mak
create mode 100644 tools/perf/trace/beauty/fsconfig.c
rename tools/perf/{util => trace/beauty}/syscalltbl.c (100%)
rename tools/perf/{util => trace/beauty}/syscalltbl.h (100%)
--
2.54.0.563.g4f69b47b94-goog
next prev parent reply other threads:[~2026-05-15 17:39 UTC|newest]
Thread overview: 90+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-12 5:35 [PATCH v1 00/14] perf build: Reduce build time by one third Ian Rogers
2026-05-12 5:35 ` [PATCH v1 01/14] bpftool build: Restrict feature tests during bootstrap compilation Ian Rogers
2026-05-12 5:35 ` [PATCH v1 02/14] perf trace beauty: Make beauty generated C code standalone .o files Ian Rogers
2026-05-12 5:35 ` [PATCH v1 03/14] perf build: Decouple pmu-events from prepare umbrella target Ian Rogers
2026-05-12 5:35 ` [PATCH v1 04/14] perf build: Remove empty archheaders target Ian Rogers
2026-05-12 5:35 ` [PATCH v1 05/14] perf build: Move BPF skeleton generation out of Makefile.perf Ian Rogers
2026-05-12 5:35 ` [PATCH v1 06/14] perf build: Encapsulate vmlinux.h and bpftool in bpf_skel.mak Ian Rogers
2026-05-12 5:35 ` [PATCH v1 07/14] perf build: Move static libbpf dependency out of prepare step Ian Rogers
2026-05-12 5:35 ` [PATCH v1 08/14] perf build: Pre-generate BPF skeletons during umbrella prepare phase Ian Rogers
2026-05-12 5:35 ` [PATCH v1 09/14] perf build: Move libsymbol dependency out of prepare step Ian Rogers
2026-05-12 5:35 ` [PATCH v1 10/14] perf build: Remove redundant libbpf feature check for static builds Ian Rogers
2026-05-12 5:35 ` [PATCH v1 11/14] tools build: Integrate libdebuginfod into test-all fast path Ian Rogers
2026-05-12 5:35 ` [PATCH v1 12/14] perf pmu-events: Split big_c_string storage into standalone compilation unit Ian Rogers
2026-05-12 5:35 ` [PATCH v1 13/14] perf pmu-events: Parallelize JSON and metric pre-computation in jevents.py Ian Rogers
2026-05-12 5:35 ` [PATCH v1 14/14] perf build: Prefix SCRIPTS with output directory to fix continuous rebuilds Ian Rogers
2026-05-12 17:46 ` [PATCH v2 00/18] perf build: Reduce build time by nearly half Ian Rogers
2026-05-12 17:46 ` [PATCH v2 01/18] bpftool build: Restrict feature tests during bootstrap compilation Ian Rogers
2026-05-12 17:46 ` [PATCH v2 02/18] tools build: Integrate libdebuginfod into test-all fast path Ian Rogers
2026-05-12 17:46 ` [PATCH v2 03/18] tools build: Fix test-clang-bpf-co-re.bin to generate target file Ian Rogers
2026-05-12 17:46 ` [PATCH v2 04/18] tools scripts: Short-circuit CC_NO_CLANG compiler probe in Makefile.include Ian Rogers
2026-05-12 17:46 ` [PATCH v2 05/18] perf trace beauty: Make beauty generated C code standalone .o files Ian Rogers
2026-05-12 17:46 ` [PATCH v2 06/18] perf build: Decouple pmu-events from prepare umbrella target Ian Rogers
2026-05-12 17:46 ` [PATCH v2 07/18] perf build: Remove empty archheaders target Ian Rogers
2026-05-12 17:46 ` [PATCH v2 08/18] perf build: Move BPF skeleton generation out of Makefile.perf Ian Rogers
2026-05-12 17:46 ` [PATCH v2 09/18] perf build: Encapsulate vmlinux.h and bpftool in bpf_skel.mak Ian Rogers
2026-05-12 17:46 ` [PATCH v2 10/18] perf build: Move static libbpf dependency out of prepare step Ian Rogers
2026-05-12 17:46 ` [PATCH v2 11/18] perf build: Pre-generate BPF skeleton tooling during umbrella prepare phase Ian Rogers
2026-05-12 17:46 ` [PATCH v2 12/18] perf build: Move libsymbol dependency out of prepare step Ian Rogers
2026-05-12 17:46 ` [PATCH v2 13/18] perf build: Remove redundant libbpf feature check for static builds Ian Rogers
2026-05-12 17:46 ` [PATCH v2 14/18] perf pmu-events: Split big_c_string storage into standalone compilation unit Ian Rogers
2026-05-12 17:46 ` [PATCH v2 15/18] perf pmu-events: Parallelize JSON and metric pre-computation in jevents.py Ian Rogers
2026-05-12 17:46 ` [PATCH v2 16/18] perf build: Prefix SCRIPTS with output directory to fix continuous rebuilds Ian Rogers
2026-05-12 17:46 ` [PATCH v2 17/18] perf pmu-events: Convert recursive shell assignments and macros to Make built-ins Ian Rogers
2026-05-12 17:46 ` [PATCH v2 18/18] perf build: Convert llvm-config shell queries to simply expanded variables Ian Rogers
2026-05-14 16:33 ` [PATCH v3 00/17] perf build: Reduce build time by nearly half Ian Rogers
2026-05-14 16:33 ` [PATCH v3 01/17] bpftool build: Restrict feature tests during bootstrap compilation Ian Rogers
2026-05-14 16:33 ` [PATCH v3 02/17] tools build: Integrate libdebuginfod into test-all fast path Ian Rogers
2026-05-14 16:33 ` [PATCH v3 03/17] tools build: Fix test-clang-bpf-co-re.bin to generate target file Ian Rogers
2026-05-14 16:33 ` [PATCH v3 04/17] perf trace beauty: Make beauty generated C code standalone .o files Ian Rogers
2026-05-14 16:33 ` [PATCH v3 05/17] perf build: Decouple pmu-events from prepare umbrella target Ian Rogers
2026-05-14 16:33 ` [PATCH v3 06/17] perf build: Remove empty archheaders target Ian Rogers
2026-05-14 16:33 ` [PATCH v3 07/17] perf build: Move BPF skeleton generation out of Makefile.perf Ian Rogers
2026-05-14 16:34 ` [PATCH v3 08/17] perf build: Encapsulate vmlinux.h and bpftool in bpf_skel.mak Ian Rogers
2026-05-14 16:34 ` [PATCH v3 09/17] perf build: Move static libbpf dependency out of prepare step Ian Rogers
2026-05-14 16:34 ` [PATCH v3 10/17] perf build: Pre-generate BPF skeleton tooling during umbrella prepare phase Ian Rogers
2026-05-14 16:34 ` [PATCH v3 11/17] perf build: Move libsymbol dependency out of prepare step Ian Rogers
2026-05-14 16:34 ` [PATCH v3 12/17] perf build: Remove redundant libbpf feature check for static builds Ian Rogers
2026-05-14 16:34 ` [PATCH v3 13/17] perf pmu-events: Split big_c_string storage into standalone compilation unit Ian Rogers
2026-05-14 16:34 ` [PATCH v3 14/17] perf pmu-events: Parallelize JSON and metric pre-computation in jevents.py Ian Rogers
2026-05-14 16:34 ` [PATCH v3 15/17] perf build: Prefix SCRIPTS with output directory to fix continuous rebuilds Ian Rogers
2026-05-14 16:34 ` [PATCH v3 16/17] perf pmu-events: Convert recursive shell assignments and macros to Make built-ins Ian Rogers
2026-05-14 16:34 ` [PATCH v3 17/17] perf build: Convert llvm-config shell queries to simply expanded variables Ian Rogers
2026-05-14 22:06 ` [PATCH v3 00/17] perf build: Reduce build time by nearly half Namhyung Kim
2026-05-14 22:23 ` Ian Rogers
2026-05-15 16:20 ` Ian Rogers
2026-05-15 17:38 ` Ian Rogers [this message]
2026-05-15 17:38 ` [PATCH v4 01/14] tools build: Fix feature checks to touch target files on success Ian Rogers
2026-05-15 17:38 ` [PATCH v4 02/14] perf trace beauty: Make beauty generated C code standalone .o files Ian Rogers
2026-05-15 18:45 ` Namhyung Kim
2026-05-15 17:38 ` [PATCH v4 03/14] perf build: Decouple pmu-events from prepare umbrella target Ian Rogers
2026-05-15 17:38 ` [PATCH v4 04/14] perf build: Remove empty archheaders target Ian Rogers
2026-05-15 17:38 ` [PATCH v4 05/14] perf build: Move BPF skeleton generation out of Makefile.perf Ian Rogers
2026-05-15 17:38 ` [PATCH v4 06/14] perf build: Encapsulate vmlinux.h and bpftool in bpf_skel.mak Ian Rogers
2026-05-15 17:38 ` [PATCH v4 07/14] perf build: Pre-generate BPF skeleton tooling during umbrella prepare phase Ian Rogers
2026-05-15 17:38 ` [PATCH v4 08/14] perf build: Move libsymbol dependency out of prepare step Ian Rogers
2026-05-15 17:38 ` [PATCH v4 09/14] perf build: Remove redundant libbpf feature check for static builds Ian Rogers
2026-05-15 17:38 ` [PATCH v4 10/14] perf pmu-events: Split big_c_string storage into standalone compilation unit Ian Rogers
2026-05-15 17:38 ` [PATCH v4 11/14] perf pmu-events: Parallelize JSON and metric pre-computation in jevents.py Ian Rogers
2026-05-15 19:41 ` Namhyung Kim
2026-05-15 17:38 ` [PATCH v4 12/14] perf build: Prefix SCRIPTS with output directory to fix continuous rebuilds Ian Rogers
2026-05-15 19:48 ` Namhyung Kim
2026-05-15 17:38 ` [PATCH v4 13/14] perf pmu-events: Convert recursive shell assignments and macros to Make built-ins Ian Rogers
2026-05-15 17:38 ` [PATCH v4 14/14] perf build: Convert llvm-config shell queries to simply expanded variables Ian Rogers
2026-05-15 19:33 ` [PATCH v5 00/14] perf build: Reduce build time by nearly half Ian Rogers
2026-05-15 19:33 ` [PATCH v5 01/14] tools build: Fix feature checks to touch target files on success Ian Rogers
2026-05-15 19:33 ` [PATCH v5 02/14] perf trace beauty: Make beauty generated C code standalone .o files Ian Rogers
2026-05-15 19:33 ` [PATCH v5 03/14] perf build: Decouple pmu-events from prepare umbrella target Ian Rogers
2026-05-15 19:33 ` [PATCH v5 04/14] perf build: Remove empty archheaders target Ian Rogers
2026-05-15 19:33 ` [PATCH v5 05/14] perf build: Move BPF skeleton generation out of Makefile.perf Ian Rogers
2026-05-15 19:33 ` [PATCH v5 06/14] perf build: Encapsulate vmlinux.h and bpftool in bpf_skel.mak Ian Rogers
2026-05-15 19:33 ` [PATCH v5 07/14] perf build: Pre-generate BPF skeleton tooling during umbrella prepare phase Ian Rogers
2026-05-15 19:33 ` [PATCH v5 08/14] perf build: Move libsymbol dependency out of prepare step Ian Rogers
2026-05-15 19:33 ` [PATCH v5 09/14] perf build: Remove redundant libbpf feature check for static builds Ian Rogers
2026-05-15 19:33 ` [PATCH v5 10/14] perf pmu-events: Split big_c_string storage into standalone compilation unit Ian Rogers
2026-05-15 19:33 ` [PATCH v5 11/14] perf pmu-events: Parallelize JSON and metric pre-computation in jevents.py Ian Rogers
2026-05-15 19:33 ` [PATCH v5 12/14] perf build: Prefix SCRIPTS with output directory to fix continuous rebuilds Ian Rogers
2026-05-15 19:33 ` [PATCH v5 13/14] perf pmu-events: Convert recursive shell assignments and macros to Make built-ins Ian Rogers
2026-05-15 19:33 ` [PATCH v5 14/14] perf build: Convert llvm-config shell queries to simply expanded variables Ian Rogers
2026-05-15 18:20 ` [PATCH v3 00/17] perf build: Reduce build time by nearly half Namhyung Kim
2026-05-12 9:36 ` [PATCH v1 00/14] perf build: Reduce build time by one third James Clark
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=20260515173852.1378571-1-irogers@google.com \
--to=irogers@google.com \
--cc=9erthalion6@gmail.com \
--cc=acme@kernel.org \
--cc=adrian.hunter@intel.com \
--cc=alex@ghiti.fr \
--cc=alexandre.chartre@oracle.com \
--cc=andrii@kernel.org \
--cc=ankur.a.arora@oracle.com \
--cc=aou@eecs.berkeley.edu \
--cc=bpf@vger.kernel.org \
--cc=collin.funk1@gmail.com \
--cc=costa.shul@redhat.com \
--cc=daniel@iogearbox.net \
--cc=dapeng1.mi@linux.intel.com \
--cc=dsterba@suse.com \
--cc=eddyz87@gmail.com \
--cc=howardchu95@gmail.com \
--cc=james.clark@linaro.org \
--cc=jolsa@kernel.org \
--cc=leo.yan@arm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=martin.lau@linux.dev \
--cc=memxor@gmail.com \
--cc=mingo@redhat.com \
--cc=mmayer@broadcom.com \
--cc=namhyung@kernel.org \
--cc=nathan@kernel.org \
--cc=palmer@dabbelt.com \
--cc=peterz@infradead.org \
--cc=pjw@kernel.org \
--cc=qmo@kernel.org \
--cc=ricky.ringler@proton.me \
--cc=song@kernel.org \
--cc=swapnil.sapkal@amd.com \
--cc=terrelln@fb.com \
--cc=tglozar@redhat.com \
--cc=thomas.falcon@intel.com \
--cc=yonghong.song@linux.dev \
/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