All of lore.kernel.org
 help / color / mirror / Atom feed
From: William Breathitt Gray <vilhelm.gray@gmail.com>
To: David Lechner <david@lechnology.com>
Cc: Jonathan Cameron <jic23@kernel.org>,
	kernel@pengutronix.de, linux-stm32@st-md-mailman.stormreply.com,
	a.fatoum@pengutronix.de, kamel.bouhara@bootlin.com,
	gwendal@chromium.org, alexandre.belloni@bootlin.com,
	linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org, syednwaris@gmail.com,
	patrick.havelange@essensium.com, fabrice.gasnier@st.com,
	mcoquelin.stm32@gmail.com, alexandre.torgue@st.com,
	o.rempel@pengutronix.de
Subject: Re: [PATCH v8 20/22] counter: Implement events_queue_size sysfs attribute
Date: Sat, 27 Feb 2021 09:20:48 +0900	[thread overview]
Message-ID: <YDmQYK1lWXl7H5lm@shinobu> (raw)
In-Reply-To: <37ea96a2-d4a1-7d4c-a68a-8dc82896e86c@lechnology.com>

[-- Attachment #1: Type: text/plain, Size: 4807 bytes --]

On Fri, Feb 26, 2021 at 06:14:12PM -0600, David Lechner wrote:
> On 2/25/21 6:03 PM, William Breathitt Gray wrote:
> > On Sun, Feb 21, 2021 at 03:51:40PM +0000, Jonathan Cameron wrote:
> >> On Thu, 18 Feb 2021 19:32:16 +0900
> >> William Breathitt Gray <vilhelm.gray@gmail.com> wrote:
> >>
> >>> On Sun, Feb 14, 2021 at 06:11:46PM +0000, Jonathan Cameron wrote:
> >>>> On Fri, 12 Feb 2021 21:13:44 +0900
> >>>> William Breathitt Gray <vilhelm.gray@gmail.com> wrote:
> >>>>    
> >>>>> The events_queue_size sysfs attribute provides a way for users to
> >>>>> dynamically configure the Counter events queue size for the Counter
> >>>>> character device interface. The size is in number of struct
> >>>>> counter_event data structures. The number of elements will be rounded-up
> >>>>> to a power of 2 due to a requirement of the kfifo_alloc function called
> >>>>> during reallocation of the queue.
> >>>>>
> >>>>> Cc: Oleksij Rempel <o.rempel@pengutronix.de>
> >>>>> Signed-off-by: William Breathitt Gray <vilhelm.gray@gmail.com>
> >>>>> ---
> >>>>>   Documentation/ABI/testing/sysfs-bus-counter |  8 +++++++
> >>>>>   drivers/counter/counter-chrdev.c            | 23 +++++++++++++++++++
> >>>>>   drivers/counter/counter-chrdev.h            |  2 ++
> >>>>>   drivers/counter/counter-sysfs.c             | 25 +++++++++++++++++++++
> >>>>>   4 files changed, 58 insertions(+)
> >>>>>
> >>>>> diff --git a/Documentation/ABI/testing/sysfs-bus-counter b/Documentation/ABI/testing/sysfs-bus-counter
> >>>>> index 847e96f19d19..f6cb2a8b08a7 100644
> >>>>> --- a/Documentation/ABI/testing/sysfs-bus-counter
> >>>>> +++ b/Documentation/ABI/testing/sysfs-bus-counter
> >>>>> @@ -212,6 +212,14 @@ Description:
> >>>>>   		both edges:
> >>>>>   			Any state transition.
> >>>>>   
> >>>>> +What:		/sys/bus/counter/devices/counterX/events_queue_size
> >>>>> +KernelVersion:	5.13
> >>>>> +Contact:	linux-iio@vger.kernel.org
> >>>>> +Description:
> >>>>> +		Size of the Counter events queue in number of struct
> >>>>> +		counter_event data structures. The number of elements will be
> >>>>> +		rounded-up to a power of 2.
> >>>>> +
> >>>>>   What:		/sys/bus/counter/devices/counterX/name
> >>>>>   KernelVersion:	5.2
> >>>>>   Contact:	linux-iio@vger.kernel.org
> >>>>> diff --git a/drivers/counter/counter-chrdev.c b/drivers/counter/counter-chrdev.c
> >>>>> index 16f02df7f73d..53eea894e13f 100644
> >>>>> --- a/drivers/counter/counter-chrdev.c
> >>>>> +++ b/drivers/counter/counter-chrdev.c
> >>>>> @@ -375,6 +375,29 @@ void counter_chrdev_remove(struct counter_device *const counter)
> >>>>>   	cdev_del(&counter->chrdev);
> >>>>>   }
> >>>>>   
> >>>>> +int counter_chrdev_realloc_queue(struct counter_device *const counter,
> >>>>> +				 size_t queue_size)
> >>>>> +{
> >>>>> +	int err;
> >>>>> +	DECLARE_KFIFO_PTR(events, struct counter_event);
> >>>>> +	unsigned long flags;
> >>>>> +
> >>>>> +	/* Allocate new events queue */
> >>>>> +	err = kfifo_alloc(&events, queue_size, GFP_ATOMIC);
> >>>>
> >>>> Is there any potential for losing events?
> >>>
> >>> We take the events_list_lock down below so we're safe against missing an
> >>> event, but past events currently unread in the queue will be lost.
> >>>
> >>> Shortening the size of the queue is inherently a destructive process if
> >>> we have more events in the current queue than can fit in the new queue.
> >>> Because we a liable to lose some events in such a case, I think it's
> >>> best to keep the behavior of this reallocation consistent and have it
> >>> provide a fresh empty queue every time, as opposed to sometimes dropping
> >>> events and sometimes not.
> >>>
> >>> I also suspect an actual user would be setting the size of their queue
> >>> to the required amount before they begin watching events, rather than
> >>> adjusting it sporadically during a live operation.
> >>>
> >>
> >> Absolutely agree.   As such I wonder if you are better off enforcing this
> >> behaviour?  If the cdev is open for reading, don't allow the fifo to be
> >> resized.
> >>
> >> Jonathan
> > 
> > I can't really think of a good reason not to, so let's enforce it: if
> > the cdev is open, then we'll return an EINVAL if the user attempts to
> > resize the queue.
> > 
> > What is a good way to check for this condition? Should I just call
> > kref_read() and see if it's greater than 1? For example, in
> > counter_chrdev_realloc_queue():
> > 
> > 	if (kref_read(&counter->dev.kobj.kref) > 1)
> > 		return -EINVAL;
> > 
> > William Breathitt Gray
> > 
> 
> Wouldn't EBUSY make more sense?

Yes, EBUSY would be better here because the operation isn't necessarily
invalid, just unavailable because someone else has the cdev open.

William Breathitt Gray

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

WARNING: multiple messages have this Message-ID (diff)
From: William Breathitt Gray <vilhelm.gray@gmail.com>
To: David Lechner <david@lechnology.com>
Cc: kamel.bouhara@bootlin.com, gwendal@chromium.org,
	a.fatoum@pengutronix.de, mcoquelin.stm32@gmail.com,
	linux-iio@vger.kernel.org, patrick.havelange@essensium.com,
	alexandre.belloni@bootlin.com, linux-kernel@vger.kernel.org,
	o.rempel@pengutronix.de, linux-arm-kernel@lists.infradead.org,
	kernel@pengutronix.de, fabrice.gasnier@st.com,
	syednwaris@gmail.com, linux-stm32@st-md-mailman.stormreply.com,
	Jonathan Cameron <jic23@kernel.org>,
	alexandre.torgue@st.com
Subject: Re: [PATCH v8 20/22] counter: Implement events_queue_size sysfs attribute
Date: Sat, 27 Feb 2021 09:20:48 +0900	[thread overview]
Message-ID: <YDmQYK1lWXl7H5lm@shinobu> (raw)
In-Reply-To: <37ea96a2-d4a1-7d4c-a68a-8dc82896e86c@lechnology.com>


[-- Attachment #1.1: Type: text/plain, Size: 4807 bytes --]

On Fri, Feb 26, 2021 at 06:14:12PM -0600, David Lechner wrote:
> On 2/25/21 6:03 PM, William Breathitt Gray wrote:
> > On Sun, Feb 21, 2021 at 03:51:40PM +0000, Jonathan Cameron wrote:
> >> On Thu, 18 Feb 2021 19:32:16 +0900
> >> William Breathitt Gray <vilhelm.gray@gmail.com> wrote:
> >>
> >>> On Sun, Feb 14, 2021 at 06:11:46PM +0000, Jonathan Cameron wrote:
> >>>> On Fri, 12 Feb 2021 21:13:44 +0900
> >>>> William Breathitt Gray <vilhelm.gray@gmail.com> wrote:
> >>>>    
> >>>>> The events_queue_size sysfs attribute provides a way for users to
> >>>>> dynamically configure the Counter events queue size for the Counter
> >>>>> character device interface. The size is in number of struct
> >>>>> counter_event data structures. The number of elements will be rounded-up
> >>>>> to a power of 2 due to a requirement of the kfifo_alloc function called
> >>>>> during reallocation of the queue.
> >>>>>
> >>>>> Cc: Oleksij Rempel <o.rempel@pengutronix.de>
> >>>>> Signed-off-by: William Breathitt Gray <vilhelm.gray@gmail.com>
> >>>>> ---
> >>>>>   Documentation/ABI/testing/sysfs-bus-counter |  8 +++++++
> >>>>>   drivers/counter/counter-chrdev.c            | 23 +++++++++++++++++++
> >>>>>   drivers/counter/counter-chrdev.h            |  2 ++
> >>>>>   drivers/counter/counter-sysfs.c             | 25 +++++++++++++++++++++
> >>>>>   4 files changed, 58 insertions(+)
> >>>>>
> >>>>> diff --git a/Documentation/ABI/testing/sysfs-bus-counter b/Documentation/ABI/testing/sysfs-bus-counter
> >>>>> index 847e96f19d19..f6cb2a8b08a7 100644
> >>>>> --- a/Documentation/ABI/testing/sysfs-bus-counter
> >>>>> +++ b/Documentation/ABI/testing/sysfs-bus-counter
> >>>>> @@ -212,6 +212,14 @@ Description:
> >>>>>   		both edges:
> >>>>>   			Any state transition.
> >>>>>   
> >>>>> +What:		/sys/bus/counter/devices/counterX/events_queue_size
> >>>>> +KernelVersion:	5.13
> >>>>> +Contact:	linux-iio@vger.kernel.org
> >>>>> +Description:
> >>>>> +		Size of the Counter events queue in number of struct
> >>>>> +		counter_event data structures. The number of elements will be
> >>>>> +		rounded-up to a power of 2.
> >>>>> +
> >>>>>   What:		/sys/bus/counter/devices/counterX/name
> >>>>>   KernelVersion:	5.2
> >>>>>   Contact:	linux-iio@vger.kernel.org
> >>>>> diff --git a/drivers/counter/counter-chrdev.c b/drivers/counter/counter-chrdev.c
> >>>>> index 16f02df7f73d..53eea894e13f 100644
> >>>>> --- a/drivers/counter/counter-chrdev.c
> >>>>> +++ b/drivers/counter/counter-chrdev.c
> >>>>> @@ -375,6 +375,29 @@ void counter_chrdev_remove(struct counter_device *const counter)
> >>>>>   	cdev_del(&counter->chrdev);
> >>>>>   }
> >>>>>   
> >>>>> +int counter_chrdev_realloc_queue(struct counter_device *const counter,
> >>>>> +				 size_t queue_size)
> >>>>> +{
> >>>>> +	int err;
> >>>>> +	DECLARE_KFIFO_PTR(events, struct counter_event);
> >>>>> +	unsigned long flags;
> >>>>> +
> >>>>> +	/* Allocate new events queue */
> >>>>> +	err = kfifo_alloc(&events, queue_size, GFP_ATOMIC);
> >>>>
> >>>> Is there any potential for losing events?
> >>>
> >>> We take the events_list_lock down below so we're safe against missing an
> >>> event, but past events currently unread in the queue will be lost.
> >>>
> >>> Shortening the size of the queue is inherently a destructive process if
> >>> we have more events in the current queue than can fit in the new queue.
> >>> Because we a liable to lose some events in such a case, I think it's
> >>> best to keep the behavior of this reallocation consistent and have it
> >>> provide a fresh empty queue every time, as opposed to sometimes dropping
> >>> events and sometimes not.
> >>>
> >>> I also suspect an actual user would be setting the size of their queue
> >>> to the required amount before they begin watching events, rather than
> >>> adjusting it sporadically during a live operation.
> >>>
> >>
> >> Absolutely agree.   As such I wonder if you are better off enforcing this
> >> behaviour?  If the cdev is open for reading, don't allow the fifo to be
> >> resized.
> >>
> >> Jonathan
> > 
> > I can't really think of a good reason not to, so let's enforce it: if
> > the cdev is open, then we'll return an EINVAL if the user attempts to
> > resize the queue.
> > 
> > What is a good way to check for this condition? Should I just call
> > kref_read() and see if it's greater than 1? For example, in
> > counter_chrdev_realloc_queue():
> > 
> > 	if (kref_read(&counter->dev.kobj.kref) > 1)
> > 		return -EINVAL;
> > 
> > William Breathitt Gray
> > 
> 
> Wouldn't EBUSY make more sense?

Yes, EBUSY would be better here because the operation isn't necessarily
invalid, just unavailable because someone else has the cdev open.

William Breathitt Gray

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

[-- Attachment #2: 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

  reply	other threads:[~2021-02-27  0:22 UTC|newest]

Thread overview: 139+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-02-12 12:13 [PATCH v8 00/22] Introduce the Counter character device interface William Breathitt Gray
2021-02-12 12:13 ` William Breathitt Gray
2021-02-12 12:13 ` [PATCH v8 01/22] docs: counter: Consolidate Counter sysfs attributes documentation William Breathitt Gray
2021-02-12 12:13   ` William Breathitt Gray
2021-02-14 16:57   ` Jonathan Cameron
2021-02-14 16:57     ` Jonathan Cameron
2021-02-15 11:05     ` William Breathitt Gray
2021-02-15 11:05       ` William Breathitt Gray
2021-02-20 16:25   ` David Lechner
2021-02-20 16:25     ` David Lechner
2021-02-12 12:13 ` [PATCH v8 02/22] docs: counter: Fix spelling William Breathitt Gray
2021-02-12 12:13   ` William Breathitt Gray
2021-02-20 16:26   ` David Lechner
2021-02-20 16:26     ` David Lechner
2021-02-12 12:13 ` [PATCH v8 03/22] counter: 104-quad-8: Return error when invalid mode during ceiling_write William Breathitt Gray
2021-02-12 12:13   ` William Breathitt Gray
2021-02-20 16:30   ` David Lechner
2021-02-20 16:30     ` David Lechner
2021-02-22  2:06     ` William Breathitt Gray
2021-02-22  2:06       ` William Breathitt Gray
2021-02-12 12:13 ` [PATCH v8 04/22] counter: 104-quad-8: Annotate hardware config module parameter William Breathitt Gray
2021-02-12 12:13   ` William Breathitt Gray
2021-02-12 12:13 ` [PATCH v8 05/22] counter: 104-quad-8: Add const qualifiers for quad8_preset_register_set William Breathitt Gray
2021-02-12 12:13   ` William Breathitt Gray
2021-02-12 12:13 ` [PATCH v8 06/22] counter: 104-quad-8: Add const qualifier for functions_list array William Breathitt Gray
2021-02-12 12:13   ` William Breathitt Gray
2021-02-12 12:13 ` [PATCH v8 07/22] counter: 104-quad-8: Add const qualifier for actions_list array William Breathitt Gray
2021-02-12 12:13   ` William Breathitt Gray
2021-02-12 12:13 ` [PATCH v8 08/22] counter: ftm-quaddec: " William Breathitt Gray
2021-02-12 12:13   ` William Breathitt Gray
2021-02-12 12:13 ` [PATCH v8 09/22] counter: Return error code on invalid modes William Breathitt Gray
2021-02-12 12:13   ` William Breathitt Gray
2021-02-14 17:07   ` Jonathan Cameron
2021-02-14 17:07     ` Jonathan Cameron
2021-02-20 16:43   ` David Lechner
2021-02-20 16:43     ` David Lechner
2021-02-22  4:42     ` William Breathitt Gray
2021-02-22  4:42       ` William Breathitt Gray
2021-02-12 12:13 ` [PATCH v8 10/22] counter: Standardize to ERANGE for limit exceeded errors William Breathitt Gray
2021-02-12 12:13   ` William Breathitt Gray
2021-02-14 17:10   ` Jonathan Cameron
2021-02-14 17:10     ` Jonathan Cameron
2021-02-16  1:26     ` William Breathitt Gray
2021-02-16  1:26       ` William Breathitt Gray
2021-02-21 14:03       ` Jonathan Cameron
2021-02-21 14:03         ` Jonathan Cameron
2021-02-20 16:48   ` David Lechner
2021-02-20 16:48     ` David Lechner
2021-02-12 12:13 ` [PATCH v8 11/22] counter: Rename counter_signal_value to counter_signal_level William Breathitt Gray
2021-02-12 12:13   ` William Breathitt Gray
2021-02-20 16:52   ` David Lechner
2021-02-20 16:52     ` David Lechner
2021-02-12 12:13 ` [PATCH v8 12/22] counter: Rename counter_count_function to counter_function William Breathitt Gray
2021-02-12 12:13   ` William Breathitt Gray
2021-02-14 17:13   ` Jonathan Cameron
2021-02-14 17:13     ` Jonathan Cameron
2021-02-20 16:56     ` David Lechner
2021-02-20 16:56       ` David Lechner
2021-02-23  5:14       ` William Breathitt Gray
2021-02-23  5:14         ` William Breathitt Gray
2021-02-12 12:13 ` [PATCH v8 13/22] counter: Internalize sysfs interface code William Breathitt Gray
2021-02-14 17:32   ` Jonathan Cameron
2021-02-14 17:32     ` Jonathan Cameron
2021-02-20 17:50   ` David Lechner
2021-02-20 17:50     ` David Lechner
2021-02-12 12:13 ` [PATCH v8 14/22] counter: Update counter.h comments to reflect sysfs internalization William Breathitt Gray
2021-02-12 12:13   ` William Breathitt Gray
2021-02-12 12:13 ` [PATCH v8 15/22] docs: counter: Update " William Breathitt Gray
2021-02-12 12:13   ` William Breathitt Gray
2021-02-12 12:13 ` [PATCH v8 16/22] counter: Move counter enums to uapi header William Breathitt Gray
2021-02-12 12:13   ` William Breathitt Gray
2021-02-20 23:55   ` David Lechner
2021-02-20 23:55     ` David Lechner
2021-02-12 12:13 ` [PATCH v8 17/22] counter: Add character device interface William Breathitt Gray
2021-02-12 12:13   ` William Breathitt Gray
2021-02-14 18:06   ` Jonathan Cameron
2021-02-14 18:06     ` Jonathan Cameron
2021-02-24  5:34     ` William Breathitt Gray
2021-02-24  5:34       ` William Breathitt Gray
2021-02-15  9:24   ` Oleksij Rempel
2021-02-15  9:24     ` Oleksij Rempel
2021-02-16  1:53     ` William Breathitt Gray
2021-02-16  1:53       ` William Breathitt Gray
2021-02-12 12:13 ` [PATCH v8 18/22] docs: counter: Document " William Breathitt Gray
2021-02-12 12:13   ` William Breathitt Gray
2021-02-14 17:48   ` Jonathan Cameron
2021-02-14 17:48     ` Jonathan Cameron
2021-02-22 10:11     ` Pavel Machek
2021-02-22 10:11       ` Pavel Machek
2021-02-26  0:27       ` William Breathitt Gray
2021-02-26  0:27         ` William Breathitt Gray
2021-02-26  0:22     ` William Breathitt Gray
2021-02-26  0:22       ` William Breathitt Gray
2021-02-12 12:13 ` [PATCH v8 19/22] counter: Implement extension*_name sysfs attributes William Breathitt Gray
2021-02-12 12:13   ` William Breathitt Gray
2021-02-14 18:09   ` Jonathan Cameron
2021-02-14 18:09     ` Jonathan Cameron
2021-02-19  8:51     ` William Breathitt Gray
2021-02-19  8:51       ` William Breathitt Gray
2021-02-21 14:05       ` Jonathan Cameron
2021-02-21 14:05         ` Jonathan Cameron
2021-02-25 23:32         ` William Breathitt Gray
2021-02-25 23:32           ` William Breathitt Gray
2021-02-27 15:14           ` Jonathan Cameron
2021-02-27 15:14             ` Jonathan Cameron
2021-02-12 12:13 ` [PATCH v8 20/22] counter: Implement events_queue_size sysfs attribute William Breathitt Gray
2021-02-12 12:13   ` William Breathitt Gray
2021-02-14 18:11   ` Jonathan Cameron
2021-02-14 18:11     ` Jonathan Cameron
2021-02-18 10:32     ` William Breathitt Gray
2021-02-18 10:32       ` William Breathitt Gray
2021-02-21 15:51       ` Jonathan Cameron
2021-02-21 15:51         ` Jonathan Cameron
2021-02-26  0:03         ` William Breathitt Gray
2021-02-26  0:03           ` William Breathitt Gray
2021-02-27  0:14           ` David Lechner
2021-02-27  0:14             ` David Lechner
2021-02-27  0:20             ` William Breathitt Gray [this message]
2021-02-27  0:20               ` William Breathitt Gray
2021-02-27 15:18           ` Jonathan Cameron
2021-02-27 15:18             ` Jonathan Cameron
2021-02-28  2:46             ` William Breathitt Gray
2021-02-28  2:46               ` William Breathitt Gray
2021-02-12 12:13 ` [PATCH v8 21/22] counter: 104-quad-8: Replace mutex with spinlock William Breathitt Gray
2021-02-12 12:13   ` William Breathitt Gray
2021-02-14 18:19   ` Jonathan Cameron
2021-02-14 18:19     ` Jonathan Cameron
2021-02-16  2:16     ` William Breathitt Gray
2021-02-16  2:16       ` William Breathitt Gray
2021-02-16 19:27       ` Jonathan Cameron
2021-02-16 19:27         ` Jonathan Cameron
2021-02-18 10:16         ` William Breathitt Gray
2021-02-18 10:16           ` William Breathitt Gray
2021-02-12 12:13 ` [PATCH v8 22/22] counter: 104-quad-8: Add IRQ support for the ACCES 104-QUAD-8 William Breathitt Gray
2021-02-12 12:13   ` William Breathitt Gray
2021-02-14 18:24   ` Jonathan Cameron
2021-02-14 18:24     ` Jonathan Cameron
2021-02-19  9:21     ` William Breathitt Gray
2021-02-19  9:21       ` William Breathitt Gray

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=YDmQYK1lWXl7H5lm@shinobu \
    --to=vilhelm.gray@gmail.com \
    --cc=a.fatoum@pengutronix.de \
    --cc=alexandre.belloni@bootlin.com \
    --cc=alexandre.torgue@st.com \
    --cc=david@lechnology.com \
    --cc=fabrice.gasnier@st.com \
    --cc=gwendal@chromium.org \
    --cc=jic23@kernel.org \
    --cc=kamel.bouhara@bootlin.com \
    --cc=kernel@pengutronix.de \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-iio@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-stm32@st-md-mailman.stormreply.com \
    --cc=mcoquelin.stm32@gmail.com \
    --cc=o.rempel@pengutronix.de \
    --cc=patrick.havelange@essensium.com \
    --cc=syednwaris@gmail.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: 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.