iommu.lists.linux-foundation.org archive mirror
 help / color / mirror / Atom feed
From: Jacob Pan <jacob.jun.pan-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
To: Auger Eric <eric.auger-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
Cc: yi.l.liu-VuQAYsv1563Yd54FQh9/CA@public.gmane.org,
	kevin.tian-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org,
	alex.williamson-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org,
	ashok.raj-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org,
	kvm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	peter.maydell-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org,
	Jean-Philippe Brucker
	<jean-philippe.brucker-5wv7dgnIgG8@public.gmane.org>,
	will.deacon-5wv7dgnIgG8@public.gmane.org,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	christoffer.dall-5wv7dgnIgG8@public.gmane.org,
	marc.zyngier-5wv7dgnIgG8@public.gmane.org,
	iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org,
	robin.murphy-5wv7dgnIgG8@public.gmane.org,
	kvmarm-FPEHb7Xf0XXUo1n7N8X6UoWGPAHP3yOg@public.gmane.org,
	eric.auger.pro-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org
Subject: Re: [PATCH v4 05/22] iommu: Introduce cache_invalidate API
Date: Wed, 6 Mar 2019 13:59:10 -0800	[thread overview]
Message-ID: <20190306135910.0ef1eb0d@jacob-builder> (raw)
In-Reply-To: <0e041735-98e8-1d8c-c866-ad23e6cc1db5-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>

On Tue, 5 Mar 2019 19:14:42 +0100
Auger Eric <eric.auger-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> wrote:

> Hi Kevin, Yi,
> 
> On 3/5/19 4:28 PM, Jean-Philippe Brucker wrote:
> > On 18/02/2019 13:54, Eric Auger wrote:  
> >> From: "Liu, Yi L" <yi.l.liu-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
> >>
> >> In any virtualization use case, when the first translation stage
> >> is "owned" by the guest OS, the host IOMMU driver has no knowledge
> >> of caching structure updates unless the guest invalidation
> >> activities are trapped by the virtualizer and passed down to the
> >> host.
> >>
> >> Since the invalidation data are obtained from user space and will
> >> be written into physical IOMMU, we must allow security check at
> >> various layers. Therefore, generic invalidation data format are
> >> proposed here, model specific IOMMU drivers need to convert them
> >> into their own format.
> >>
> >> Signed-off-by: Liu, Yi L <yi.l.liu-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
> >> Signed-off-by: Jean-Philippe Brucker
> >> <jean-philippe.brucker-5wv7dgnIgG8@public.gmane.org> Signed-off-by: Jacob Pan
> >> <jacob.jun.pan-VuQAYsv1563Yd54FQh9/CA@public.gmane.org> Signed-off-by: Ashok Raj
> >> <ashok.raj-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org> Signed-off-by: Eric Auger
> >> <eric.auger-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
> >>
> >> ---
> >> v3 -> v4:
> >> - full reshape of the API following Alex' comments
> >>
> >> v1 -> v2:
> >> - add arch_id field
> >> - renamed tlb_invalidate into cache_invalidate as this API allows
> >>   to invalidate context caches on top of IOTLBs
> >>
> >> v1:
> >> renamed sva_invalidate into tlb_invalidate and add iommu_ prefix in
> >> header. Commit message reworded.
> >> ---
> >>  drivers/iommu/iommu.c      | 14 ++++++++
> >>  include/linux/iommu.h      | 14 ++++++++
> >>  include/uapi/linux/iommu.h | 71
> >> ++++++++++++++++++++++++++++++++++++++ 3 files changed, 99
> >> insertions(+)
> >>
> >> diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
> >> index b3adb77cb14c..bcb8eb15426c 100644
> >> --- a/drivers/iommu/iommu.c
> >> +++ b/drivers/iommu/iommu.c
> >> @@ -1564,6 +1564,20 @@ void iommu_detach_pasid_table(struct
> >> iommu_domain *domain) }
> >>  EXPORT_SYMBOL_GPL(iommu_detach_pasid_table);
> >>  
> >> +int iommu_cache_invalidate(struct iommu_domain *domain, struct
> >> device *dev,
> >> +			   struct iommu_cache_invalidate_info
> >> *inv_info) +{
> >> +	int ret = 0;
> >> +
> >> +	if (unlikely(!domain->ops->cache_invalidate))
> >> +		return -ENODEV;
> >> +
> >> +	ret = domain->ops->cache_invalidate(domain, dev,
> >> inv_info); +
> >> +	return ret;
> >> +}
> >> +EXPORT_SYMBOL_GPL(iommu_cache_invalidate);
> >> +
> >>  static void __iommu_detach_device(struct iommu_domain *domain,
> >>  				  struct device *dev)
> >>  {
> >> diff --git a/include/linux/iommu.h b/include/linux/iommu.h
> >> index 7045e26f3a7d..a3b879d0753c 100644
> >> --- a/include/linux/iommu.h
> >> +++ b/include/linux/iommu.h
> >> @@ -189,6 +189,7 @@ struct iommu_resv_region {
> >>   * @pgsize_bitmap: bitmap of all possible supported page sizes
> >>   * @attach_pasid_table: attach a pasid table
> >>   * @detach_pasid_table: detach the pasid table
> >> + * @cache_invalidate: invalidate translation caches
> >>   */
> >>  struct iommu_ops {
> >>  	bool (*capable)(enum iommu_cap);
> >> @@ -235,6 +236,9 @@ struct iommu_ops {
> >>  				  struct iommu_pasid_table_config
> >> *cfg); void (*detach_pasid_table)(struct iommu_domain *domain);
> >>  
> >> +	int (*cache_invalidate)(struct iommu_domain *domain,
> >> struct device *dev,
> >> +				struct
> >> iommu_cache_invalidate_info *inv_info); +
> >>  	unsigned long pgsize_bitmap;
> >>  };
> >>  
> >> @@ -348,6 +352,9 @@ extern void iommu_detach_device(struct
> >> iommu_domain *domain, extern int iommu_attach_pasid_table(struct
> >> iommu_domain *domain, struct iommu_pasid_table_config *cfg);
> >>  extern void iommu_detach_pasid_table(struct iommu_domain *domain);
> >> +extern int iommu_cache_invalidate(struct iommu_domain *domain,
> >> +				  struct device *dev,
> >> +				  struct
> >> iommu_cache_invalidate_info *inv_info); extern struct iommu_domain
> >> *iommu_get_domain_for_dev(struct device *dev); extern struct
> >> iommu_domain *iommu_get_dma_domain(struct device *dev); extern int
> >> iommu_map(struct iommu_domain *domain, unsigned long iova, @@
> >> -798,6 +805,13 @@ void iommu_detach_pasid_table(struct
> >> iommu_domain *domain) { return -ENODEV;
> >>  }
> >> +static inline int
> >> +iommu_cache_invalidate(struct iommu_domain *domain,
> >> +		       struct device *dev,
> >> +		       struct iommu_cache_invalidate_info
> >> *inv_info) +{
> >> +	return -ENODEV;
> >> +}
> >>  
> >>  #endif /* CONFIG_IOMMU_API */
> >>  
> >> diff --git a/include/uapi/linux/iommu.h
> >> b/include/uapi/linux/iommu.h index e9065bfa5b24..ae41385b0a7e
> >> 100644 --- a/include/uapi/linux/iommu.h
> >> +++ b/include/uapi/linux/iommu.h
> >> @@ -159,4 +159,75 @@ struct iommu_pasid_table_config {
> >>  	};
> >>  };
> >>  
> >> +/* defines the granularity of the invalidation */
> >> +enum iommu_inv_granularity {
> >> +	IOMMU_INV_GRANU_DOMAIN,	/* domain-selective
> >> invalidation */
> >> +	IOMMU_INV_GRANU_PASID,	/* pasid-selective
> >> invalidation */
> >> +	IOMMU_INV_GRANU_ADDR,	/* page-selective
> >> invalidation */ +};
> >> +
> >> +/**
> >> + * Address Selective Invalidation Structure
> >> + *
> >> + * @flags indicates the granularity of the address-selective
> >> invalidation
> >> + * - if PASID bit is set, @pasid field is populated and the
> >> invalidation
> >> + *   relates to cache entries tagged with this PASID and matching
> >> the
> >> + *   address range.
> >> + * - if ARCHID bit is set, @archid is populated and the
> >> invalidation relates
> >> + *   to cache entries tagged with this architecture specific id
> >> and matching
> >> + *   the address range.
> >> + * - Both PASID and ARCHID can be set as they may tag different
> >> caches.
> >> + * - if neither PASID or ARCHID is set, global addr invalidation
> >> applies
> >> + * - LEAF flag indicates whether only the leaf PTE caching needs
> >> to be
> >> + *   invalidated and other paging structure caches can be
> >> preserved.
> >> + * @pasid: process address space id
> >> + * @archid: architecture-specific id
> >> + * @addr: first stage/level input address
> >> + * @granule_size: page/block size of the mapping in bytes
> >> + * @nb_granules: number of contiguous granules to be invalidated
> >> + */
> >> +struct iommu_inv_addr_info {
> >> +#define IOMMU_INV_ADDR_FLAGS_PASID	(1 << 0)
> >> +#define IOMMU_INV_ADDR_FLAGS_ARCHID	(1 << 1)
> >> +#define IOMMU_INV_ADDR_FLAGS_LEAF	(1 << 2)
> >> +	__u32	flags;
> >> +	__u32	archid;
> >> +	__u64	pasid;
> >> +	__u64	addr;
> >> +	__u64	granule_size;
> >> +	__u64	nb_granules;
> >> +};  
> > 
> > Some fields don't need that many bytes, but I'm not sure it matters
> > and I'd like to see if this version works for the x86 folks before
> > bothering with such details. Looks good to me, from the SMMU
> > perspective.  
> Does it fit your needs? - Thanks Jean for your feedback -
Yes, it should fit VT-d's needs.
We will do some conversion for granularity based on .cache
and .granularity.

Fill in the 4K size for granule_size, then use nb_granules for size of
iotlb invalidation. We probably dont need arch ID. We also dont need
the global page flags as you have removed it. So we should be good.

We will use this for my next patchset.

Thanks,

Jacob

> 
> Thanks
> 
> Eric
> 
> > 
> > Thanks,
> > Jean
> >   
> >> +
> >> +/**
> >> + * First level/stage invalidation information
> >> + * @cache: bitfield that allows to select which caches to
> >> invalidate
> >> + * @granularity: defines the lowest granularity used for the
> >> invalidation:
> >> + *     domain > pasid > addr
> >> + *
> >> + * Not all the combinations of cache/granularity make sense:
> >> + *
> >> + *         type |   DEV_IOTLB   |     IOTLB     |      PASID    |
> >> + * granularity	|		|		|
> >> cache	|
> >> + * -------------+---------------+---------------+---------------+
> >> + * DOMAIN	|	N/A	|       Y	|
> >> Y	|
> >> + * PASID	|	Y	|       Y	|
> >> Y	|
> >> + * ADDR		|       Y	|       Y	|
> >> N/A	|
> >> + */
> >> +struct iommu_cache_invalidate_info {
> >> +#define IOMMU_CACHE_INVALIDATE_INFO_VERSION_1 1
> >> +	__u32	version;
> >> +/* IOMMU paging structure cache */
> >> +#define IOMMU_CACHE_INV_TYPE_IOTLB	(1 << 0) /* IOMMU IOTLB
> >> */ +#define IOMMU_CACHE_INV_TYPE_DEV_IOTLB	(1 << 1) /*
> >> Device IOTLB */ +#define IOMMU_CACHE_INV_TYPE_PASID	(1 <<
> >> 2) /* PASID cache */
> >> +	__u8	cache;
> >> +	__u8	granularity;
> >> +	__u8	padding[2];
> >> +	union {
> >> +		__u64	pasid;
> >> +		struct iommu_inv_addr_info addr_info;
> >> +	};
> >> +};
> >> +
> >> +
> >>  #endif /* _UAPI_IOMMU_H */
> >>  
> >   

[Jacob Pan]

  parent reply	other threads:[~2019-03-06 21:59 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-02-18 13:54 [PATCH v4 00/22] SMMUv3 Nested Stage Setup Eric Auger
2019-02-18 13:54 ` [PATCH v4 01/22] driver core: add per device iommu param Eric Auger
2019-02-18 13:54 ` [PATCH v4 02/22] iommu: introduce device fault data Eric Auger
2019-03-05 14:56   ` Jean-Philippe Brucker
2019-03-06  9:38     ` Auger Eric
2019-03-06 12:08       ` Jean-Philippe Brucker
2019-03-06 11:03     ` Auger Eric
2019-03-06 14:30     ` Auger Eric
2019-03-06 16:07       ` Jean-Philippe Brucker
2019-03-06 17:32         ` Auger Eric
2019-02-18 13:54 ` [PATCH v4 03/22] iommu: introduce device fault report API Eric Auger
2019-03-05 15:03   ` Jean-Philippe Brucker
2019-03-06 23:46     ` Jacob Pan
2019-03-07 11:42       ` Jean-Philippe Brucker
2019-02-18 13:54 ` [PATCH v4 04/22] iommu: Introduce attach/detach_pasid_table API Eric Auger
2019-03-05 15:23   ` Jean-Philippe Brucker
2019-03-05 18:15     ` Auger Eric
2019-02-18 13:54 ` [PATCH v4 05/22] iommu: Introduce cache_invalidate API Eric Auger
2019-03-05 15:28   ` Jean-Philippe Brucker
2019-03-05 18:14     ` Auger Eric
     [not found]       ` <0e041735-98e8-1d8c-c866-ad23e6cc1db5-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2019-03-06 21:59         ` Jacob Pan [this message]
2019-02-18 13:54 ` [PATCH v4 06/22] iommu: Introduce bind/unbind_guest_msi Eric Auger
2019-02-18 13:54 ` [PATCH v4 07/22] vfio: VFIO_IOMMU_ATTACH/DETACH_PASID_TABLE Eric Auger
2019-02-18 13:54 ` [PATCH v4 08/22] vfio: VFIO_IOMMU_CACHE_INVALIDATE Eric Auger
2019-02-18 13:54 ` [PATCH v4 09/22] vfio: VFIO_IOMMU_BIND/UNBIND_MSI Eric Auger
2019-02-18 13:54 ` [PATCH v4 10/22] iommu/arm-smmu-v3: Link domains and devices Eric Auger
2019-02-18 13:54 ` [PATCH v4 11/22] iommu/arm-smmu-v3: Maintain a SID->device structure Eric Auger
2019-02-18 13:54 ` [PATCH v4 12/22] iommu/smmuv3: Get prepared for nested stage support Eric Auger
2019-02-18 13:54 ` [PATCH v4 13/22] iommu/smmuv3: Implement attach/detach_pasid_table Eric Auger
2019-02-18 13:54 ` [PATCH v4 14/22] iommu/smmuv3: Implement cache_invalidate Eric Auger
2019-02-18 13:54 ` [PATCH v4 15/22] dma-iommu: Implement NESTED_MSI cookie Eric Auger
2019-02-18 13:54 ` [PATCH v4 16/22] iommu/smmuv3: Implement bind/unbind_guest_msi Eric Auger
2019-02-18 13:54 ` [PATCH v4 17/22] iommu/smmuv3: Report non recoverable faults Eric Auger
2019-02-18 13:54 ` [PATCH v4 18/22] vfio-pci: Add a new VFIO_REGION_TYPE_NESTED region type Eric Auger
2019-02-18 13:55 ` [PATCH v4 19/22] vfio-pci: Register an iommu fault handler Eric Auger
2019-02-25 14:22   ` Vincent Stehlé
2019-02-25 17:30     ` Auger Eric
2019-02-18 13:55 ` [PATCH v4 20/22] vfio_pci: Allow to mmap the fault queue Eric Auger
2019-02-18 13:55 ` [PATCH v4 21/22] vfio-pci: Add VFIO_PCI_DMA_FAULT_IRQ_INDEX Eric Auger
2019-02-18 13:55 ` [PATCH v4 22/22] vfio: Document nested stage control Eric Auger
2019-03-05  8:07 ` [PATCH v4 00/22] SMMUv3 Nested Stage Setup Auger Eric
2019-03-05 16:42 ` Auger Eric

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=20190306135910.0ef1eb0d@jacob-builder \
    --to=jacob.jun.pan-vuqaysv1563yd54fqh9/ca@public.gmane.org \
    --cc=alex.williamson-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org \
    --cc=ashok.raj-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org \
    --cc=christoffer.dall-5wv7dgnIgG8@public.gmane.org \
    --cc=eric.auger-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org \
    --cc=eric.auger.pro-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
    --cc=iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org \
    --cc=jean-philippe.brucker-5wv7dgnIgG8@public.gmane.org \
    --cc=kevin.tian-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org \
    --cc=kvm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=kvmarm-FPEHb7Xf0XXUo1n7N8X6UoWGPAHP3yOg@public.gmane.org \
    --cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=marc.zyngier-5wv7dgnIgG8@public.gmane.org \
    --cc=peter.maydell-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org \
    --cc=robin.murphy-5wv7dgnIgG8@public.gmane.org \
    --cc=will.deacon-5wv7dgnIgG8@public.gmane.org \
    --cc=yi.l.liu-VuQAYsv1563Yd54FQh9/CA@public.gmane.org \
    /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).