From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: linux-kernel@vger.kernel.org
Cc: mingo@kernel.org, jiangshanlai@gmail.com, dipankar@in.ibm.com,
akpm@linux-foundation.org, mathieu.desnoyers@efficios.com,
josh@joshtriplett.org, tglx@linutronix.de, peterz@infradead.org,
rostedt@goodmis.org, dhowells@redhat.com, edumazet@google.com,
fweisbec@gmail.com, oleg@redhat.com, bobby.prani@gmail.com,
"Paul E. McKenney" <paulmck@linux.vnet.ibm.com>,
Fengguang Wu <fengguang.wu@intel.com>
Subject: [PATCH tip/core/rcu 80/88] rcu: Remove SPARSE_RCU_POINTER Kconfig option
Date: Thu, 25 May 2017 14:59:53 -0700 [thread overview]
Message-ID: <1495749601-21574-80-git-send-email-paulmck@linux.vnet.ibm.com> (raw)
In-Reply-To: <20170525215934.GA11578@linux.vnet.ibm.com>
The sparse-based checking for non-RCU accesses to RCU-protected pointers
has been around for a very long time, and it is now the only type of
sparse-based checking that is optional. This commit therefore makes
it unconditional.
Reported-by: Ingo Molnar <mingo@kernel.org>
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Cc: Fengguang Wu <fengguang.wu@intel.com>
---
Documentation/RCU/Design/Requirements/Requirements.html | 9 +++------
Documentation/RCU/checklist.txt | 8 ++++----
Documentation/dev-tools/sparse.rst | 6 ------
include/linux/compiler.h | 4 ----
lib/Kconfig.debug | 15 ---------------
lib/Makefile | 3 ---
.../testing/selftests/rcutorture/doc/TREE_RCU-kconfig.txt | 4 ----
7 files changed, 7 insertions(+), 42 deletions(-)
diff --git a/Documentation/RCU/Design/Requirements/Requirements.html b/Documentation/RCU/Design/Requirements/Requirements.html
index 8c94fc1d1c84..0e6550a8c926 100644
--- a/Documentation/RCU/Design/Requirements/Requirements.html
+++ b/Documentation/RCU/Design/Requirements/Requirements.html
@@ -559,9 +559,7 @@ The <tt>rcu_access_pointer()</tt> on line 6 is similar to
For <tt>remove_gp_synchronous()</tt>, as long as all modifications
to <tt>gp</tt> are carried out while holding <tt>gp_lock</tt>,
the above optimizations are harmless.
- However,
- with <tt>CONFIG_SPARSE_RCU_POINTER=y</tt>,
- <tt>sparse</tt> will complain if you
+ However, <tt>sparse</tt> will complain if you
define <tt>gp</tt> with <tt>__rcu</tt> and then
access it without using
either <tt>rcu_access_pointer()</tt> or <tt>rcu_dereference()</tt>.
@@ -1978,9 +1976,8 @@ guard against mishaps and misuse:
and <tt>rcu_dereference()</tt>, perhaps (incorrectly)
substituting a simple assignment.
To catch this sort of error, a given RCU-protected pointer may be
- tagged with <tt>__rcu</tt>, after which running sparse
- with <tt>CONFIG_SPARSE_RCU_POINTER=y</tt> will complain
- about simple-assignment accesses to that pointer.
+ tagged with <tt>__rcu</tt>, after which sparse
+ will complain about simple-assignment accesses to that pointer.
Arnd Bergmann made me aware of this requirement, and also
supplied the needed
<a href="https://lwn.net/Articles/376011/">patch series</a>.
diff --git a/Documentation/RCU/checklist.txt b/Documentation/RCU/checklist.txt
index 877947130ebe..6beda556faf3 100644
--- a/Documentation/RCU/checklist.txt
+++ b/Documentation/RCU/checklist.txt
@@ -413,11 +413,11 @@ over a rather long period of time, but improvements are always welcome!
read-side critical sections. It is the responsibility of the
RCU update-side primitives to deal with this.
-17. Use CONFIG_PROVE_RCU, CONFIG_DEBUG_OBJECTS_RCU_HEAD, and the
- __rcu sparse checks (enabled by CONFIG_SPARSE_RCU_POINTER) to
- validate your RCU code. These can help find problems as follows:
+17. Use CONFIG_PROVE_LOCKING, CONFIG_DEBUG_OBJECTS_RCU_HEAD, and the
+ __rcu sparse checks to validate your RCU code. These can help
+ find problems as follows:
- CONFIG_PROVE_RCU: check that accesses to RCU-protected data
+ CONFIG_PROVE_LOCKING: check that accesses to RCU-protected data
structures are carried out under the proper RCU
read-side critical section, while holding the right
combination of locks, or whatever other conditions
diff --git a/Documentation/dev-tools/sparse.rst b/Documentation/dev-tools/sparse.rst
index ffdcc97f6f5a..78aa00a604a0 100644
--- a/Documentation/dev-tools/sparse.rst
+++ b/Documentation/dev-tools/sparse.rst
@@ -103,9 +103,3 @@ have already built it.
The optional make variable CF can be used to pass arguments to sparse. The
build system passes -Wbitwise to sparse automatically.
-
-Checking RCU annotations
-~~~~~~~~~~~~~~~~~~~~~~~~
-
-RCU annotations are not checked by default. To enable RCU annotation
-checks, include -DCONFIG_SPARSE_RCU_POINTER in your CF flags.
diff --git a/include/linux/compiler.h b/include/linux/compiler.h
index f8110051188f..707242fdbb89 100644
--- a/include/linux/compiler.h
+++ b/include/linux/compiler.h
@@ -17,11 +17,7 @@
# define __release(x) __context__(x,-1)
# define __cond_lock(x,c) ((c) ? ({ __acquire(x); 1; }) : 0)
# define __percpu __attribute__((noderef, address_space(3)))
-#ifdef CONFIG_SPARSE_RCU_POINTER
# define __rcu __attribute__((noderef, address_space(4)))
-#else /* CONFIG_SPARSE_RCU_POINTER */
-# define __rcu
-#endif /* CONFIG_SPARSE_RCU_POINTER */
# define __private __attribute__((noderef))
extern void __chk_user_ptr(const volatile void __user *);
extern void __chk_io_ptr(const volatile void __iomem *);
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
index 762deab304fe..498d5dd63bf4 100644
--- a/lib/Kconfig.debug
+++ b/lib/Kconfig.debug
@@ -1306,21 +1306,6 @@ menu "RCU Debugging"
config PROVE_RCU
def_bool PROVE_LOCKING
-config SPARSE_RCU_POINTER
- bool "RCU debugging: sparse-based checks for pointer usage"
- default n
- help
- This feature enables the __rcu sparse annotation for
- RCU-protected pointers. This annotation will cause sparse
- to flag any non-RCU used of annotated pointers. This can be
- helpful when debugging RCU usage. Please note that this feature
- is not intended to enforce code cleanliness; it is instead merely
- a debugging aid.
-
- Say Y to make sparse flag questionable use of RCU-protected pointers
-
- Say N if you are unsure.
-
config TORTURE_TEST
tristate
default n
diff --git a/lib/Makefile b/lib/Makefile
index 0166fbc0fa81..07fbe6a75692 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -25,9 +25,6 @@ lib-y := ctype.o string.o vsprintf.o cmdline.o \
earlycpio.o seq_buf.o siphash.o \
nmi_backtrace.o nodemask.o win_minmax.o
-CFLAGS_radix-tree.o += -DCONFIG_SPARSE_RCU_POINTER
-CFLAGS_idr.o += -DCONFIG_SPARSE_RCU_POINTER
-
lib-$(CONFIG_MMU) += ioremap.o
lib-$(CONFIG_SMP) += cpumask.o
lib-$(CONFIG_DMA_NOOP_OPS) += dma-noop.o
diff --git a/tools/testing/selftests/rcutorture/doc/TREE_RCU-kconfig.txt b/tools/testing/selftests/rcutorture/doc/TREE_RCU-kconfig.txt
index b778a28f1386..c5c29fb7438c 100644
--- a/tools/testing/selftests/rcutorture/doc/TREE_RCU-kconfig.txt
+++ b/tools/testing/selftests/rcutorture/doc/TREE_RCU-kconfig.txt
@@ -74,10 +74,6 @@ CONFIG_TINY_RCU
These are controlled by CONFIG_PREEMPT and/or CONFIG_SMP.
-CONFIG_SPARSE_RCU_POINTER
-
- Makes sense only for sparse runs, not for kernel builds.
-
CONFIG_SRCU
CONFIG_TASKS_RCU
--
2.5.2
next prev parent reply other threads:[~2017-05-25 22:09 UTC|newest]
Thread overview: 104+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-05-25 21:59 [PATCH tip/core/rcu 0/88] Commits for 4.13 Paul E. McKenney
2017-05-25 21:58 ` [PATCH tip/core/rcu 01/88] rcutorture: Add lockdep to one of the SRCU scenarios Paul E. McKenney
2017-05-25 21:58 ` [PATCH tip/core/rcu 02/88] rcutorture: Add three-level tree test for Tree SRCU Paul E. McKenney
2017-05-25 21:58 ` [PATCH tip/core/rcu 03/88] rcutorture: Fix bug in reporting Kconfig mis-settings Paul E. McKenney
2017-05-25 21:58 ` [PATCH tip/core/rcu 04/88] rcutorture: Add a scenario for Tiny SRCU Paul E. McKenney
2017-05-25 21:58 ` [PATCH tip/core/rcu 05/88] rcutorture: Add a scenario for Classic SRCU Paul E. McKenney
2017-05-25 21:58 ` [PATCH tip/core/rcu 06/88] rcu: Prevent rcu_barrier() from starting needless grace periods Paul E. McKenney
2017-05-25 21:58 ` [PATCH tip/core/rcu 07/88] rcutorture: Correctly handle CONFIG_RCU_TORTURE_TEST_* options Paul E. McKenney
2017-05-25 21:58 ` [PATCH tip/core/rcu 08/88] rcutorture: Update test scenarios based on new Kconfig dependencies Paul E. McKenney
2017-05-25 21:58 ` [PATCH tip/core/rcu 09/88] srcu: Eliminate possibility of destructive counter overflow Paul E. McKenney
2017-05-25 21:58 ` [PATCH tip/core/rcu 10/88] rcu: Complain if blocking in preemptible RCU read-side critical section Paul E. McKenney
2017-05-25 21:58 ` [PATCH tip/core/rcu 11/88] rcuperf: Defer expedited/normal check to end of test Paul E. McKenney
2017-05-25 21:58 ` [PATCH tip/core/rcu 12/88] rcuperf: Remove conflicting Kconfig options Paul E. McKenney
2017-05-25 21:58 ` [PATCH tip/core/rcu 13/88] rcu: Remove obsolete reference to synchronize_kernel() Paul E. McKenney
2017-05-25 21:58 ` [PATCH tip/core/rcu 14/88] rcuperf: Add ability to performance-test call_rcu() and friends Paul E. McKenney
2017-05-25 21:58 ` [PATCH tip/core/rcu 15/88] rcuperf: Add a Kconfig-fragment file for Classic SRCU Paul E. McKenney
2017-05-25 21:58 ` [PATCH tip/core/rcu 16/88] rcu: Make sync_rcu_preempt_exp_done() return bool Paul E. McKenney
2017-05-25 21:58 ` [PATCH tip/core/rcu 17/88] checkpatch: Remove checks for expedited grace periods Paul E. McKenney
2017-05-25 21:58 ` [PATCH tip/core/rcu 18/88] rcuperf: Add test for dynamically initialized srcu_struct Paul E. McKenney
2017-05-25 21:58 ` [PATCH tip/core/rcu 19/88] doc/atomic_ops: Clarify smp_mb__{before,after}_atomic() Paul E. McKenney
2017-05-25 21:58 ` [PATCH tip/core/rcu 20/88] atomics: Add header comment so spin_unlock_wait() Paul E. McKenney
2017-06-10 15:02 ` Andrea Parri
2017-05-25 21:58 ` [PATCH tip/core/rcu 21/88] docs: Fix typo in Documentation/memory-barriers.txt Paul E. McKenney
2017-05-25 21:58 ` [PATCH tip/core/rcu 22/88] rcuperf: Add the ability to test tiny RCU flavors Paul E. McKenney
2017-05-25 21:58 ` [PATCH tip/core/rcu 23/88] srcu: Make Classic and Tree SRCU announce themselves at bootup Paul E. McKenney
2017-05-25 21:58 ` [PATCH tip/core/rcu 24/88] rcutorture: Reduce CPUs dedicated to testing Classic SRCU Paul E. McKenney
2017-05-25 21:58 ` [PATCH tip/core/rcu 25/88] srcu: Shrink Tiny SRCU a bit more Paul E. McKenney
2017-05-25 21:58 ` [PATCH tip/core/rcu 26/88] rcuperf: Set more user-friendly defaults Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 27/88] srcu-cbmc: Use /usr/bin/awk instead of /bin/awk Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 28/88] rcuperf: Add writer_holdoff boot parameter Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 29/88] rcutorture: Add "git diff" output to testid.txt file Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 30/88] srcu: Document auto-expediting requirement Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 31/88] doc: Take tail recursion into account in RCU requirements Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 32/88] rcu: Add preemptibility checks in rcu_sched_qs() and rcu_bh_qs() Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 33/88] rcu: Print out rcupdate.c non-default boot-time settings Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 34/88] rcu: Update rcu_bootup_announce_oddness() Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 35/88] srcu: Make exp_holdoff module parameter be static Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 36/88] srcu: Print non-default exp_holdoff values at boot time Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 37/88] rcu: Add lockdep_assert_held() teeth to tree.c Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 38/88] rcu: Add lockdep_assert_held() teeth to tree_plugin.h Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 39/88] srcu: Make SRCU be once again optional Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 40/88] srcu: Shrink Tiny SRCU a bit Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 41/88] srcu: Add DEBUG_OBJECTS_RCU_HEAD functionality Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 42/88] rcu: Make synchronize_rcu_mult() check for duplicates Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 43/88] sched: Rely on synchronize_rcu_mult() de-duplication Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 44/88] rcu: Use RCU_NOCB_WAKE rather than RCU_NOGP_WAKE Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 45/88] rcu: Add memory barriers for NOCB leader wakeup Paul E. McKenney
2017-06-08 20:11 ` Krister Johansen
2017-06-08 20:55 ` Paul E. McKenney
2017-06-08 21:28 ` Krister Johansen
2017-06-08 23:47 ` Paul E. McKenney
2017-06-09 3:24 ` Krister Johansen
2017-05-25 21:59 ` [PATCH tip/core/rcu 46/88] torture: Add --kconfig argument to kvm.sh Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 47/88] rcu: Flag need for rcu_node_tree.h and rcu_segcblist.h visibility Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 48/88] rcutorture: Don't wait for kernel when all builds fail Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 49/88] rcu: Move docbook comments out of rcupdate.h Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 50/88] rcu: Move rcu_expedited and rcu_normal externs from rcupdate.h Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 51/88] rcu: Move expediting-related access/control out of rcupdate.h Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 52/88] rcu: Move torture-related definitions from rcupdate.h to rcu.h Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 53/88] rcu: Remove UINT_CMP_GE() and UINT_CMP_LT() Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 54/88] rcu: Move rcupdate.h to new empty-function style Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 55/88] rcu: Eliminate the unused __rcu_is_watching() function Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 56/88] rcu: Move the RCU_SCHEDULER_ definitions from rcupdate.h Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 57/88] rcu: Remove linux/debugobjects.h " Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 58/88] rcu: Improve __call_rcu() debug-objects error message Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 59/88] rcu: Move rcu_is_nocb_cpu() from rcupdate.h to rcu.h Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 60/88] rcu: Move rcu_ftrace_dump() " Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 61/88] rcu: move rcupdate.h to the new true/false-function style Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 62/88] rcu: Move torture-related functions out of rcutiny.h and rcutree.h Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 63/88] rcu: Move rcu_request_urgent_qs_task() " Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 64/88] rcu: Move rcutiny.h to new empty-function style Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 65/88] rcu: move rcutiny.h to the new true/false-function style Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 66/88] srcu: Prevent sdp->srcu_gp_seq_needed counter wrap Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 67/88] srcu: Shrink srcu.h by moving docbook and private function Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 68/88] srcu: Apply trivial callback lists to shrink Tiny SRCU Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 69/88] lockdep: Use consistent printing primitives Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 70/88] rcu: Refactor #includes from include/linux/rcupdate.h Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 71/88] rcu: Convert rnp->lock wrappers to macros for SRCU use Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 72/88] rcu: Move rnp->lock wrappers " Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 73/88] srcu: Use rnp->lock wrappers to replace explicit memory barriers Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 74/88] rcu: Remove *_SLOW_* Kconfig options Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 75/88] rcu: Remove the RCU_KTHREAD_PRIO Kconfig option Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 76/88] rcu: Remove nohz_full full-system-idle state machine Paul E. McKenney
2017-05-25 23:03 ` Linus Torvalds
2017-05-25 23:42 ` Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 77/88] rcu: Remove #ifdef moving rcu_end_inkernel_boot from rcupdate.h Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 78/88] rcu: Remove typecheck() from RCU locking wrapper functions Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 79/88] rcu: Remove the now-obsolete PROVE_RCU_REPEATEDLY Kconfig option Paul E. McKenney
2017-05-25 21:59 ` Paul E. McKenney [this message]
2017-05-25 21:59 ` [PATCH tip/core/rcu 81/88] srcu: Fix rcutorture-statistics typo Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 82/88] srcu: Remove Classic SRCU Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 83/88] rcu: Remove debugfs tracing Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 84/88] rcu: Eliminate NOCBs CPU-state Kconfig options Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 85/88] rcu: Move RCU non-debug Kconfig options to kernel/rcu Paul E. McKenney
2017-05-25 21:59 ` [PATCH tip/core/rcu 86/88] rcu: Move RCU debug " Paul E. McKenney
2017-05-25 22:00 ` [PATCH tip/core/rcu 87/88] rcu: Remove event tracing from Tiny RCU Paul E. McKenney
2017-05-25 22:00 ` [PATCH tip/core/rcu 88/88] rcu: Remove RCU CPU stall warnings " Paul E. McKenney
2017-06-09 13:52 ` [PATCH tip/core/rcu 0/88] Commits for 4.13 Steven Rostedt
2017-06-09 16:24 ` Paul E. McKenney
2017-06-09 16:39 ` Steven Rostedt
2017-06-09 17:20 ` Paul E. McKenney
2017-06-09 17:33 ` Steven Rostedt
2017-06-09 17:57 ` Paul E. McKenney
2017-06-09 18:01 ` Paul E. McKenney
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=1495749601-21574-80-git-send-email-paulmck@linux.vnet.ibm.com \
--to=paulmck@linux.vnet.ibm.com \
--cc=akpm@linux-foundation.org \
--cc=bobby.prani@gmail.com \
--cc=dhowells@redhat.com \
--cc=dipankar@in.ibm.com \
--cc=edumazet@google.com \
--cc=fengguang.wu@intel.com \
--cc=fweisbec@gmail.com \
--cc=jiangshanlai@gmail.com \
--cc=josh@joshtriplett.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mathieu.desnoyers@efficios.com \
--cc=mingo@kernel.org \
--cc=oleg@redhat.com \
--cc=peterz@infradead.org \
--cc=rostedt@goodmis.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: 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;
as well as URLs for NNTP newsgroup(s).