From: Jason Wang <jasowang@redhat.com>
To: Wu Zongyong <wuzongyong@linux.alibaba.com>
Cc: wei.yang1@linux.alibaba.com, mst <mst@redhat.com>,
linux-kernel <linux-kernel@vger.kernel.org>,
virtualization <virtualization@lists.linux-foundation.org>
Subject: Re: [PATCH v6 8/8] eni_vdpa: add vDPA driver for Alibaba ENI
Date: Mon, 25 Oct 2021 12:40:41 +0800 [thread overview]
Message-ID: <51e9be5b-4bb2-b82b-a152-ffc37803410c@redhat.com> (raw)
In-Reply-To: <20211025032146.GC3684@L-PF27918B-1352.localdomain>
在 2021/10/25 上午11:21, Wu Zongyong 写道:
> On Mon, Oct 25, 2021 at 10:27:31AM +0800, Jason Wang wrote:
>> On Fri, Oct 22, 2021 at 10:44 AM Wu Zongyong
>> <wuzongyong@linux.alibaba.com> wrote:
>>> This patch adds a new vDPA driver for Alibaba ENI(Elastic Network
>>> Interface) which is build upon virtio 0.9.5 specification.
>>> And this driver doesn't support to run on BE host.
>>>
>>> Signed-off-by: Wu Zongyong <wuzongyong@linux.alibaba.com>
>>> ---
>>> drivers/vdpa/Kconfig | 8 +
>>> drivers/vdpa/Makefile | 1 +
>>> drivers/vdpa/alibaba/Makefile | 3 +
>>> drivers/vdpa/alibaba/eni_vdpa.c | 553 ++++++++++++++++++++++++++++++++
>>> 4 files changed, 565 insertions(+)
>>> create mode 100644 drivers/vdpa/alibaba/Makefile
>>> create mode 100644 drivers/vdpa/alibaba/eni_vdpa.c
>>>
>>> diff --git a/drivers/vdpa/Kconfig b/drivers/vdpa/Kconfig
>>> index 3d91982d8371..c0232a2148a7 100644
>>> --- a/drivers/vdpa/Kconfig
>>> +++ b/drivers/vdpa/Kconfig
>>> @@ -78,4 +78,12 @@ config VP_VDPA
>>> help
>>> This kernel module bridges virtio PCI device to vDPA bus.
>>>
>>> +config ALIBABA_ENI_VDPA
>>> + tristate "vDPA driver for Alibaba ENI"
>>> + select VIRTIO_PCI_LEGACY_LIB
>>> + depends on PCI_MSI && !CPU_BIG_ENDIAN
>>> + help
>>> + VDPA driver for Alibaba ENI(Elastic Network Interface) which is build upon
>>> + virtio 0.9.5 specification.
>>> +
>>> endif # VDPA
>>> diff --git a/drivers/vdpa/Makefile b/drivers/vdpa/Makefile
>>> index f02ebed33f19..15665563a7f4 100644
>>> --- a/drivers/vdpa/Makefile
>>> +++ b/drivers/vdpa/Makefile
>>> @@ -5,3 +5,4 @@ obj-$(CONFIG_VDPA_USER) += vdpa_user/
>>> obj-$(CONFIG_IFCVF) += ifcvf/
>>> obj-$(CONFIG_MLX5_VDPA) += mlx5/
>>> obj-$(CONFIG_VP_VDPA) += virtio_pci/
>>> +obj-$(CONFIG_ALIBABA_ENI_VDPA) += alibaba/
>>> diff --git a/drivers/vdpa/alibaba/Makefile b/drivers/vdpa/alibaba/Makefile
>>> new file mode 100644
>>> index 000000000000..ef4aae69f87a
>>> --- /dev/null
>>> +++ b/drivers/vdpa/alibaba/Makefile
>>> @@ -0,0 +1,3 @@
>>> +# SPDX-License-Identifier: GPL-2.0
>>> +obj-$(CONFIG_ALIBABA_ENI_VDPA) += eni_vdpa.o
>>> +
>>> diff --git a/drivers/vdpa/alibaba/eni_vdpa.c b/drivers/vdpa/alibaba/eni_vdpa.c
>>> new file mode 100644
>>> index 000000000000..6a09f157d810
>>> --- /dev/null
>>> +++ b/drivers/vdpa/alibaba/eni_vdpa.c
>>> @@ -0,0 +1,553 @@
>>> +// SPDX-License-Identifier: GPL-2.0-only
>>> +/*
>>> + * vDPA bridge driver for Alibaba ENI(Elastic Network Interface)
>>> + *
>>> + * Copyright (c) 2021, Alibaba Inc. All rights reserved.
>>> + * Author: Wu Zongyong <wuzongyong@linux.alibaba.com>
>>> + *
>>> + */
>>> +
>>> +#include "linux/bits.h"
>>> +#include <linux/interrupt.h>
>>> +#include <linux/module.h>
>>> +#include <linux/pci.h>
>>> +#include <linux/vdpa.h>
>>> +#include <linux/virtio.h>
>>> +#include <linux/virtio_config.h>
>>> +#include <linux/virtio_ring.h>
>>> +#include <linux/virtio_pci.h>
>>> +#include <linux/virtio_pci_legacy.h>
>>> +#include <uapi/linux/virtio_net.h>
>>> +
>>> +#define ENI_MSIX_NAME_SIZE 256
>>> +
>>> +#define ENI_ERR(pdev, fmt, ...) \
>>> + dev_err(&pdev->dev, "%s"fmt, "eni_vdpa: ", ##__VA_ARGS__)
>>> +#define ENI_DBG(pdev, fmt, ...) \
>>> + dev_dbg(&pdev->dev, "%s"fmt, "eni_vdpa: ", ##__VA_ARGS__)
>>> +#define ENI_INFO(pdev, fmt, ...) \
>>> + dev_info(&pdev->dev, "%s"fmt, "eni_vdpa: ", ##__VA_ARGS__)
>>> +
>>> +struct eni_vring {
>>> + void __iomem *notify;
>>> + char msix_name[ENI_MSIX_NAME_SIZE];
>>> + struct vdpa_callback cb;
>>> + int irq;
>>> +};
>>> +
>>> +struct eni_vdpa {
>>> + struct vdpa_device vdpa;
>>> + struct virtio_pci_legacy_device ldev;
>>> + struct eni_vring *vring;
>>> + struct vdpa_callback config_cb;
>>> + char msix_name[ENI_MSIX_NAME_SIZE];
>>> + int config_irq;
>>> + int queues;
>>> + int vectors;
>>> +};
>>> +
>>> +static struct eni_vdpa *vdpa_to_eni(struct vdpa_device *vdpa)
>>> +{
>>> + return container_of(vdpa, struct eni_vdpa, vdpa);
>>> +}
>>> +
>>> +static struct virtio_pci_legacy_device *vdpa_to_ldev(struct vdpa_device *vdpa)
>>> +{
>>> + struct eni_vdpa *eni_vdpa = vdpa_to_eni(vdpa);
>>> +
>>> + return &eni_vdpa->ldev;
>>> +}
>>> +
>>> +static u64 eni_vdpa_get_features(struct vdpa_device *vdpa)
>>> +{
>>> + struct virtio_pci_legacy_device *ldev = vdpa_to_ldev(vdpa);
>>> + u64 features = vp_legacy_get_features(ldev);
>>> +
>>> + features |= BIT_ULL(VIRTIO_F_ACCESS_PLATFORM);
>>> + features |= BIT_ULL(VIRTIO_F_ORDER_PLATFORM);
>>> +
>>> + return features;
>>> +}
>>> +
>>> +static int eni_vdpa_set_features(struct vdpa_device *vdpa, u64 features)
>>> +{
>>> + struct virtio_pci_legacy_device *ldev = vdpa_to_ldev(vdpa);
>>> +
>>> + if (!(features & BIT_ULL(VIRTIO_NET_F_MRG_RXBUF)) && features) {
>>> + ENI_ERR(ldev->pci_dev,
>>> + "VIRTIO_NET_F_MRG_RXBUF is not negotiated\n");
>>> + return -EINVAL;
>>> + }
>>> +
>>> + vp_legacy_set_features(ldev, (u32)features);
>>> +
>>> + return 0;
>>> +}
>>> +
>> So my comments have not been addressed since v4. Please address or
>> answer the questions before posting a new version.
>>
>> Thanks
> Sorry, I forgot to reply the comments on this patch.
>
>
>>> +static u64 eni_vdpa_get_features(struct vdpa_device *vdpa)
>>> +{
>>> + struct virtio_pci_legacy_device *ldev = vdpa_to_ldev(vdpa);
>>> + u64 features = vp_legacy_get_features(ldev);
>>> +
>>> + features |= BIT_ULL(VIRTIO_F_ACCESS_PLATFORM);
>>> + features |= BIT_ULL(VIRTIO_F_ORDER_PLATFORM);
>> VERSION_1 is also needed?
>>
> No, queue align of legacy devices should be 4096,
Let's use VIRTIO_PCI_VRING_ALIGN instead of PAGE_SIZE in get_vq_align
then since PAGE_SIZE is not necessarily 4096.
> but queue align of
> devices with VERSION_1 are SMP_CACHE_BYTES which may not equals to
> 4096.
> If we set the VERSION_1, ENI will not work due to the queue align.
Interesting, so I think it can only be used with legacy virtio drivers
in the guest.
One major drawbacks is that guest can only see 32 feature bits which
means we can't advertise VIRTIO_F_ACCESS_PLATFORM and
VIRTIO_F_ORDER_PLATFORM to guest:
/* virtio config->get_features() implementation */
static u64 vp_get_features(struct virtio_device *vdev)
{
struct virtio_pci_device *vp_dev = to_vp_device(vdev);
/* When someone needs more than 32 feature bits, we'll need to
* steal a bit to indicate that the rest are somewhere else. */
return ioread32(vp_dev->ioaddr + VIRTIO_PCI_HOST_FEATURES);
}
For VIRTIO_F_ACCESS_PLATFORM, it should be fine. But how about
VIRTIO_F_ORDER_PLATFORM?
>
>>> +
>>> + return features;
>>> +}
>>> +
>>> +static int eni_vdpa_set_features(struct vdpa_device *vdpa, u64 features)
>>> +{
>>> + struct virtio_pci_legacy_device *ldev = vdpa_to_ldev(vdpa);
>>> +
>>> + if (!(features & BIT_ULL(VIRTIO_NET_F_MRG_RXBUF)) && features) {
>>> + ENI_ERR(ldev->pci_dev,
>>> + "VIRTIO_NET_F_MRG_RXBUF is not negotiated\n");
>>> + return -EINVAL;
>> Do we need to make sure FEATURE_OK is not set in this case or the ENI can do
>> this for us?
> Why we need to check this? I don't get what you worried about.
I thought the plan is to advertise the VERSION_1, so failing when
without mrg_rxbuf is a must. But looks like I was wrong, and there's no
need to mandate mrg_rxbuf in future versions.
Thanks
>
>> Other looks good.
>>
>> Thanks
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
next prev parent reply other threads:[~2021-10-25 4:41 UTC|newest]
Thread overview: 70+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <cover.1631101392.git.wuzongyong@linux.alibaba.com>
[not found] ` <88701e88ab061f5d1b94bd046afcb9d3588414c3.1631101392.git.wuzongyong@linux.alibaba.com>
2021-09-09 2:53 ` [PATCH 3/6] vp_vdpa: add vq irq offloading support Jason Wang
[not found] ` <ebd83066e3897aae63e4b02f8729a73dd09931c6.1631101392.git.wuzongyong@linux.alibaba.com>
2021-09-09 2:55 ` [PATCH 5/6] vdpa: add get_vq_num_unchangeable callback in vdpa_config_ops Jason Wang
2021-09-09 9:18 ` Michael S. Tsirkin
2021-09-09 9:32 ` Jason Wang
[not found] ` <20210909080157.GA17383@L-PF27918B-1352.localdomain>
2021-09-09 9:28 ` Jason Wang
[not found] ` <20210909095726.GA17469@L-PF27918B-1352.localdomain>
2021-09-10 1:45 ` Jason Wang
[not found] ` <20210910073231.GA17715@L-PF27918B-1352.localdomain>
[not found] ` <CACLfguWeXwWJ9yd18vHbYicOk5=eMZJ0X=m86EKjmgHu35NdVA@mail.gmail.com>
[not found] ` <20210910092013.GA17783@L-PF27918B-1352.localdomain>
[not found] ` <CACLfguXFDra77Nqiv+ArUEOzTf9rzi0gLK4_r0ofCfJHSO056Q@mail.gmail.com>
2021-09-13 1:43 ` Jason Wang
[not found] ` <20210913025920.GB17820@L-PF27918B-1352.localdomain>
2021-09-13 3:13 ` Jason Wang
2021-09-09 3:05 ` [PATCH 0/6] vDPA driver for legacy virtio-pci device Jason Wang
2021-09-09 3:20 ` Jason Wang
2021-09-09 9:21 ` Michael S. Tsirkin
2021-09-09 9:31 ` Jason Wang
[not found] ` <20210909081211.GB17383@L-PF27918B-1352.localdomain>
2021-09-09 9:29 ` Jason Wang
[not found] ` <20210909125338.GA17535@L-PF27918B-1352.localdomain>
2021-09-10 1:44 ` Jason Wang
[not found] ` <8b084e5beb1111ad98bb64177ebd0e9845c178fa.1631101392.git.wuzongyong@linux.alibaba.com>
2021-09-09 13:57 ` [PATCH 6/6] vp_vdpa: introduce legacy virtio pci driver Michael S. Tsirkin
[not found] ` <20210910022818.GB17535@L-PF27918B-1352.localdomain>
2021-09-10 9:57 ` Michael S. Tsirkin
2021-10-22 9:37 ` Michael S. Tsirkin
[not found] ` <cover.1631621507.git.wuzongyong@linux.alibaba.com>
[not found] ` <834528d24c839080215b2e077f100e9ed5073edc.1631621507.git.wuzongyong@linux.alibaba.com>
2021-09-14 12:58 ` [PATCH v2 4/5] vdpa: add new vdpa attribute VDPA_ATTR_DEV_F_VERSION_1 Michael S. Tsirkin
2021-09-15 3:18 ` Jason Wang
2021-09-15 7:38 ` Michael S. Tsirkin
2021-09-15 8:06 ` Jason Wang
2021-09-15 11:08 ` Michael S. Tsirkin
2021-09-16 1:05 ` Jason Wang
[not found] ` <20210917023451.GA19669@L-PF27918B-1352.localdomain>
2021-09-17 7:51 ` Jason Wang
[not found] ` <20210915121234.GA19232@L-PF27918B-1352.localdomain>
2021-09-16 1:11 ` Jason Wang
[not found] ` <20210915032453.GA18793@L-PF27918B-1352.localdomain>
2021-09-15 7:30 ` Michael S. Tsirkin
2021-09-15 8:05 ` Jason Wang
2021-09-15 11:10 ` Michael S. Tsirkin
[not found] ` <ab98427764198053b4277a127eaea3f32cd40ed5.1631621507.git.wuzongyong@linux.alibaba.com>
2021-09-14 22:35 ` [PATCH v2 5/5] eni_vdpa: add vDPA driver for Alibaba ENI Randy Dunlap
2021-09-15 3:14 ` Jason Wang
2021-09-15 13:36 ` kernel test robot
[not found] ` <f833e77685cd1dfadc5c3b6688d29a0d1383dbb9.1631621507.git.wuzongyong@linux.alibaba.com>
2021-09-14 22:37 ` [PATCH v2 1/5] virtio-pci: introduce legacy device module Randy Dunlap
[not found] ` <42c5a09aacae346449bcc7b7b54d63f9d265e622.1631621507.git.wuzongyong@linux.alibaba.com>
2021-09-15 3:15 ` [PATCH v2 2/5] vdpa: fix typo Jason Wang
[not found] ` <11a491e2200e17319989ff9043b8d58867610197.1631621507.git.wuzongyong@linux.alibaba.com>
2021-09-15 3:16 ` [PATCH v2 3/5] vp_vdpa: add vq irq offloading support Jason Wang
[not found] ` <20210915033102.GB18793@L-PF27918B-1352.localdomain>
2021-09-15 4:13 ` Jason Wang
[not found] ` <cover.1632313398.git.wuzongyong@linux.alibaba.com>
[not found] ` <296014fa3b765f2088a3183bf04e09863651a584.1632313398.git.wuzongyong@linux.alibaba.com>
2021-09-26 2:24 ` [PATCH v3 7/7] eni_vdpa: add vDPA driver for Alibaba ENI Jason Wang
[not found] ` <20210926032434.GA32570@L-PF27918B-1352.localdomain>
2021-09-26 4:18 ` Jason Wang
2021-09-27 10:36 ` Michael S. Tsirkin
2021-09-28 2:17 ` Jason Wang
2021-09-26 2:26 ` Jason Wang
[not found] ` <20210926032701.GA32606@L-PF27918B-1352.localdomain>
2021-09-26 4:19 ` Jason Wang
2021-09-29 12:54 ` kernel test robot
[not found] ` <cover.1632882380.git.wuzongyong@linux.alibaba.com>
[not found] ` <a068c730a0707d35afbbf72a5e0eb29f427f6045.1632882380.git.wuzongyong@linux.alibaba.com>
2021-10-11 3:00 ` [PATCH v4 1/7] virtio-pci: introduce legacy device module Jason Wang
2021-10-11 3:02 ` Jason Wang
[not found] ` <49dc74038cdfaa7af7dab1565ba5da5d6cc4ec7d.1632882380.git.wuzongyong@linux.alibaba.com>
2021-10-11 3:03 ` [PATCH v4 2/7] vdpa: fix typo Jason Wang
[not found] ` <451ce3c272ebd5d532db1ed19c2ab53c4609f7ad.1632882380.git.wuzongyong@linux.alibaba.com>
2021-10-11 3:04 ` [PATCH v4 4/7] vdpa: add new callback get_vq_num_min in vdpa_config_ops Jason Wang
[not found] ` <e971b011b9224a4da4fcab6e904fcee0b7393ac6.1632882380.git.wuzongyong@linux.alibaba.com>
2021-10-11 3:06 ` [PATCH v4 5/7] virtio_vdpa: setup correct vq size with callbacks get_vq_num_{max,min} Jason Wang
[not found] ` <ab430c611c3d8074fddc6c4e0f747852678d6b3f.1632882380.git.wuzongyong@linux.alibaba.com>
2021-10-11 3:10 ` [PATCH v4 6/7] vdpa: add new attribute VDPA_ATTR_DEV_MIN_VQ_SIZE Jason Wang
[not found] ` <68d4ffac2ed9c21f352c272efbdf21e567d7d48e.1632882380.git.wuzongyong@linux.alibaba.com>
2021-10-11 3:18 ` [PATCH v4 7/7] eni_vdpa: add vDPA driver for Alibaba ENI Jason Wang
[not found] ` <cover.1634281805.git.wuzongyong@linux.alibaba.com>
[not found] ` <57a04a9e516ec4055cb887e9c7b24658ca5b0228.1634281805.git.wuzongyong@linux.alibaba.com>
2021-10-15 8:18 ` [PATCH v5 8/8] " Jason Wang
2021-10-15 19:13 ` Randy Dunlap
[not found] ` <17a38d70dd6f598f98eca68731746b6945a36d36.1634281805.git.wuzongyong@linux.alibaba.com>
2021-10-15 8:22 ` [PATCH v5 1/8] virtio-pci: introduce legacy device module Jason Wang
[not found] ` <25435d5cde12f298133196e866662b0ef2225205.1634281805.git.wuzongyong@linux.alibaba.com>
2021-10-15 8:22 ` [PATCH v5 4/8] vdpa: add new callback get_vq_num_min in vdpa_config_ops Jason Wang
[not found] ` <5b75093fc4a866a4502485ec208ca0e55440bdf7.1634281805.git.wuzongyong@linux.alibaba.com>
2021-10-15 8:24 ` [PATCH v5 5/8] vdpa: min vq num of vdpa device cannot be greater than max vq num Jason Wang
[not found] ` <4fae24ebd63ac4ec513bfe0688051469ea0588c0.1634281805.git.wuzongyong@linux.alibaba.com>
2021-10-15 8:30 ` [PATCH v5 6/8] virtio_vdpa: setup correct vq size with callbacks get_vq_num_{max,min} Jason Wang
[not found] ` <cover.1634870456.git.wuzongyong@linux.alibaba.com>
[not found] ` <7bb4834a0638fabaf3ba1a585b607830392a088f.1634870456.git.wuzongyong@linux.alibaba.com>
2021-10-25 1:30 ` [PATCH v6 1/8] virtio-pci: introduce legacy device module Jason Wang
[not found] ` <7e4d859949fa37fce2289a4b287843cdeffcaf8a.1634870456.git.wuzongyong@linux.alibaba.com>
2021-10-25 2:17 ` [PATCH v6 4/8] vdpa: add new callback get_vq_num_min in vdpa_config_ops Jason Wang
[not found] ` <41e5d4e7d9e6f46429ce45a80f81f40fdb8e11cb.1634870456.git.wuzongyong@linux.alibaba.com>
2021-10-25 2:18 ` [PATCH v6 5/8] vdpa: min vq num of vdpa device cannot be greater than max vq num Jason Wang
[not found] ` <c75b4499f7ead922daa19bf67b32eed6f185d260.1634870456.git.wuzongyong@linux.alibaba.com>
2021-10-25 2:22 ` [PATCH v6 6/8] virtio_vdpa: setup correct vq size with callbacks get_vq_num_{max, min} Jason Wang
[not found] ` <20211025024403.GA3684@L-PF27918B-1352.localdomain>
2021-10-25 4:45 ` [PATCH v6 6/8] virtio_vdpa: setup correct vq size with callbacks get_vq_num_{max,min} Jason Wang
[not found] ` <20211025062454.GA4832@L-PF27918B-1352.localdomain>
2021-10-26 4:46 ` [PATCH v6 6/8] virtio_vdpa: setup correct vq size with callbacks get_vq_num_{max, min} Jason Wang
[not found] ` <f3d36f0d7c9588aefaf6eeaa235b0a22fee23d56.1634870456.git.wuzongyong@linux.alibaba.com>
2021-10-25 2:23 ` [PATCH v6 7/8] vdpa: add new attribute VDPA_ATTR_DEV_MIN_VQ_SIZE Jason Wang
[not found] ` <6496b76a64303a3e23ea19e3e279644608de36fb.1634870456.git.wuzongyong@linux.alibaba.com>
2021-10-25 2:27 ` [PATCH v6 8/8] eni_vdpa: add vDPA driver for Alibaba ENI Jason Wang
[not found] ` <20211025032146.GC3684@L-PF27918B-1352.localdomain>
2021-10-25 4:40 ` Jason Wang [this message]
[not found] ` <20211027024700.GA23409@L-PF27918B-1352.localdomain>
2021-10-27 3:55 ` Jason Wang
[not found] ` <cover.1635493219.git.wuzongyong@linux.alibaba.com>
2021-11-01 3:31 ` [PATCH v7 0/9] " Jason Wang
[not found] ` <20211101062250.GA29814@L-PF27918B-1352.localdomain>
2021-11-01 7:02 ` Jason Wang
[not found] ` <20211101081159.GA4341@L-PF27918B-1352.localdomain>
2021-11-01 11:12 ` Michael S. Tsirkin
[not found] ` <0945b37f19b96ecadb79a4e1b01f486119a0b83a.1635493219.git.wuzongyong@linux.alibaba.com>
2021-11-01 8:18 ` [PATCH v7 9/9] eni_vdpa: alibaba: fix Kconfig typo Michael S. Tsirkin
2021-11-01 8:19 ` [PATCH v7 0/9] vDPA driver for Alibaba ENI Michael S. Tsirkin
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=51e9be5b-4bb2-b82b-a152-ffc37803410c@redhat.com \
--to=jasowang@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mst@redhat.com \
--cc=virtualization@lists.linux-foundation.org \
--cc=wei.yang1@linux.alibaba.com \
--cc=wuzongyong@linux.alibaba.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 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).