From: "Guilherme G. Piccoli" <gpiccoli@igalia.com> To: akpm@linux-foundation.org, bhe@redhat.com, pmladek@suse.com, kexec@lists.infradead.org Cc: linux-kernel@vger.kernel.org, linux-hyperv@vger.kernel.org, netdev@vger.kernel.org, x86@kernel.org, kernel-dev@igalia.com, kernel@gpiccoli.net, halves@canonical.com, fabiomirmar@gmail.com, alejandro.j.jimenez@oracle.com, andriy.shevchenko@linux.intel.com, arnd@arndb.de, bp@alien8.de, corbet@lwn.net, d.hatayama@jp.fujitsu.com, dave.hansen@linux.intel.com, dyoung@redhat.com, feng.tang@intel.com, gregkh@linuxfoundation.org, mikelley@microsoft.com, hidehiro.kawai.ez@hitachi.com, jgross@suse.com, john.ogness@linutronix.de, keescook@chromium.org, luto@kernel.org, mhiramat@kernel.org, mingo@redhat.com, paulmck@kernel.org, peterz@infradead.org, rostedt@goodmis.org, senozhatsky@chromium.org, stern@rowland.harvard.edu, tglx@linutronix.de, vgoyal@redhat.com, vkuznets@redhat.com, will@kernel.org, xuqiang36@huawei.com, "Guilherme G. Piccoli" <gpiccoli@igalia.com>, Andrea Parri <parri.andrea@gmail.com>, Dexuan Cui <decui@microsoft.com>, Haiyang Zhang <haiyangz@microsoft.com>, "K. Y. Srinivasan" <kys@microsoft.com>, Stephen Hemminger <sthemmin@microsoft.com>, Tianyu Lan <Tianyu.Lan@microsoft.com>, Wei Liu <wei.liu@kernel.org> Subject: [PATCH V3 09/11] video/hyperv_fb: Avoid taking busy spinlock on panic path Date: Fri, 19 Aug 2022 19:17:29 -0300 [thread overview] Message-ID: <20220819221731.480795-10-gpiccoli@igalia.com> (raw) In-Reply-To: <20220819221731.480795-1-gpiccoli@igalia.com> The Hyper-V framebuffer code registers a panic notifier in order to try updating its fbdev if the kernel crashed. The notifier callback is straightforward, but it calls the vmbus_sendpacket() routine eventually, and such function takes a spinlock for the ring buffer operations. Panic path runs in atomic context, with local interrupts and preemption disabled, and all secondary CPUs shutdown. That said, taking a spinlock might cause a lockup if a secondary CPU was disabled with such lock taken. Fix it here by checking if the ring buffer spinlock is busy on Hyper-V framebuffer panic notifier; if so, bail-out avoiding the potential lockup scenario. Cc: Andrea Parri (Microsoft) <parri.andrea@gmail.com> Cc: Dexuan Cui <decui@microsoft.com> Cc: Haiyang Zhang <haiyangz@microsoft.com> Cc: "K. Y. Srinivasan" <kys@microsoft.com> Cc: Michael Kelley <mikelley@microsoft.com> Cc: Stephen Hemminger <sthemmin@microsoft.com> Cc: Tianyu Lan <Tianyu.Lan@microsoft.com> Cc: Wei Liu <wei.liu@kernel.org> Tested-by: Fabio A M Martins <fabiomirmar@gmail.com> Signed-off-by: Guilherme G. Piccoli <gpiccoli@igalia.com> --- V3: - simplified the code based on Michael's suggestion - thanks! V2: - new patch, based on the discussion in [0]. [0] https://lore.kernel.org/lkml/2787b476-6366-1c83-db80-0393da417497@igalia.com/ drivers/hv/ring_buffer.c | 13 +++++++++++++ drivers/video/fbdev/hyperv_fb.c | 8 +++++++- include/linux/hyperv.h | 2 ++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/drivers/hv/ring_buffer.c b/drivers/hv/ring_buffer.c index 59a4aa86d1f3..c6692fd5ab15 100644 --- a/drivers/hv/ring_buffer.c +++ b/drivers/hv/ring_buffer.c @@ -280,6 +280,19 @@ void hv_ringbuffer_cleanup(struct hv_ring_buffer_info *ring_info) ring_info->pkt_buffer_size = 0; } +/* + * Check if the ring buffer spinlock is available to take or not; used on + * atomic contexts, like panic path (see the Hyper-V framebuffer driver). + */ + +bool hv_ringbuffer_spinlock_busy(struct vmbus_channel *channel) +{ + struct hv_ring_buffer_info *rinfo = &channel->outbound; + + return spin_is_locked(&rinfo->ring_lock); +} +EXPORT_SYMBOL_GPL(hv_ringbuffer_spinlock_busy); + /* Write to the ring buffer. */ int hv_ringbuffer_write(struct vmbus_channel *channel, const struct kvec *kv_list, u32 kv_count, diff --git a/drivers/video/fbdev/hyperv_fb.c b/drivers/video/fbdev/hyperv_fb.c index 886c564787f1..e1b65a01fb96 100644 --- a/drivers/video/fbdev/hyperv_fb.c +++ b/drivers/video/fbdev/hyperv_fb.c @@ -783,12 +783,18 @@ static void hvfb_ondemand_refresh_throttle(struct hvfb_par *par, static int hvfb_on_panic(struct notifier_block *nb, unsigned long e, void *p) { + struct hv_device *hdev; struct hvfb_par *par; struct fb_info *info; par = container_of(nb, struct hvfb_par, hvfb_panic_nb); - par->synchronous_fb = true; info = par->info; + hdev = device_to_hv_device(info->device); + + if (hv_ringbuffer_spinlock_busy(hdev->channel)) + return NOTIFY_DONE; + + par->synchronous_fb = true; if (par->need_docopy) hvfb_docopy(par, 0, dio_fb_size); synthvid_update(info, 0, 0, INT_MAX, INT_MAX); diff --git a/include/linux/hyperv.h b/include/linux/hyperv.h index 3b42264333ef..646f1da9f27e 100644 --- a/include/linux/hyperv.h +++ b/include/linux/hyperv.h @@ -1341,6 +1341,8 @@ struct hv_ring_buffer_debug_info { int hv_ringbuffer_get_debuginfo(struct hv_ring_buffer_info *ring_info, struct hv_ring_buffer_debug_info *debug_info); +bool hv_ringbuffer_spinlock_busy(struct vmbus_channel *channel); + /* Vmbus interface */ #define vmbus_driver_register(driver) \ __vmbus_driver_register(driver, THIS_MODULE, KBUILD_MODNAME) -- 2.37.2
WARNING: multiple messages have this Message-ID (diff)
From: "Guilherme G. Piccoli" <gpiccoli@igalia.com> To: akpm@linux-foundation.org, bhe@redhat.com, pmladek@suse.com, kexec@lists.infradead.org Cc: linux-hyperv@vger.kernel.org, halves@canonical.com, peterz@infradead.org, dave.hansen@linux.intel.com, feng.tang@intel.com, mikelley@microsoft.com, "K. Y. Srinivasan" <kys@microsoft.com>, will@kernel.org, Wei Liu <wei.liu@kernel.org>, Stephen Hemminger <sthemmin@microsoft.com>, arnd@arndb.de, corbet@lwn.net, paulmck@kernel.org, fabiomirmar@gmail.com, x86@kernel.org, Dexuan Cui <decui@microsoft.com>, mingo@redhat.com, stern@rowland.harvard.edu, dyoung@redhat.com, vgoyal@redhat.com, Andrea Parri <parri.andrea@gmail.com>, alejandro.j.jimenez@oracle.com, Tianyu Lan <Tianyu.Lan@microsoft.com>, keescook@chromium.org, john.ogness@linutronix.de, Haiyang Zhang <haiyangz@microsoft.com>, rostedt@goodmis.org, bp@alien8.de, luto@kernel.org, hidehiro.kawai.ez@hitachi.com, tglx@linutronix.de, andriy.shevchenko@linux.intel.com, jgross@suse.com, gregkh@linuxfoundation.org, kernel@gpiccoli.net, linux-kernel@vger.kernel.org, xuqiang36@huawei.com, senozhatsky@chromium.org, d.hatayama@jp.fujitsu.com, mhiramat@kernel.org, kernel-dev@igalia.com, netdev@vger.kernel.org, vkuznets@redhat.com Subject: [PATCH V3 09/11] video/hyperv_fb: Avoid taking busy spinlock on panic path Date: Fri, 19 Aug 2022 19:17:29 -0300 [thread overview] Message-ID: <20220819221731.480795-10-gpiccoli@igalia.com> (raw) In-Reply-To: <20220819221731.480795-1-gpiccoli@igalia.com> The Hyper-V framebuffer code registers a panic notifier in order to try updating its fbdev if the kernel crashed. The notifier callback is straightforward, but it calls the vmbus_sendpacket() routine eventually, and such function takes a spinlock for the ring buffer operations. Panic path runs in atomic context, with local interrupts and preemption disabled, and all secondary CPUs shutdown. That said, taking a spinlock might cause a lockup if a secondary CPU was disabled with such lock taken. Fix it here by checking if the ring buffer spinlock is busy on Hyper-V framebuffer panic notifier; if so, bail-out avoiding the potential lockup scenario. Cc: Andrea Parri (Microsoft) <parri.andrea@gmail.com> Cc: Dexuan Cui <decui@microsoft.com> Cc: Haiyang Zhang <haiyangz@microsoft.com> Cc: "K. Y. Srinivasan" <kys@microsoft.com> Cc: Michael Kelley <mikelley@microsoft.com> Cc: Stephen Hemminger <sthemmin@microsoft.com> Cc: Tianyu Lan <Tianyu.Lan@microsoft.com> Cc: Wei Liu <wei.liu@kernel.org> Tested-by: Fabio A M Martins <fabiomirmar@gmail.com> Signed-off-by: Guilherme G. Piccoli <gpiccoli@igalia.com> --- V3: - simplified the code based on Michael's suggestion - thanks! V2: - new patch, based on the discussion in [0]. [0] https://lore.kernel.org/lkml/2787b476-6366-1c83-db80-0393da417497@igalia.com/ drivers/hv/ring_buffer.c | 13 +++++++++++++ drivers/video/fbdev/hyperv_fb.c | 8 +++++++- include/linux/hyperv.h | 2 ++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/drivers/hv/ring_buffer.c b/drivers/hv/ring_buffer.c index 59a4aa86d1f3..c6692fd5ab15 100644 --- a/drivers/hv/ring_buffer.c +++ b/drivers/hv/ring_buffer.c @@ -280,6 +280,19 @@ void hv_ringbuffer_cleanup(struct hv_ring_buffer_info *ring_info) ring_info->pkt_buffer_size = 0; } +/* + * Check if the ring buffer spinlock is available to take or not; used on + * atomic contexts, like panic path (see the Hyper-V framebuffer driver). + */ + +bool hv_ringbuffer_spinlock_busy(struct vmbus_channel *channel) +{ + struct hv_ring_buffer_info *rinfo = &channel->outbound; + + return spin_is_locked(&rinfo->ring_lock); +} +EXPORT_SYMBOL_GPL(hv_ringbuffer_spinlock_busy); + /* Write to the ring buffer. */ int hv_ringbuffer_write(struct vmbus_channel *channel, const struct kvec *kv_list, u32 kv_count, diff --git a/drivers/video/fbdev/hyperv_fb.c b/drivers/video/fbdev/hyperv_fb.c index 886c564787f1..e1b65a01fb96 100644 --- a/drivers/video/fbdev/hyperv_fb.c +++ b/drivers/video/fbdev/hyperv_fb.c @@ -783,12 +783,18 @@ static void hvfb_ondemand_refresh_throttle(struct hvfb_par *par, static int hvfb_on_panic(struct notifier_block *nb, unsigned long e, void *p) { + struct hv_device *hdev; struct hvfb_par *par; struct fb_info *info; par = container_of(nb, struct hvfb_par, hvfb_panic_nb); - par->synchronous_fb = true; info = par->info; + hdev = device_to_hv_device(info->device); + + if (hv_ringbuffer_spinlock_busy(hdev->channel)) + return NOTIFY_DONE; + + par->synchronous_fb = true; if (par->need_docopy) hvfb_docopy(par, 0, dio_fb_size); synthvid_update(info, 0, 0, INT_MAX, INT_MAX); diff --git a/include/linux/hyperv.h b/include/linux/hyperv.h index 3b42264333ef..646f1da9f27e 100644 --- a/include/linux/hyperv.h +++ b/include/linux/hyperv.h @@ -1341,6 +1341,8 @@ struct hv_ring_buffer_debug_info { int hv_ringbuffer_get_debuginfo(struct hv_ring_buffer_info *ring_info, struct hv_ring_buffer_debug_info *debug_info); +bool hv_ringbuffer_spinlock_busy(struct vmbus_channel *channel); + /* Vmbus interface */ #define vmbus_driver_register(driver) \ __vmbus_driver_register(driver, THIS_MODULE, KBUILD_MODNAME) -- 2.37.2 _______________________________________________ kexec mailing list kexec@lists.infradead.org http://lists.infradead.org/mailman/listinfo/kexec
next prev parent reply other threads:[~2022-08-19 22:24 UTC|newest] Thread overview: 128+ messages / expand[flat|nested] mbox.gz Atom feed top 2022-08-19 22:17 [PATCH V3 00/11] The panic notifiers refactor - fixes/clean-ups (V3) Guilherme G. Piccoli 2022-08-19 22:17 ` Guilherme G. Piccoli 2022-08-19 22:17 ` Guilherme G. Piccoli 2022-08-19 22:17 ` Guilherme G. Piccoli 2022-08-19 22:17 ` Guilherme G. Piccoli 2022-08-19 22:17 ` [PATCH V3 01/11] ARM: Disable FIQs (but not IRQs) on CPUs shutdown paths Guilherme G. Piccoli 2022-08-19 22:17 ` Guilherme G. Piccoli 2022-08-19 22:17 ` Guilherme G. Piccoli 2022-09-18 13:58 ` Guilherme G. Piccoli 2022-09-18 13:58 ` Guilherme G. Piccoli 2022-09-18 13:58 ` Guilherme G. Piccoli 2022-10-17 14:00 ` Guilherme G. Piccoli 2022-10-17 14:00 ` Guilherme G. Piccoli 2022-10-17 14:00 ` Guilherme G. Piccoli 2022-10-17 14:17 ` Russell King (Oracle) 2022-10-17 14:17 ` Russell King (Oracle) 2022-10-17 14:17 ` Russell King (Oracle) 2022-10-17 14:50 ` Guilherme G. Piccoli 2022-10-17 14:50 ` Guilherme G. Piccoli 2022-10-17 14:50 ` Guilherme G. Piccoli 2022-10-17 17:47 ` Russell King (Oracle) 2022-10-17 17:47 ` Russell King (Oracle) 2022-10-17 17:47 ` Russell King (Oracle) 2022-10-17 19:43 ` Guilherme G. Piccoli 2022-10-17 19:43 ` Guilherme G. Piccoli 2022-10-17 19:43 ` Guilherme G. Piccoli 2022-08-19 22:17 ` [PATCH V3 02/11] notifier: Add panic notifiers info and purge trailing whitespaces Guilherme G. Piccoli 2022-08-19 22:17 ` Guilherme G. Piccoli 2022-11-22 13:19 ` Guilherme G. Piccoli 2022-11-22 13:19 ` Guilherme G. Piccoli 2022-08-19 22:17 ` [PATCH V3 03/11] alpha: Clean-up the panic notifier code Guilherme G. Piccoli 2022-08-19 22:17 ` Guilherme G. Piccoli 2022-08-19 22:17 ` Guilherme G. Piccoli 2022-11-22 13:22 ` Guilherme G. Piccoli 2022-11-22 13:22 ` Guilherme G. Piccoli 2022-11-22 13:22 ` Guilherme G. Piccoli 2022-08-19 22:17 ` [PATCH V3 04/11] um: Improve panic notifiers consistency and ordering Guilherme G. Piccoli 2022-08-19 22:17 ` Guilherme G. Piccoli 2022-08-19 22:17 ` Guilherme G. Piccoli 2022-09-18 14:00 ` Guilherme G. Piccoli 2022-09-18 14:00 ` Guilherme G. Piccoli 2022-09-18 14:00 ` Guilherme G. Piccoli 2022-09-18 21:19 ` Richard Weinberger 2022-09-18 21:19 ` Richard Weinberger 2022-09-18 21:19 ` Richard Weinberger 2022-09-19 11:44 ` Guilherme G. Piccoli 2022-09-19 11:44 ` Guilherme G. Piccoli 2022-09-19 11:44 ` Guilherme G. Piccoli 2022-10-17 14:01 ` Guilherme G. Piccoli 2022-10-17 14:01 ` Guilherme G. Piccoli 2022-10-17 14:10 ` Richard Weinberger 2022-10-17 14:10 ` Richard Weinberger 2022-10-17 14:22 ` Guilherme G. Piccoli 2022-10-17 14:22 ` Guilherme G. Piccoli 2022-08-19 22:17 ` [PATCH V3 05/11] parisc: Replace regular spinlock with spin_trylock on panic path Guilherme G. Piccoli 2022-08-19 22:17 ` Guilherme G. Piccoli 2022-08-19 22:17 ` [PATCH V3 06/11] tracing: Improve panic/die notifiers Guilherme G. Piccoli 2022-08-19 22:17 ` Guilherme G. Piccoli 2022-09-18 14:04 ` Guilherme G. Piccoli 2022-09-18 14:04 ` Guilherme G. Piccoli 2022-10-17 14:02 ` Guilherme G. Piccoli 2022-10-17 14:02 ` Guilherme G. Piccoli 2022-10-20 21:29 ` Steven Rostedt 2022-10-20 21:29 ` Steven Rostedt 2022-10-20 21:53 ` Guilherme G. Piccoli 2022-10-20 21:53 ` Guilherme G. Piccoli 2022-10-20 22:22 ` Steven Rostedt 2022-10-20 22:22 ` Steven Rostedt 2022-10-20 22:37 ` Guilherme G. Piccoli 2022-10-20 22:37 ` Guilherme G. Piccoli 2022-11-22 13:27 ` Guilherme G. Piccoli 2022-11-22 13:27 ` Guilherme G. Piccoli 2022-12-13 23:51 ` Guilherme G. Piccoli 2022-12-13 23:51 ` Guilherme G. Piccoli 2022-12-14 0:06 ` Steven Rostedt 2022-12-14 0:06 ` Steven Rostedt 2022-12-14 0:52 ` Guilherme G. Piccoli 2022-12-14 0:52 ` Guilherme G. Piccoli 2022-08-19 22:17 ` [PATCH V3 07/11] notifiers: Add tracepoints to the notifiers infrastructure Guilherme G. Piccoli 2022-08-19 22:17 ` Guilherme G. Piccoli 2022-09-18 14:07 ` Guilherme G. Piccoli 2022-09-18 14:07 ` Guilherme G. Piccoli 2022-10-17 14:04 ` Guilherme G. Piccoli 2022-10-17 14:04 ` Guilherme G. Piccoli 2022-11-22 13:30 ` Guilherme G. Piccoli 2022-11-22 13:30 ` Guilherme G. Piccoli 2022-08-19 22:17 ` [PATCH V3 08/11] EDAC/altera: Skip the panic notifier if kdump is loaded Guilherme G. Piccoli 2022-08-19 22:17 ` Guilherme G. Piccoli 2022-09-18 14:10 ` Guilherme G. Piccoli 2022-09-18 14:10 ` Guilherme G. Piccoli 2022-10-17 14:05 ` Guilherme G. Piccoli 2022-10-17 14:05 ` Guilherme G. Piccoli 2022-11-22 13:33 ` Guilherme G. Piccoli 2022-11-22 13:33 ` Guilherme G. Piccoli 2022-11-22 15:06 ` Borislav Petkov 2022-11-22 15:06 ` Borislav Petkov 2023-02-10 16:01 ` Guilherme G. Piccoli 2023-02-10 16:01 ` Guilherme G. Piccoli 2022-12-09 16:03 ` Petr Mladek 2022-12-09 16:03 ` Petr Mladek 2022-08-19 22:17 ` Guilherme G. Piccoli [this message] 2022-08-19 22:17 ` [PATCH V3 09/11] video/hyperv_fb: Avoid taking busy spinlock on panic path Guilherme G. Piccoli 2022-09-18 14:12 ` Guilherme G. Piccoli 2022-09-18 14:12 ` Guilherme G. Piccoli 2022-10-04 16:17 ` Michael Kelley (LINUX) 2022-10-04 16:17 ` Michael Kelley (LINUX) 2022-08-19 22:17 ` [PATCH V3 10/11] drivers/hv/vmbus, video/hyperv_fb: Untangle and refactor Hyper-V panic notifiers Guilherme G. Piccoli 2022-08-19 22:17 ` Guilherme G. Piccoli 2022-10-04 16:24 ` Michael Kelley (LINUX) 2022-10-04 16:24 ` Michael Kelley (LINUX) 2022-10-04 17:20 ` Guilherme G. Piccoli 2022-10-04 17:20 ` Guilherme G. Piccoli 2022-10-17 15:26 ` Michael Kelley (LINUX) 2022-10-17 15:26 ` Michael Kelley (LINUX) 2022-11-10 21:32 ` Guilherme G. Piccoli 2022-11-10 21:32 ` Guilherme G. Piccoli 2022-11-11 22:47 ` Wei Liu 2022-11-11 22:47 ` Wei Liu 2022-11-11 23:16 ` Wei Liu 2022-11-11 23:16 ` Wei Liu 2022-11-12 21:53 ` Guilherme G. Piccoli 2022-11-12 21:53 ` Guilherme G. Piccoli 2022-08-19 22:17 ` [PATCH V3 11/11] panic: Fixes the panic_print NMI backtrace setting Guilherme G. Piccoli 2022-08-19 22:17 ` Guilherme G. Piccoli 2022-09-18 14:13 ` Guilherme G. Piccoli 2022-09-18 14:13 ` Guilherme G. Piccoli 2022-11-22 13:35 ` Guilherme G. Piccoli 2022-11-22 13:35 ` Guilherme G. Piccoli
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=20220819221731.480795-10-gpiccoli@igalia.com \ --to=gpiccoli@igalia.com \ --cc=Tianyu.Lan@microsoft.com \ --cc=akpm@linux-foundation.org \ --cc=alejandro.j.jimenez@oracle.com \ --cc=andriy.shevchenko@linux.intel.com \ --cc=arnd@arndb.de \ --cc=bhe@redhat.com \ --cc=bp@alien8.de \ --cc=corbet@lwn.net \ --cc=d.hatayama@jp.fujitsu.com \ --cc=dave.hansen@linux.intel.com \ --cc=decui@microsoft.com \ --cc=dyoung@redhat.com \ --cc=fabiomirmar@gmail.com \ --cc=feng.tang@intel.com \ --cc=gregkh@linuxfoundation.org \ --cc=haiyangz@microsoft.com \ --cc=halves@canonical.com \ --cc=hidehiro.kawai.ez@hitachi.com \ --cc=jgross@suse.com \ --cc=john.ogness@linutronix.de \ --cc=keescook@chromium.org \ --cc=kernel-dev@igalia.com \ --cc=kernel@gpiccoli.net \ --cc=kexec@lists.infradead.org \ --cc=kys@microsoft.com \ --cc=linux-hyperv@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=luto@kernel.org \ --cc=mhiramat@kernel.org \ --cc=mikelley@microsoft.com \ --cc=mingo@redhat.com \ --cc=netdev@vger.kernel.org \ --cc=parri.andrea@gmail.com \ --cc=paulmck@kernel.org \ --cc=peterz@infradead.org \ --cc=pmladek@suse.com \ --cc=rostedt@goodmis.org \ --cc=senozhatsky@chromium.org \ --cc=stern@rowland.harvard.edu \ --cc=sthemmin@microsoft.com \ --cc=tglx@linutronix.de \ --cc=vgoyal@redhat.com \ --cc=vkuznets@redhat.com \ --cc=wei.liu@kernel.org \ --cc=will@kernel.org \ --cc=x86@kernel.org \ --cc=xuqiang36@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: linkBe 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.