From: kernel test robot <lkp@intel.com>
To: Nicholas Piggin <npiggin@gmail.com>, linux-arch@vger.kernel.org
Cc: kbuild-all@lists.01.org, Arnd Bergmann <arnd@arndb.de>,
linux-mm@kvack.org, Catalin Marinas <catalin.marinas@arm.com>,
linux-kernel@vger.kernel.org, Nicholas Piggin <npiggin@gmail.com>,
clang-built-linux@googlegroups.com, Will Deacon <will@kernel.org>,
linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH v2 05/23] arm64: use asm-generic/mmu_context.h for no-op implementations
Date: Thu, 27 Aug 2020 07:55:21 +0800 [thread overview]
Message-ID: <202008270734.xVf7YWvy%lkp@intel.com> (raw)
In-Reply-To: <20200826145249.745432-6-npiggin@gmail.com>
[-- Attachment #1: Type: text/plain, Size: 20766 bytes --]
Hi Nicholas,
I love your patch! Yet something to improve:
[auto build test ERROR on linus/master]
[also build test ERROR on v5.9-rc2 next-20200826]
[cannot apply to sparc/master asm-generic/master sparc-next/master xtensa/for_next]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Nicholas-Piggin/Use-asm-generic-for-mmu_context-no-op-functions/20200826-225632
base: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 2ac69819ba9e3d8d550bb5d2d2df74848e556812
config: arm64-randconfig-r036-20200826 (attached as .config)
compiler: clang version 12.0.0 (https://github.com/llvm/llvm-project 7cfcecece0e0430937cf529ce74d3a071a4dedc6)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# install arm64 cross compiling tool for clang build
# apt-get install binutils-aarch64-linux-gnu
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=arm64
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All errors (new ones prefixed by >>):
In file included from arch/arm64/mm/mmu.c:35:
>> arch/arm64/include/asm/mmu_context.h:226:31: error: too few arguments to function call, expected 2, have 1
check_and_switch_context(next);
~~~~~~~~~~~~~~~~~~~~~~~~ ^
arch/arm64/include/asm/mmu_context.h:177:6: note: 'check_and_switch_context' declared here
void check_and_switch_context(struct mm_struct *mm, unsigned int cpu);
^
1 error generated.
--
In file included from arch/arm64/mm/context.c:16:
>> arch/arm64/include/asm/mmu_context.h:226:31: error: too few arguments to function call, expected 2, have 1
check_and_switch_context(next);
~~~~~~~~~~~~~~~~~~~~~~~~ ^
arch/arm64/include/asm/mmu_context.h:177:6: note: 'check_and_switch_context' declared here
void check_and_switch_context(struct mm_struct *mm, unsigned int cpu);
^
>> arch/arm64/mm/context.c:201:6: error: conflicting types for 'check_and_switch_context'
void check_and_switch_context(struct mm_struct *mm)
^
arch/arm64/include/asm/mmu_context.h:177:6: note: previous declaration is here
void check_and_switch_context(struct mm_struct *mm, unsigned int cpu);
^
2 errors generated.
--
In file included from arch/arm64/kernel/process.c:54:
>> arch/arm64/include/asm/mmu_context.h:226:31: error: too few arguments to function call, expected 2, have 1
check_and_switch_context(next);
~~~~~~~~~~~~~~~~~~~~~~~~ ^
arch/arm64/include/asm/mmu_context.h:177:6: note: 'check_and_switch_context' declared here
void check_and_switch_context(struct mm_struct *mm, unsigned int cpu);
^
arch/arm64/kernel/process.c:260:6: warning: no previous prototype for function '__show_regs' [-Wmissing-prototypes]
void __show_regs(struct pt_regs *regs)
^
arch/arm64/kernel/process.c:260:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
void __show_regs(struct pt_regs *regs)
^
static
arch/arm64/kernel/process.c:352:5: warning: no previous prototype for function 'arch_dup_task_struct' [-Wmissing-prototypes]
int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src)
^
arch/arm64/kernel/process.c:352:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src)
^
static
arch/arm64/kernel/process.c:554:41: warning: no previous prototype for function '__switch_to' [-Wmissing-prototypes]
__notrace_funcgraph struct task_struct *__switch_to(struct task_struct *prev,
^
arch/arm64/kernel/process.c:554:21: note: declare 'static' if the function is not intended to be used outside of this translation unit
__notrace_funcgraph struct task_struct *__switch_to(struct task_struct *prev,
^
static
arch/arm64/kernel/process.c:692:25: warning: no previous prototype for function 'arm64_preempt_schedule_irq' [-Wmissing-prototypes]
asmlinkage void __sched arm64_preempt_schedule_irq(void)
^
arch/arm64/kernel/process.c:692:12: note: declare 'static' if the function is not intended to be used outside of this translation unit
asmlinkage void __sched arm64_preempt_schedule_irq(void)
^
static
4 warnings and 1 error generated.
--
In file included from arch/arm64/kernel/cpu_errata.c:111:
>> arch/arm64/include/asm/mmu_context.h:226:31: error: too few arguments to function call, expected 2, have 1
check_and_switch_context(next);
~~~~~~~~~~~~~~~~~~~~~~~~ ^
arch/arm64/include/asm/mmu_context.h:177:6: note: 'check_and_switch_context' declared here
void check_and_switch_context(struct mm_struct *mm, unsigned int cpu);
^
arch/arm64/kernel/cpu_errata.c:295:13: warning: no previous prototype for function 'arm64_update_smccc_conduit' [-Wmissing-prototypes]
void __init arm64_update_smccc_conduit(struct alt_instr *alt,
^
arch/arm64/kernel/cpu_errata.c:295:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
void __init arm64_update_smccc_conduit(struct alt_instr *alt,
^
static
arch/arm64/kernel/cpu_errata.c:317:13: warning: no previous prototype for function 'arm64_enable_wa2_handling' [-Wmissing-prototypes]
void __init arm64_enable_wa2_handling(struct alt_instr *alt,
^
arch/arm64/kernel/cpu_errata.c:317:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
void __init arm64_enable_wa2_handling(struct alt_instr *alt,
^
static
arch/arm64/kernel/cpu_errata.c:747:3: warning: initializer overrides prior initialization of this subobject [-Winitializer-overrides]
ERRATA_MIDR_REV_RANGE(MIDR_CORTEX_A53, 0, 0, 4),
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
arch/arm64/kernel/cpu_errata.c:506:2: note: expanded from macro 'ERRATA_MIDR_REV_RANGE'
ERRATA_MIDR_RANGE(m, var, r_min, var, r_max)
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
arch/arm64/kernel/cpu_errata.c:498:2: note: expanded from macro 'ERRATA_MIDR_RANGE'
CAP_MIDR_RANGE(model, v_min, r_min, v_max, r_max)
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
arch/arm64/kernel/cpu_errata.c:486:13: note: expanded from macro 'CAP_MIDR_RANGE'
.matches = is_affected_midr_range, \
^~~~~~~~~~~~~~~~~~~~~~
arch/arm64/kernel/cpu_errata.c:746:14: note: previous initialization is here
.matches = is_affected_midr_range,
^~~~~~~~~~~~~~~~~~~~~~
arch/arm64/kernel/cpu_errata.c:753:3: warning: initializer overrides prior initialization of this subobject [-Winitializer-overrides]
ERRATA_MIDR_REV(MIDR_BRAHMA_B53, 0, 0),
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
arch/arm64/kernel/cpu_errata.c:510:2: note: expanded from macro 'ERRATA_MIDR_REV'
ERRATA_MIDR_RANGE(model, var, rev, var, rev)
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
arch/arm64/kernel/cpu_errata.c:498:2: note: expanded from macro 'ERRATA_MIDR_RANGE'
CAP_MIDR_RANGE(model, v_min, r_min, v_max, r_max)
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
arch/arm64/kernel/cpu_errata.c:486:13: note: expanded from macro 'CAP_MIDR_RANGE'
.matches = is_affected_midr_range, \
^~~~~~~~~~~~~~~~~~~~~~
arch/arm64/kernel/cpu_errata.c:752:14: note: previous initialization is here
.matches = is_affected_midr_range,
^~~~~~~~~~~~~~~~~~~~~~
arch/arm64/kernel/cpu_errata.c:938:14: warning: initializer overrides prior initialization of this subobject [-Winitializer-overrides]
.matches = needs_tx2_tvm_workaround,
^~~~~~~~~~~~~~~~~~~~~~~~
arch/arm64/kernel/cpu_errata.c:937:3: note: previous initialization is here
ERRATA_MIDR_RANGE_LIST(tx2_family_cpus),
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
arch/arm64/kernel/cpu_errata.c:520:2: note: expanded from macro 'ERRATA_MIDR_RANGE_LIST'
CAP_MIDR_RANGE_LIST(midr_list)
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
arch/arm64/kernel/cpu_errata.c:501:13: note: expanded from macro 'CAP_MIDR_RANGE_LIST'
.matches = is_affected_midr_range_list, \
^~~~~~~~~~~~~~~~~~~~~~~~~~~
5 warnings and 1 error generated.
--
In file included from arch/arm64/kernel/smp.c:43:
In file included from arch/arm64/include/asm/kvm_mmu.h:90:
>> arch/arm64/include/asm/mmu_context.h:226:31: error: too few arguments to function call, expected 2, have 1
check_and_switch_context(next);
~~~~~~~~~~~~~~~~~~~~~~~~ ^
arch/arm64/include/asm/mmu_context.h:177:6: note: 'check_and_switch_context' declared here
void check_and_switch_context(struct mm_struct *mm, unsigned int cpu);
^
arch/arm64/kernel/smp.c:842:6: warning: no previous prototype for function 'arch_irq_work_raise' [-Wmissing-prototypes]
void arch_irq_work_raise(void)
^
arch/arm64/kernel/smp.c:842:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
void arch_irq_work_raise(void)
^
static
arch/arm64/kernel/smp.c:863:6: warning: no previous prototype for function 'panic_smp_self_stop' [-Wmissing-prototypes]
void panic_smp_self_stop(void)
^
arch/arm64/kernel/smp.c:863:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
void panic_smp_self_stop(void)
^
static
2 warnings and 1 error generated.
--
In file included from arch/arm64/kernel/suspend.c:14:
>> arch/arm64/include/asm/mmu_context.h:226:31: error: too few arguments to function call, expected 2, have 1
check_and_switch_context(next);
~~~~~~~~~~~~~~~~~~~~~~~~ ^
arch/arm64/include/asm/mmu_context.h:177:6: note: 'check_and_switch_context' declared here
void check_and_switch_context(struct mm_struct *mm, unsigned int cpu);
^
arch/arm64/kernel/suspend.c:32:13: warning: no previous prototype for function 'cpu_suspend_set_dbg_restorer' [-Wmissing-prototypes]
void __init cpu_suspend_set_dbg_restorer(int (*hw_bp_restore)(unsigned int))
^
arch/arm64/kernel/suspend.c:32:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
void __init cpu_suspend_set_dbg_restorer(int (*hw_bp_restore)(unsigned int))
^
static
1 warning and 1 error generated.
--
In file included from arch/arm64/kernel/machine_kexec.c:21:
>> arch/arm64/include/asm/mmu_context.h:226:31: error: too few arguments to function call, expected 2, have 1
check_and_switch_context(next);
~~~~~~~~~~~~~~~~~~~~~~~~ ^
arch/arm64/include/asm/mmu_context.h:177:6: note: 'check_and_switch_context' declared here
void check_and_switch_context(struct mm_struct *mm, unsigned int cpu);
^
arch/arm64/kernel/machine_kexec.c:250:6: warning: no previous prototype for function 'machine_crash_shutdown' [-Wmissing-prototypes]
void machine_crash_shutdown(struct pt_regs *regs)
^
arch/arm64/kernel/machine_kexec.c:250:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
void machine_crash_shutdown(struct pt_regs *regs)
^
static
1 warning and 1 error generated.
--
In file included from kernel/fork.c:101:
>> arch/arm64/include/asm/mmu_context.h:226:31: error: too few arguments to function call, expected 2, have 1
check_and_switch_context(next);
~~~~~~~~~~~~~~~~~~~~~~~~ ^
arch/arm64/include/asm/mmu_context.h:177:6: note: 'check_and_switch_context' declared here
void check_and_switch_context(struct mm_struct *mm, unsigned int cpu);
^
kernel/fork.c:743:20: warning: no previous prototype for function 'arch_task_cache_init' [-Wmissing-prototypes]
void __init __weak arch_task_cache_init(void) { }
^
kernel/fork.c:743:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
void __init __weak arch_task_cache_init(void) { }
^
static
kernel/fork.c:834:12: warning: no previous prototype for function 'arch_dup_task_struct' [-Wmissing-prototypes]
int __weak arch_dup_task_struct(struct task_struct *dst,
^
kernel/fork.c:834:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
int __weak arch_dup_task_struct(struct task_struct *dst,
^
static
2 warnings and 1 error generated.
--
In file included from kernel/sched/core.c:13:
In file included from kernel/sched/sched.h:54:
In file included from include/linux/mmu_context.h:5:
>> arch/arm64/include/asm/mmu_context.h:226:31: error: too few arguments to function call, expected 2, have 1
check_and_switch_context(next);
~~~~~~~~~~~~~~~~~~~~~~~~ ^
arch/arm64/include/asm/mmu_context.h:177:6: note: 'check_and_switch_context' declared here
void check_and_switch_context(struct mm_struct *mm, unsigned int cpu);
^
kernel/sched/core.c:2380:6: warning: no previous prototype for function 'sched_set_stop_task' [-Wmissing-prototypes]
void sched_set_stop_task(int cpu, struct task_struct *stop)
^
kernel/sched/core.c:2380:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
void sched_set_stop_task(int cpu, struct task_struct *stop)
^
static
kernel/sched/core.c:4635:35: warning: no previous prototype for function 'schedule_user' [-Wmissing-prototypes]
asmlinkage __visible void __sched schedule_user(void)
^
kernel/sched/core.c:4635:22: note: declare 'static' if the function is not intended to be used outside of this translation unit
asmlinkage __visible void __sched schedule_user(void)
^
static
2 warnings and 1 error generated.
--
In file included from kernel/sched/fair.c:23:
In file included from kernel/sched/sched.h:54:
In file included from include/linux/mmu_context.h:5:
>> arch/arm64/include/asm/mmu_context.h:226:31: error: too few arguments to function call, expected 2, have 1
check_and_switch_context(next);
~~~~~~~~~~~~~~~~~~~~~~~~ ^
arch/arm64/include/asm/mmu_context.h:177:6: note: 'check_and_switch_context' declared here
void check_and_switch_context(struct mm_struct *mm, unsigned int cpu);
^
kernel/sched/fair.c:5364:6: warning: no previous prototype for function 'init_cfs_bandwidth' [-Wmissing-prototypes]
void init_cfs_bandwidth(struct cfs_bandwidth *cfs_b) {}
^
kernel/sched/fair.c:5364:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
void init_cfs_bandwidth(struct cfs_bandwidth *cfs_b) {}
^
static
kernel/sched/fair.c:11108:6: warning: no previous prototype for function 'free_fair_sched_group' [-Wmissing-prototypes]
void free_fair_sched_group(struct task_group *tg) { }
^
kernel/sched/fair.c:11108:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
void free_fair_sched_group(struct task_group *tg) { }
^
static
kernel/sched/fair.c:11110:5: warning: no previous prototype for function 'alloc_fair_sched_group' [-Wmissing-prototypes]
int alloc_fair_sched_group(struct task_group *tg, struct task_group *parent)
^
kernel/sched/fair.c:11110:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
int alloc_fair_sched_group(struct task_group *tg, struct task_group *parent)
^
static
kernel/sched/fair.c:11115:6: warning: no previous prototype for function 'online_fair_sched_group' [-Wmissing-prototypes]
void online_fair_sched_group(struct task_group *tg) { }
^
kernel/sched/fair.c:11115:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
void online_fair_sched_group(struct task_group *tg) { }
^
static
kernel/sched/fair.c:11117:6: warning: no previous prototype for function 'unregister_fair_sched_group' [-Wmissing-prototypes]
void unregister_fair_sched_group(struct task_group *tg) { }
^
kernel/sched/fair.c:11117:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
void unregister_fair_sched_group(struct task_group *tg) { }
^
static
5 warnings and 1 error generated.
--
In file included from kernel/sched/rt.c:6:
In file included from kernel/sched/sched.h:54:
In file included from include/linux/mmu_context.h:5:
>> arch/arm64/include/asm/mmu_context.h:226:31: error: too few arguments to function call, expected 2, have 1
check_and_switch_context(next);
~~~~~~~~~~~~~~~~~~~~~~~~ ^
arch/arm64/include/asm/mmu_context.h:177:6: note: 'check_and_switch_context' declared here
void check_and_switch_context(struct mm_struct *mm, unsigned int cpu);
^
kernel/sched/rt.c:253:6: warning: no previous prototype for function 'free_rt_sched_group' [-Wmissing-prototypes]
void free_rt_sched_group(struct task_group *tg) { }
^
kernel/sched/rt.c:253:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
void free_rt_sched_group(struct task_group *tg) { }
^
static
kernel/sched/rt.c:255:5: warning: no previous prototype for function 'alloc_rt_sched_group' [-Wmissing-prototypes]
int alloc_rt_sched_group(struct task_group *tg, struct task_group *parent)
^
kernel/sched/rt.c:255:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
int alloc_rt_sched_group(struct task_group *tg, struct task_group *parent)
^
static
kernel/sched/rt.c:668:6: warning: no previous prototype for function 'sched_rt_bandwidth_account' [-Wmissing-prototypes]
bool sched_rt_bandwidth_account(struct rt_rq *rt_rq)
^
kernel/sched/rt.c:668:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
bool sched_rt_bandwidth_account(struct rt_rq *rt_rq)
^
static
3 warnings and 1 error generated.
# https://github.com/0day-ci/linux/commit/b7168fc5046fd65223bdc51ef411e157939433b6
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Nicholas-Piggin/Use-asm-generic-for-mmu_context-no-op-functions/20200826-225632
git checkout b7168fc5046fd65223bdc51ef411e157939433b6
vim +226 arch/arm64/include/asm/mmu_context.h
d96cc49bff5a77 Will Deacon 2017-12-06 214
39bc88e5e38e9b Catalin Marinas 2016-09-02 215 static inline void __switch_mm(struct mm_struct *next)
39bc88e5e38e9b Catalin Marinas 2016-09-02 216 {
e53f21bce4d35a Catalin Marinas 2015-03-23 217 /*
e53f21bce4d35a Catalin Marinas 2015-03-23 218 * init_mm.pgd does not contain any user mappings and it is always
e53f21bce4d35a Catalin Marinas 2015-03-23 219 * active for kernel addresses in TTBR1. Just set the reserved TTBR0.
e53f21bce4d35a Catalin Marinas 2015-03-23 220 */
e53f21bce4d35a Catalin Marinas 2015-03-23 221 if (next == &init_mm) {
e53f21bce4d35a Catalin Marinas 2015-03-23 222 cpu_set_reserved_ttbr0();
e53f21bce4d35a Catalin Marinas 2015-03-23 223 return;
e53f21bce4d35a Catalin Marinas 2015-03-23 224 }
e53f21bce4d35a Catalin Marinas 2015-03-23 225
c4885bbb3afee8 Pingfan Liu 2020-07-10 @226 check_and_switch_context(next);
b3901d54dc4f73 Catalin Marinas 2012-03-05 227 }
b3901d54dc4f73 Catalin Marinas 2012-03-05 228
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 43232 bytes --]
[-- Attachment #3: Type: text/plain, Size: 176 bytes --]
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
prev parent reply other threads:[~2020-08-26 23:58 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20200826145249.745432-1-npiggin@gmail.com>
2020-08-26 14:52 ` [PATCH v2 04/23] arm: use asm-generic/mmu_context.h for no-op implementations Nicholas Piggin
2020-08-26 14:52 ` [PATCH v2 05/23] arm64: " Nicholas Piggin
2020-08-26 15:25 ` Catalin Marinas
2020-08-26 16:20 ` Nicholas Piggin
2020-10-27 9:59 ` Naresh Kamboju
2020-08-26 18:42 ` kernel test robot
2020-08-26 18:57 ` kernel test robot
2020-08-26 23:55 ` kernel test robot [this message]
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=202008270734.xVf7YWvy%lkp@intel.com \
--to=lkp@intel.com \
--cc=arnd@arndb.de \
--cc=catalin.marinas@arm.com \
--cc=clang-built-linux@googlegroups.com \
--cc=kbuild-all@lists.01.org \
--cc=linux-arch@vger.kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=npiggin@gmail.com \
--cc=will@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 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).