All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alex Williamson <alex.williamson@redhat.com>
To: "Liu, Yi L" <yi.l.liu@intel.com>
Cc: Jean-Philippe Brucker <jean-philippe.brucker@arm.com>,
	"Tian, Kevin" <kevin.tian@intel.com>,
	"Liu, Yi L" <yi.l.liu@linux.intel.com>,
	"Lan, Tianyu" <tianyu.lan@intel.com>,
	"Raj, Ashok" <ashok.raj@intel.com>,
	"kvm@vger.kernel.org" <kvm@vger.kernel.org>,
	"jasowang@redhat.com" <jasowang@redhat.com>,
	Will Deacon <Will.Deacon@arm.com>,
	"peterx@redhat.com" <peterx@redhat.com>,
	"qemu-devel@nongnu.org" <qemu-devel@nongnu.org>,
	"iommu@lists.linux-foundation.org"
	<iommu@lists.linux-foundation.org>,
	"Pan, Jacob jun" <jacob.jun.pan@intel.com>,
	Joerg Roedel <joro@8bytes.org>
Subject: Re: [Qemu-devel] [RFC PATCH 7/8] VFIO: Add new IOCTL for IOMMU TLB invalidate propagation
Date: Mon, 17 Jul 2017 16:45:15 -0600	[thread overview]
Message-ID: <20170717164515.2491b3bf@w520.home> (raw)
In-Reply-To: <A2975661238FB949B60364EF0F2C2574390A906A@shsmsx102.ccr.corp.intel.com>

On Mon, 17 Jul 2017 10:58:41 +0000
"Liu, Yi L" <yi.l.liu@intel.com> wrote:

> Hi Alex,
> 
> Pls refer to the response inline.
> 
> > -----Original Message-----
> > From: kvm-owner@vger.kernel.org [mailto:kvm-owner@vger.kernel.org] On Behalf
> > Of Alex Williamson
> > Sent: Saturday, July 15, 2017 2:16 AM
> > To: Liu, Yi L <yi.l.liu@intel.com>
> > Cc: Jean-Philippe Brucker <jean-philippe.brucker@arm.com>; Tian, Kevin
> > <kevin.tian@intel.com>; Liu, Yi L <yi.l.liu@linux.intel.com>; Lan, Tianyu
> > <tianyu.lan@intel.com>; Raj, Ashok <ashok.raj@intel.com>; kvm@vger.kernel.org;
> > jasowang@redhat.com; Will Deacon <Will.Deacon@arm.com>; peterx@redhat.com;
> > qemu-devel@nongnu.org; iommu@lists.linux-foundation.org; Pan, Jacob jun
> > <jacob.jun.pan@intel.com>; Joerg Roedel <joro@8bytes.org>
> > Subject: Re: [Qemu-devel] [RFC PATCH 7/8] VFIO: Add new IOCTL for IOMMU TLB
> > invalidate propagation
> > 
> > On Fri, 14 Jul 2017 08:58:02 +0000
> > "Liu, Yi L" <yi.l.liu@intel.com> wrote:
> >   
> > > Hi Alex,
> > >
> > > Against to the opaque open, I'd like to propose the following
> > > definition based on the existing comments. Pls note that I've merged
> > > the pasid table binding and iommu tlb invalidation into a single IOCTL
> > > and make different flags to indicate the iommu operations. Per Kevin's
> > > comments, there may be iommu invalidation for guest IOVA tlb, so I
> > > renamed the IOCTL and data structure to be non-svm specific. Pls
> > > kindly have a review, so that we can make the opaque open closed and
> > > move forward. Surely, comments and ideas are welcomed. And for the
> > > scope and flags definition in struct iommu_tlb_invalidate, it's also welcomed to  
> > give your ideas on it.  
> > >
> > > 1. Add a VFIO IOCTL for iommu operations from user-space
> > >
> > > #define VFIO_IOMMU_OP_IOCTL _IO(VFIO_TYPE, VFIO_BASE + 24)
> > >
> > > Corresponding data structure:
> > > struct vfio_iommu_operation_info {
> > > 	__u32	argsz;
> > > #define VFIO_IOMMU_BIND_PASIDTBL	(1 << 0) /* Bind PASID Table */
> > > #define VFIO_IOMMU_BIND_PASID	(1 << 1) /* Bind PASID from userspace  
> > driver*/  
> > > #define VFIO_IOMMU_BIND_PGTABLE	(1 << 2) /* Bind guest mmu page table */
> > > #define VFIO_IOMMU_INVAL_IOTLB	(1 << 3) /* Invalidate iommu tlb */
> > > 	__u32	flag;
> > > 	__u32	length; // length of the data[] part in byte
> > > 	__u8	data[]; // stores the data for iommu op indicated by flag field
> > > };  
> > 
> > If we're doing a generic "Ops" ioctl, then we should have an "op" field which is
> > defined by an enum.  It doesn't make sense to use flags for this, for example can we
> > set multiple flag bits?  If not then it's not a good use for a bit field.  I'm also not sure I
> > understand the value of the "length" field, can't it always be calculated from argsz?  
> 
> Agreed, enum would be better. "length" field could be calculated from argsz. I used
> it just to avoid offset calculations. May remove it.
>  
> > > For iommu tlb invalidation from userspace, the "__u8 data[]" stores
> > > data which would be parsed by the "struct iommu_tlb_invalidate"
> > > defined below.
> > >
> > > 2. Definitions in include/uapi/linux/iommu.h(newly added header file)
> > >
> > > /* IOMMU model definition for iommu operations from userspace */ enum
> > > iommu_model {
> > > 	INTLE_IOMMU,
> > > 	ARM_SMMU,
> > > 	AMD_IOMMU,
> > > 	SPAPR_IOMMU,
> > > 	S390_IOMMU,
> > > };
> > >
> > > struct iommu_tlb_invalidate {
> > > 	__u32	scope;
> > > /* pasid-selective invalidation described by @pasid */
> > > #define IOMMU_INVALIDATE_PASID	(1 << 0)
> > > /* address-selevtive invalidation described by (@vaddr, @size) */
> > > #define IOMMU_INVALIDATE_VADDR	(1 << 1)  
> > 
> > Again, is a bit field appropriate here, can a user set both bits?  
> 
> yes, user may set both bits. It would be invalidate address range
> which is tagged with a PASID value.
> 
> >   
> > > 	__u32	flags;
> > > /*  targets non-pasid mappings, @pasid is not valid */
> > > #define IOMMU_INVALIDATE_NO_PASID	(1 << 0)
> > > /* indicating that the pIOMMU doesn't need to invalidate
> > > 	all intermediate tables cached as part of the PTE for
> > > 	vaddr, only the last-level entry (pte). This is a hint. */
> > > #define IOMMU_INVALIDATE_VADDR_LEAF	(1 << 1)  
> > 
> > Are we venturing into vendor specific attributes here?  
> 
> These two attributes are still in discussion. Jean and me synced
> several rounds. But lack of comments from other vendors.
> 
> Personally, I think both should be generic.
> IOMMU_INVALIDATE_NO_PASID is to indicate no PASID used
> for the invalidation. IOMMU_INVALIDATE_VADDR_LEAF indicates
> only invalidate leaf mappings. 
> I would see if other vendor is object on it. If yes, I'm fine to move
> it to vendor specific part.
>  
> >   
> > > 	__u32	pasid;
> > > 	__u64	vaddr;
> > > 	__u64	size;
> > > 	enum iommu_model model;  
> > 
> > How does a user learn which model(s) are supported by the interface?
> > How do they learn which ops are supported?  Perhaps a good use for one of those
> > flag bits in the outer data structure is "probe".  
> 
> My initial plan to user fills it, if the underlying HW doesn't support the
> model, it refuses to service it. User should get a failure and stop to use
> it. But your suggestion to have a probe or kinds of query makes sense.
> How about we add one more operation for such purpose? Besides the
> supported model query, I'd like to add more. E.g the HW IOMMU capabilities.

We also have VFIO_IOMMU_GET_INFO where the structure can be extended
for missing capabilities.  Depending on the capability you want to
describe, this might be a better, existing interface for it.
 
> > > 	/*
> > > 	 Vendor may have different HW version and thus the
> > > 	 data part of this structure differs, use sub_version
> > > 	 to indicate such difference.
> > > 	 */
> > > 	__u322 sub_version;  
> > 
> > Not sure I see the value of this vs creating an INTEL_IOMMUv2 entry in the model
> > enum.  
> 
> Both are fine to me. Just see the opinions from other guys.
> 
> > > 	__u64 length; // length of the data[] part in byte  
> > 
> > Questionably useful vs calculating from argsz again , but it certainly doesn't need to
> > be a qword :-o  
> 
> Thx for the remind. 32bits would be enough. It is surely to get it from argsz. However,
> I would like to leave it here. Reason is:
> argsz is in vfio layer, the "length" here is actually used in vendor-specific iommu driver
> layer. So would require vfio to pass argsz or the size of " struct iommu_tlb_invalidate"
> to vendor-specific iommu driver layer by means of parameter or so. Personally, I prefer
> to pass it in the structure. If it's better to pass it as a parameter, I would do it.

Ok, then the layer that does the copy_from_user will need to validate
that length is fully contained within the copied data structure, we
can't let the user trick the kernel into using kernel memory for this.

> > > 	__u8	data[];
> > > };
> > >
> > > For Intel, the data structue is:
> > > struct intel_iommu_invalidate_data {
> > > 	__u64 low;
> > > 	__u64 high;
> > > }  
> > 
> > high/low what?  This is a pretty weak uapi definition.  Thanks,  
> 
> For this part, for Intel platform, we plan to pass a 128 bit data for the invalidation.
> The structure varies from invalidation type to type. Here is my thought on it. Define
> an 128 bits union. List the invalidation data details for each invalidation type. What's
> your opinion on it? So far, we have 7 types for invalidation. The prq response is not
> included.

I want this interface to be fully defined, but at the same time I don't
necessarily want to create useless data structures.  I believe the
intention here is to pass these directly through to a QI entry, where
we must match a hardware definition.  I'm tempted to suggest
referencing the hardware specification, but see below...

A concern for this model is that hardware may trust the iommu driver
not to create QI entries that don't set reserved bits or set invalid
field data.  If it does those kinds of things, it's a kernel driver
bug.  Once exposed to the user, we cannot guarantee that.  Does Intel
have confidence that a user cannot maliciously interfere with other
contexts or the general operation of the invalidation queue if a user is
effectively given direct access?  Will the invalidation data be
sanitized by the iommu driver?
 
> union intel_iommu_invalidate_data {
>  	struct {
> 		__u64 low;
>  		__u64 high;
> 	} invalidate_data;
> 
> 	struct {
> 		__u64 type: 4;
> 		__u64 gran: 2;
> 		__u64 rsv1: 10;
> 		__u64 did: 16;
> 		__u64 sid: 16;
> 		__u64 func_mask: 2;
> 		__u64 rsv2: 14;
> 		__64 rsv3: 64;
> 	} context_cache_inv;
> 	....

Here's part of the issue with not fully defining these, we have did,
sid, and func_mask.  I think we're claiming that the benefit of passing
through the hardware data structure is performance, but the user needs
to replace these IDs to match the physical device rather than the
virtual device, perhaps even entirely recreating it because there's not
necessarily a 1:1 mapping of things like func_mask between virtual and
physical hardware topologies (assuming I'm interpreting these fields
correctly).  Doesn't the kernel also need to validate any such field to
prevent the user spoofing entries for other devices?  Is there any
actual performance benefit remaining vs defining a generic interface
after multiple levels have manipulated, recreated, and sanitized
these structures?  We can't evaluate these sorts of risks if we don't
define what we're passing through.  Thanks,

Alex

  reply	other threads:[~2017-07-17 22:45 UTC|newest]

Thread overview: 116+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-04-26 10:11 [RFC PATCH 0/8] Shared Virtual Memory virtualization for VT-d Liu, Yi L
2017-04-26 10:11 ` [Qemu-devel] " Liu, Yi L
2017-04-26 10:11 ` [RFC PATCH 1/8] iommu: Introduce bind_pasid_table API function Liu, Yi L
2017-04-26 10:11   ` [Qemu-devel] " Liu, Yi L
2017-04-26 16:56   ` Jean-Philippe Brucker
2017-04-26 16:56     ` [Qemu-devel] " Jean-Philippe Brucker
2017-04-27  6:36     ` Liu, Yi L
2017-04-27  6:36       ` [Qemu-devel] " Liu, Yi L
2017-04-27 10:12       ` Jean-Philippe Brucker
2017-04-27 10:12         ` [Qemu-devel] " Jean-Philippe Brucker
     [not found]         ` <772ca9de-50ba-a379-002d-5ff1f6a2e297-5wv7dgnIgG8@public.gmane.org>
2017-04-28  7:59           ` Liu, Yi L
2017-04-28  7:59             ` Liu, Yi L
     [not found]     ` <c042bf90-d48b-4ebf-c01a-fca7c4875277-5wv7dgnIgG8@public.gmane.org>
2017-04-26 18:29       ` jacob pan
2017-04-26 18:29         ` [Qemu-devel] " jacob pan
     [not found]         ` <20170426112948.00004520-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2017-04-26 18:59           ` Jean-Philippe Brucker
2017-04-26 18:59             ` [Qemu-devel] " Jean-Philippe Brucker
2017-04-28  9:04       ` Liu, Yi L
2017-04-28  9:04         ` Liu, Yi L
2017-04-28 12:51         ` Jean-Philippe Brucker
2017-04-28 12:51           ` Jean-Philippe Brucker
     [not found]           ` <3adb4e33-db96-4133-0510-412c3bfb24fe-5wv7dgnIgG8@public.gmane.org>
2017-05-23  7:50             ` Liu, Yi L
2017-05-23  7:50               ` Liu, Yi L
2017-05-25 12:33               ` Jean-Philippe Brucker
2017-05-25 12:33                 ` Jean-Philippe Brucker
     [not found]   ` <1493201525-14418-2-git-send-email-yi.l.liu-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2017-05-12 21:59     ` Alex Williamson
2017-05-12 21:59       ` [Qemu-devel] " Alex Williamson
     [not found]       ` <20170512155914.73bad777-1yVPhWWZRC1BDLzU/O5InQ@public.gmane.org>
2017-05-14 10:56         ` Liu, Yi L
2017-05-14 10:56           ` [Qemu-devel] " Liu, Yi L
2017-04-26 10:11 ` [RFC PATCH 2/8] iommu/vt-d: add bind_pasid_table function Liu, Yi L
2017-04-26 10:11   ` [Qemu-devel] " Liu, Yi L
     [not found]   ` <1493201525-14418-3-git-send-email-yi.l.liu-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2017-05-12 21:59     ` Alex Williamson
2017-05-12 21:59       ` [Qemu-devel] " Alex Williamson
     [not found]       ` <20170512155929.66809113-1yVPhWWZRC1BDLzU/O5InQ@public.gmane.org>
2017-05-15 13:14         ` jacob pan
2017-05-15 13:14           ` [Qemu-devel] " jacob pan
2017-04-26 10:12 ` [RFC PATCH 3/8] iommu: Introduce iommu do invalidate API function Liu, Yi L
2017-04-26 10:12   ` [Qemu-devel] " Liu, Yi L
     [not found]   ` <1493201525-14418-4-git-send-email-yi.l.liu-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2017-05-12 21:59     ` Alex Williamson
2017-05-12 21:59       ` [Qemu-devel] " Alex Williamson
     [not found]       ` <20170512155924.755ee17f-1yVPhWWZRC1BDLzU/O5InQ@public.gmane.org>
2017-05-17 10:23         ` Liu, Yi L
2017-05-17 10:23           ` [Qemu-devel] " Liu, Yi L
2017-04-26 10:12 ` [RFC PATCH 4/8] iommu/vt-d: Add iommu do invalidate function Liu, Yi L
2017-04-26 10:12   ` [Qemu-devel] " Liu, Yi L
     [not found]   ` <1493201525-14418-5-git-send-email-yi.l.liu-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2017-05-12 21:59     ` Alex Williamson
2017-05-12 21:59       ` [Qemu-devel] " Alex Williamson
     [not found]       ` <20170512155918.5251fb94-1yVPhWWZRC1BDLzU/O5InQ@public.gmane.org>
2017-05-17 10:24         ` Liu, Yi L
2017-05-17 10:24           ` [Qemu-devel] " Liu, Yi L
2017-04-26 10:12 ` [RFC PATCH 5/8] VFIO: Add new IOTCL for PASID Table bind propagation Liu, Yi L
2017-04-26 10:12   ` [Qemu-devel] " Liu, Yi L
2017-04-26 16:56   ` Jean-Philippe Brucker
2017-04-26 16:56     ` [Qemu-devel] " Jean-Philippe Brucker
2017-04-27  5:43     ` Liu, Yi L
     [not found]   ` <1493201525-14418-6-git-send-email-yi.l.liu-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2017-05-11 10:29     ` Liu, Yi L
2017-05-11 10:29       ` Liu, Yi L
2017-05-12 21:58     ` Alex Williamson
2017-05-12 21:58       ` [Qemu-devel] " Alex Williamson
     [not found]       ` <20170512155851.627409ed-1yVPhWWZRC1BDLzU/O5InQ@public.gmane.org>
2017-05-17 10:27         ` Liu, Yi L
2017-05-17 10:27           ` Liu, Yi L
     [not found]           ` <20170517102759.GF22110-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2017-05-18 11:29             ` Jean-Philippe Brucker
2017-05-18 11:29               ` Jean-Philippe Brucker
2017-04-26 10:12 ` [RFC PATCH 6/8] VFIO: do pasid table binding Liu, Yi L
2017-04-26 10:12   ` [Qemu-devel] " Liu, Yi L
2017-05-09  7:55   ` Xiao Guangrong
2017-05-09  7:55     ` [Qemu-devel] " Xiao Guangrong
2017-05-11 10:29     ` Liu, Yi L
2017-05-12 21:59   ` Alex Williamson
2017-05-12 21:59     ` [Qemu-devel] " Alex Williamson
2017-04-26 10:12 ` [RFC PATCH 7/8] VFIO: Add new IOCTL for IOMMU TLB invalidate propagation Liu, Yi L
2017-04-26 10:12   ` [Qemu-devel] " Liu, Yi L
2017-05-12 12:11   ` Jean-Philippe Brucker
2017-05-12 12:11     ` [Qemu-devel] " Jean-Philippe Brucker
     [not found]     ` <cc330a8f-e087-9b6f-2a40-38b58688d300-5wv7dgnIgG8@public.gmane.org>
2017-05-14 10:12       ` Liu, Yi L
2017-05-14 10:12         ` [Qemu-devel] " Liu, Yi L
2017-05-15 12:14         ` Jean-Philippe Brucker
2017-05-15 12:14           ` [Qemu-devel] " Jean-Philippe Brucker
2017-07-02 10:06       ` Liu, Yi L
2017-07-02 10:06         ` Liu, Yi L
2017-07-03 11:52         ` Jean-Philippe Brucker
     [not found]           ` <0e4f2dd4-d553-b1b7-7bec-fe0ff5242c54-5wv7dgnIgG8@public.gmane.org>
2017-07-03 10:31             ` Liu, Yi L
2017-07-03 10:31               ` Liu, Yi L
     [not found]               ` <20170703103115.GB22053-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2017-07-05  6:45                 ` Tian, Kevin
2017-07-05  6:45                   ` Tian, Kevin
     [not found]                   ` <AADFC41AFE54684AB9EE6CBC0274A5D190D25919-0J0gbvR4kThpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2017-07-05 12:42                     ` Jean-Philippe Brucker
2017-07-05 12:42                       ` Jean-Philippe Brucker
     [not found]                       ` <1d63c1ae-ca10-0f9d-91de-0d9c9823c104-5wv7dgnIgG8@public.gmane.org>
2017-07-05 17:28                         ` Alex Williamson
2017-07-05 17:28                           ` Alex Williamson
     [not found]                           ` <20170705112816.56554f65-DGNDKt5SQtizQB+pC5nmwQ@public.gmane.org>
2017-07-05 22:26                             ` Tian, Kevin
2017-07-05 22:26                               ` Tian, Kevin
2017-07-14  8:58                             ` Liu, Yi L
2017-07-14  8:58                               ` Liu, Yi L
     [not found]                               ` <A2975661238FB949B60364EF0F2C2574390A7C4F-E2R4CRU6q/6iAffOGbnezLfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2017-07-14 18:15                                 ` Alex Williamson
2017-07-14 18:15                                   ` Alex Williamson
     [not found]                                   ` <20170714121555.7e64d849-DGNDKt5SQtizQB+pC5nmwQ@public.gmane.org>
2017-07-17 10:58                                     ` Liu, Yi L
2017-07-17 10:58                                       ` Liu, Yi L
2017-07-17 22:45                                       ` Alex Williamson [this message]
     [not found]                                         ` <20170717164515.2491b3bf-DGNDKt5SQtizQB+pC5nmwQ@public.gmane.org>
2017-07-18  9:38                                           ` Jean-Philippe Brucker
2017-07-18  9:38                                             ` Jean-Philippe Brucker
     [not found]                                             ` <d0abeefc-adcf-85c3-f5d9-8c90a18f8011-5wv7dgnIgG8@public.gmane.org>
2017-07-18 14:29                                               ` Alex Williamson
2017-07-18 14:29                                                 ` Alex Williamson
2017-07-18 15:03                                                 ` Jean-Philippe Brucker
2017-07-19 10:45                                           ` Liu, Yi L
2017-07-19 10:45                                             ` Liu, Yi L
2017-07-19 21:50                                             ` Jacob Pan
2017-07-19 21:50                                               ` Jacob Pan
2017-07-05 22:31                         ` Tian, Kevin
2017-07-05 22:31                           ` Tian, Kevin
2017-05-12 21:58   ` Alex Williamson
2017-05-12 21:58     ` [Qemu-devel] " Alex Williamson
2017-05-14 10:55     ` Liu, Yi L
2017-05-14 10:55       ` [Qemu-devel] " Liu, Yi L
     [not found]       ` <20170514105507.GB22110-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2017-07-05  5:32         ` Tian, Kevin
2017-07-05  5:32           ` [Qemu-devel] " Tian, Kevin
2017-04-26 10:12 ` [RFC PATCH 8/8] VFIO: do IOMMU TLB invalidation from guest Liu, Yi L
2017-04-26 10:12   ` [Qemu-devel] " Liu, Yi L
2017-05-08  4:09 ` [RFC PATCH 0/8] Shared Virtual Memory virtualization for VT-d Xiao Guangrong
2017-05-08  4:09   ` [Qemu-devel] " Xiao Guangrong
2017-05-07  7:33   ` Liu, Yi L

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=20170717164515.2491b3bf@w520.home \
    --to=alex.williamson@redhat.com \
    --cc=Will.Deacon@arm.com \
    --cc=ashok.raj@intel.com \
    --cc=iommu@lists.linux-foundation.org \
    --cc=jacob.jun.pan@intel.com \
    --cc=jasowang@redhat.com \
    --cc=jean-philippe.brucker@arm.com \
    --cc=joro@8bytes.org \
    --cc=kevin.tian@intel.com \
    --cc=kvm@vger.kernel.org \
    --cc=peterx@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=tianyu.lan@intel.com \
    --cc=yi.l.liu@intel.com \
    --cc=yi.l.liu@linux.intel.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.