From: Peter Zijlstra <peterz@infradead.org>
To: Mark Rutland <mark.rutland@arm.com>
Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net>,
"Rafael J. Wysocki" <rafael@kernel.org>,
Boris Brezillon <boris.brezillon@free-electrons.com>,
Thomas Gleixner <tglx@linutronix.de>,
Jason Cooper <jason@lakedaemon.net>,
Len Brown <len.brown@intel.com>, Pavel Machek <pavel@ucw.cz>,
"linux-pm@vger.kernel.org" <linux-pm@vger.kernel.org>,
Wim Van Sebroeck <wim@iguana.be>,
"linux-watchdog@vger.kernel.org" <linux-watchdog@vger.kernel.org>,
Alessandro Zummo <a.zummo@towertech.it>,
"rtc-linux@googlegroups.com" <rtc-linux@googlegroups.com>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Jiri Slaby <jslaby@suse.cz>,
"linux-serial@vger.kernel.org" <linux-serial@vger.kernel.org>,
Mike Turquette <mturquette@linaro.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
Nicolas Ferre <nicolas.ferre@atmel.com>,
Jean-Christophe Plagniol-Villard <plagnioj@jcrosoft.com>,
Alexan
Subject: Re: [PATCH v2 5/6] watchdog: at91sam9: request the irq with IRQF_NO_SUSPEND
Date: Sat, 7 Mar 2015 10:12:04 +0100 [thread overview]
Message-ID: <20150307091204.GM23367@worktop.ger.corp.intel.com> (raw)
In-Reply-To: <20150306110618.GC8700@leverpostej>
On Fri, Mar 06, 2015 at 11:06:18AM +0000, Mark Rutland wrote:
> [...]
>
> > > The request_irq path never results in a call to chip->irq_set_wake(),
> > > even with the IRQF_NO_SUSPEND flag. So requesting an irq with
> > > IRQF_NO_SUSPEND does not guarantee wakeup; it only guarantees that the
> > > CPU can take the interrupt _around_ the suspended state, not necessarily
> > > while _in_ the suspended state.
> >
> > Right. "Suspended state" meaning full suspend here I suppose?
>
> Yes; any state deeper than suspend-to-idle.
I don't think we should want to make such distinction; we should treat
all suspend states the same.
Drivers should not want to rely on the fact that one state
(suspend-to-idle) might maybe deal with interrupts while other states do
not.
> > > We seem to be conflating some related properties:
> > >
> > > [a] The IRQ will be left unmasked.
> > > [b] The IRQ will be handled immediately when taken.
> > > [c] The IRQ will wake the system from suspend.
> > >
> > > Requesting an IRQ with IRQF_NO_SUSPEND guarantees [a,b], but does not
> > > guarantee [c].
> >
> > That's correct. IRQF_NO_SUSPEND does not guarantee that interrupts from
> > that IRQ will have any effect after arch_suspend_disable_irqs() in
> > suspend_enter().
>
> [...]
>
> > > It sounds like for this kind of watchdog device we want [a,b,c], even if
> > > the IRQ is not shared with an IRQF_NO_SUSPEND user.
> >
> > We can't guarantee that, though. arch_suspend_disable_irqs() disables
> > interrupts on the last working CPU and it won't get any. It may be
> > brought out of a low-power state by a pending interrupt, but it won't act
> > upon that interrupt immediately anyway, only after the arch_suspend_enable_irqs()
> > in suspend_enter().
>
> Ok, so [b] needs the caveat that it's only handled "immediately" outside
> of the arch_suspend_disable_irqs() ... arch_suspend_enable_irqs()
> section.
>
> > But then it might as well be deferred until after
> > resume_device_irqs().
>
> That was my original line of thinking, in which case the watchdog driver
> should use IRQF_COND_SUSPEND rather than IRQF_NO_SUSPEND, with
> enable_irq_wake() if we care about the watchdog during suspend. I'm
> happy with this.
Note that COND_SUSPEND must have SHARED set.
> Considering that the use-case of a watchdog is to alert us to something
> going hideously wrong in the kernel, we want to handle the IRQ after
> executing the smallest amount of kernel code possible. For that, they
> need to have their handlers to be called "immediately" outside of the
> arch_suspend_disable_irqs() ... arch_suspend_enable_irqs() window, and
> need to be enabled during suspend to attempt to catch bad wakeup device
> configuration.
>
> I think it's possible (assuming the caveats on [b] above) to provide
> [a,b,c] for this case.
While I appreciate the use-case; we should be careful not to make of
mess of things either.
WARNING: multiple messages have this Message-ID (diff)
From: Peter Zijlstra <peterz@infradead.org>
To: Mark Rutland <mark.rutland@arm.com>
Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net>,
"Rafael J. Wysocki" <rafael@kernel.org>,
Boris Brezillon <boris.brezillon@free-electrons.com>,
Thomas Gleixner <tglx@linutronix.de>,
Jason Cooper <jason@lakedaemon.net>,
Len Brown <len.brown@intel.com>, Pavel Machek <pavel@ucw.cz>,
"linux-pm@vger.kernel.org" <linux-pm@vger.kernel.org>,
Wim Van Sebroeck <wim@iguana.be>,
"linux-watchdog@vger.kernel.org" <linux-watchdog@vger.kernel.org>,
Alessandro Zummo <a.zummo@towertech.it>,
"rtc-linux@googlegroups.com" <rtc-linux@googlegroups.com>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Jiri Slaby <jslaby@suse.cz>,
"linux-serial@vger.kernel.org" <linux-serial@vger.kernel.org>,
Mike Turquette <mturquette@linaro.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
Nicolas Ferre <nicolas.ferre@atmel.com>,
Jean-Christophe Plagniol-Villard <plagnioj@jcrosoft.com>,
Alexandre Belloni <alexandre.belloni@free-electrons.com>,
"linux-arm-kernel@lists.infradead.org"
<linux-arm-kernel@lists.infradead.org>
Subject: Re: [PATCH v2 5/6] watchdog: at91sam9: request the irq with IRQF_NO_SUSPEND
Date: Sat, 7 Mar 2015 10:12:04 +0100 [thread overview]
Message-ID: <20150307091204.GM23367@worktop.ger.corp.intel.com> (raw)
In-Reply-To: <20150306110618.GC8700@leverpostej>
On Fri, Mar 06, 2015 at 11:06:18AM +0000, Mark Rutland wrote:
> [...]
>
> > > The request_irq path never results in a call to chip->irq_set_wake(),
> > > even with the IRQF_NO_SUSPEND flag. So requesting an irq with
> > > IRQF_NO_SUSPEND does not guarantee wakeup; it only guarantees that the
> > > CPU can take the interrupt _around_ the suspended state, not necessarily
> > > while _in_ the suspended state.
> >
> > Right. "Suspended state" meaning full suspend here I suppose?
>
> Yes; any state deeper than suspend-to-idle.
I don't think we should want to make such distinction; we should treat
all suspend states the same.
Drivers should not want to rely on the fact that one state
(suspend-to-idle) might maybe deal with interrupts while other states do
not.
> > > We seem to be conflating some related properties:
> > >
> > > [a] The IRQ will be left unmasked.
> > > [b] The IRQ will be handled immediately when taken.
> > > [c] The IRQ will wake the system from suspend.
> > >
> > > Requesting an IRQ with IRQF_NO_SUSPEND guarantees [a,b], but does not
> > > guarantee [c].
> >
> > That's correct. IRQF_NO_SUSPEND does not guarantee that interrupts from
> > that IRQ will have any effect after arch_suspend_disable_irqs() in
> > suspend_enter().
>
> [...]
>
> > > It sounds like for this kind of watchdog device we want [a,b,c], even if
> > > the IRQ is not shared with an IRQF_NO_SUSPEND user.
> >
> > We can't guarantee that, though. arch_suspend_disable_irqs() disables
> > interrupts on the last working CPU and it won't get any. It may be
> > brought out of a low-power state by a pending interrupt, but it won't act
> > upon that interrupt immediately anyway, only after the arch_suspend_enable_irqs()
> > in suspend_enter().
>
> Ok, so [b] needs the caveat that it's only handled "immediately" outside
> of the arch_suspend_disable_irqs() ... arch_suspend_enable_irqs()
> section.
>
> > But then it might as well be deferred until after
> > resume_device_irqs().
>
> That was my original line of thinking, in which case the watchdog driver
> should use IRQF_COND_SUSPEND rather than IRQF_NO_SUSPEND, with
> enable_irq_wake() if we care about the watchdog during suspend. I'm
> happy with this.
Note that COND_SUSPEND must have SHARED set.
> Considering that the use-case of a watchdog is to alert us to something
> going hideously wrong in the kernel, we want to handle the IRQ after
> executing the smallest amount of kernel code possible. For that, they
> need to have their handlers to be called "immediately" outside of the
> arch_suspend_disable_irqs() ... arch_suspend_enable_irqs() window, and
> need to be enabled during suspend to attempt to catch bad wakeup device
> configuration.
>
> I think it's possible (assuming the caveats on [b] above) to provide
> [a,b,c] for this case.
While I appreciate the use-case; we should be careful not to make of
mess of things either.
WARNING: multiple messages have this Message-ID (diff)
From: peterz@infradead.org (Peter Zijlstra)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v2 5/6] watchdog: at91sam9: request the irq with IRQF_NO_SUSPEND
Date: Sat, 7 Mar 2015 10:12:04 +0100 [thread overview]
Message-ID: <20150307091204.GM23367@worktop.ger.corp.intel.com> (raw)
In-Reply-To: <20150306110618.GC8700@leverpostej>
On Fri, Mar 06, 2015 at 11:06:18AM +0000, Mark Rutland wrote:
> [...]
>
> > > The request_irq path never results in a call to chip->irq_set_wake(),
> > > even with the IRQF_NO_SUSPEND flag. So requesting an irq with
> > > IRQF_NO_SUSPEND does not guarantee wakeup; it only guarantees that the
> > > CPU can take the interrupt _around_ the suspended state, not necessarily
> > > while _in_ the suspended state.
> >
> > Right. "Suspended state" meaning full suspend here I suppose?
>
> Yes; any state deeper than suspend-to-idle.
I don't think we should want to make such distinction; we should treat
all suspend states the same.
Drivers should not want to rely on the fact that one state
(suspend-to-idle) might maybe deal with interrupts while other states do
not.
> > > We seem to be conflating some related properties:
> > >
> > > [a] The IRQ will be left unmasked.
> > > [b] The IRQ will be handled immediately when taken.
> > > [c] The IRQ will wake the system from suspend.
> > >
> > > Requesting an IRQ with IRQF_NO_SUSPEND guarantees [a,b], but does not
> > > guarantee [c].
> >
> > That's correct. IRQF_NO_SUSPEND does not guarantee that interrupts from
> > that IRQ will have any effect after arch_suspend_disable_irqs() in
> > suspend_enter().
>
> [...]
>
> > > It sounds like for this kind of watchdog device we want [a,b,c], even if
> > > the IRQ is not shared with an IRQF_NO_SUSPEND user.
> >
> > We can't guarantee that, though. arch_suspend_disable_irqs() disables
> > interrupts on the last working CPU and it won't get any. It may be
> > brought out of a low-power state by a pending interrupt, but it won't act
> > upon that interrupt immediately anyway, only after the arch_suspend_enable_irqs()
> > in suspend_enter().
>
> Ok, so [b] needs the caveat that it's only handled "immediately" outside
> of the arch_suspend_disable_irqs() ... arch_suspend_enable_irqs()
> section.
>
> > But then it might as well be deferred until after
> > resume_device_irqs().
>
> That was my original line of thinking, in which case the watchdog driver
> should use IRQF_COND_SUSPEND rather than IRQF_NO_SUSPEND, with
> enable_irq_wake() if we care about the watchdog during suspend. I'm
> happy with this.
Note that COND_SUSPEND must have SHARED set.
> Considering that the use-case of a watchdog is to alert us to something
> going hideously wrong in the kernel, we want to handle the IRQ after
> executing the smallest amount of kernel code possible. For that, they
> need to have their handlers to be called "immediately" outside of the
> arch_suspend_disable_irqs() ... arch_suspend_enable_irqs() window, and
> need to be enabled during suspend to attempt to catch bad wakeup device
> configuration.
>
> I think it's possible (assuming the caveats on [b] above) to provide
> [a,b,c] for this case.
While I appreciate the use-case; we should be careful not to make of
mess of things either.
next prev parent reply other threads:[~2015-03-07 9:12 UTC|newest]
Thread overview: 144+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-03-02 9:18 [PATCH v2 0/6] ARM: at91: fix irq_pm_install_action WARNING Boris Brezillon
2015-03-02 9:18 ` Boris Brezillon
2015-03-02 9:18 ` Boris Brezillon
2015-03-02 9:18 ` [PATCH v2 1/6] PM / wakeup: export pm_system_wakeup symbol Boris Brezillon
2015-03-02 9:18 ` Boris Brezillon
2015-03-02 9:18 ` [PATCH v2 3/6] rtc: at91rm9200: rework wakeup and interrupt handling Boris Brezillon
2015-03-02 9:18 ` Boris Brezillon
2015-03-02 9:18 ` [PATCH v2 4/6] clk: at91: implement suspend/resume for the PMC irqchip Boris Brezillon
2015-03-02 9:18 ` Boris Brezillon
2015-03-02 9:18 ` Boris Brezillon
[not found] ` <1425287898-15093-5-git-send-email-boris.brezillon-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
2015-03-09 22:34 ` Mike Turquette
2015-03-09 22:34 ` Mike Turquette
2015-03-09 22:34 ` Mike Turquette
2015-03-09 22:34 ` Mike Turquette
2015-03-02 9:18 ` [PATCH v2 6/6] tty: serial: atmel: rework interrupt and wakeup handling Boris Brezillon
2015-03-02 9:18 ` Boris Brezillon
[not found] ` <1425287898-15093-1-git-send-email-boris.brezillon-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
2015-03-02 9:18 ` [PATCH v2 2/6] rtc: at91sam9: rework wakeup and interrupt handling Boris Brezillon
2015-03-02 9:18 ` Boris Brezillon
2015-03-02 9:18 ` Boris Brezillon
[not found] ` <1425287898-15093-3-git-send-email-boris.brezillon-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
2015-03-04 18:23 ` Mark Rutland
2015-03-04 18:23 ` Mark Rutland
2015-03-04 18:23 ` Mark Rutland
2015-03-02 9:18 ` [PATCH v2 5/6] watchdog: at91sam9: request the irq with IRQF_NO_SUSPEND Boris Brezillon
2015-03-02 9:18 ` Boris Brezillon
2015-03-02 9:18 ` Boris Brezillon
2015-03-02 14:10 ` Guenter Roeck
2015-03-02 14:10 ` Guenter Roeck
[not found] ` <1425287898-15093-6-git-send-email-boris.brezillon-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
2015-03-04 18:38 ` Mark Rutland
2015-03-04 18:38 ` Mark Rutland
2015-03-04 18:38 ` Mark Rutland
2015-03-04 21:41 ` Rafael J. Wysocki
2015-03-04 21:41 ` Rafael J. Wysocki
2015-03-04 21:41 ` Rafael J. Wysocki
[not found] ` <14143668.0aRkeVrc3Q-sKB8Sp2ER+y1GS7QM15AGw@public.gmane.org>
2015-03-05 10:57 ` Mark Rutland
2015-03-05 10:57 ` Mark Rutland
2015-03-05 10:57 ` Mark Rutland
2015-03-05 15:10 ` Rafael J. Wysocki
2015-03-05 15:10 ` Rafael J. Wysocki
2015-03-05 15:10 ` Rafael J. Wysocki
[not found] ` <CAJZ5v0h8vn26BeWPVhC4e_KNhBu15-mshnbq0K=OQ1M36vPQEQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2015-03-05 16:32 ` Mark Rutland
2015-03-05 16:32 ` Mark Rutland
2015-03-05 16:32 ` Mark Rutland
2015-03-06 0:29 ` Rafael J. Wysocki
2015-03-06 0:29 ` Rafael J. Wysocki
2015-03-06 0:29 ` Rafael J. Wysocki
2015-03-06 11:06 ` Mark Rutland
2015-03-06 11:06 ` Mark Rutland
2015-03-06 11:06 ` Mark Rutland
2015-03-06 12:39 ` Rafael J. Wysocki
2015-03-06 12:39 ` Rafael J. Wysocki
2015-03-06 12:39 ` Rafael J. Wysocki
[not found] ` <CAJZ5v0jA-hRUnP_+mOdFw7vN7CGZ4o0FjUVu81rq7foi92f63g-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2015-03-06 13:10 ` Mark Rutland
2015-03-06 13:10 ` Mark Rutland
2015-03-06 13:10 ` Mark Rutland
2015-03-07 9:12 ` Peter Zijlstra [this message]
2015-03-07 9:12 ` Peter Zijlstra
2015-03-07 9:12 ` Peter Zijlstra
2015-03-07 9:06 ` Peter Zijlstra
2015-03-07 9:06 ` Peter Zijlstra
2015-03-07 9:06 ` Peter Zijlstra
2015-03-05 8:53 ` Boris Brezillon
2015-03-05 8:53 ` Boris Brezillon
2015-03-05 8:53 ` Boris Brezillon
2015-03-05 10:53 ` Mark Rutland
2015-03-05 10:53 ` Mark Rutland
2015-03-05 10:53 ` Mark Rutland
2015-03-05 11:17 ` Boris Brezillon
2015-03-05 11:17 ` Boris Brezillon
2015-03-05 11:17 ` Boris Brezillon
2015-03-05 11:31 ` Boris Brezillon
2015-03-05 11:31 ` Boris Brezillon
2015-03-05 11:31 ` Boris Brezillon
2015-03-05 11:53 ` Mark Rutland
2015-03-05 11:53 ` Mark Rutland
2015-03-05 11:53 ` Mark Rutland
2015-03-07 9:18 ` Peter Zijlstra
2015-03-07 9:18 ` Peter Zijlstra
2015-03-07 9:18 ` Peter Zijlstra
2015-03-07 10:20 ` Sylvain Rochet
2015-03-07 10:20 ` Sylvain Rochet
2015-03-07 10:20 ` Sylvain Rochet
2015-03-07 10:39 ` Pavel Machek
2015-03-07 10:39 ` Pavel Machek
2015-03-07 10:39 ` Pavel Machek
2015-03-07 10:59 ` Sylvain Rochet
2015-03-07 10:59 ` Sylvain Rochet
2015-03-07 10:59 ` Sylvain Rochet
2015-03-07 11:06 ` Alexandre Belloni
2015-03-07 11:06 ` Alexandre Belloni
2015-03-07 11:06 ` Alexandre Belloni
[not found] ` <20150307110645.GW3989-m++hUPXGwpdeoWH0uzbU5w@public.gmane.org>
2015-03-07 11:29 ` Pavel Machek
2015-03-07 11:29 ` Pavel Machek
2015-03-07 11:29 ` Pavel Machek
2015-03-07 11:46 ` Sylvain Rochet
2015-03-07 11:46 ` Sylvain Rochet
2015-03-07 11:46 ` Sylvain Rochet
2015-03-08 1:12 ` Rafael J. Wysocki
2015-03-08 1:12 ` Rafael J. Wysocki
2015-03-08 1:12 ` Rafael J. Wysocki
2015-03-09 7:55 ` Alexandre Belloni
2015-03-09 7:55 ` Alexandre Belloni
2015-03-09 7:55 ` Alexandre Belloni
2015-03-09 14:30 ` Rafael J. Wysocki
2015-03-09 14:30 ` Rafael J. Wysocki
2015-03-09 14:30 ` Rafael J. Wysocki
[not found] ` <1592385.fqRVVyPSPE-sKB8Sp2ER+y1GS7QM15AGw@public.gmane.org>
2015-03-10 21:33 ` Alexandre Belloni
2015-03-10 21:33 ` Alexandre Belloni
2015-03-10 21:33 ` Alexandre Belloni
2015-03-10 22:31 ` Rafael J. Wysocki
2015-03-10 22:31 ` Rafael J. Wysocki
2015-03-10 22:31 ` Rafael J. Wysocki
[not found] ` <1901056.Mqyykpv3e9-sKB8Sp2ER+y1GS7QM15AGw@public.gmane.org>
2015-03-10 22:33 ` Alexandre Belloni
2015-03-10 22:33 ` Alexandre Belloni
2015-03-10 22:33 ` Alexandre Belloni
[not found] ` <20150310223305.GN9188-m++hUPXGwpdeoWH0uzbU5w@public.gmane.org>
2015-03-11 1:03 ` Rafael J. Wysocki
2015-03-11 1:03 ` Rafael J. Wysocki
2015-03-11 1:03 ` Rafael J. Wysocki
2015-03-11 7:33 ` Boris Brezillon
2015-03-11 7:33 ` Boris Brezillon
2015-03-11 7:33 ` Boris Brezillon
2015-03-08 1:11 ` Rafael J. Wysocki
2015-03-08 1:11 ` Rafael J. Wysocki
2015-03-08 1:11 ` Rafael J. Wysocki
2015-03-11 8:38 ` Boris Brezillon
2015-03-11 8:38 ` Boris Brezillon
2015-03-11 8:38 ` Boris Brezillon
2015-03-11 11:17 ` Nicolas Ferre
2015-03-11 11:17 ` Nicolas Ferre
2015-03-11 11:17 ` Nicolas Ferre
2015-03-11 11:17 ` Nicolas Ferre
2015-03-03 8:56 ` [PATCH v2 0/6] ARM: at91: fix irq_pm_install_action WARNING Alexandre Belloni
2015-03-03 8:56 ` Alexandre Belloni
2015-03-03 8:56 ` Alexandre Belloni
2015-03-03 15:35 ` Nicolas Ferre
2015-03-03 15:35 ` Nicolas Ferre
2015-03-03 15:35 ` Nicolas Ferre
2015-03-03 15:35 ` Nicolas Ferre
2015-03-04 1:43 ` Rafael J. Wysocki
2015-03-04 1:43 ` Rafael J. Wysocki
2015-03-04 1:43 ` Rafael J. Wysocki
2015-03-04 1:43 ` Rafael J. Wysocki
2015-03-04 18:43 ` Mark Rutland
2015-03-04 18:43 ` Mark Rutland
2015-03-04 18:43 ` Mark Rutland
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=20150307091204.GM23367@worktop.ger.corp.intel.com \
--to=peterz@infradead.org \
--cc=a.zummo@towertech.it \
--cc=boris.brezillon@free-electrons.com \
--cc=gregkh@linuxfoundation.org \
--cc=jason@lakedaemon.net \
--cc=jslaby@suse.cz \
--cc=len.brown@intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=linux-serial@vger.kernel.org \
--cc=linux-watchdog@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=mturquette@linaro.org \
--cc=nicolas.ferre@atmel.com \
--cc=pavel@ucw.cz \
--cc=plagnioj@jcrosoft.com \
--cc=rafael@kernel.org \
--cc=rjw@rjwysocki.net \
--cc=rtc-linux@googlegroups.com \
--cc=tglx@linutronix.de \
--cc=wim@iguana.be \
/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.