All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Tian, Kevin" <kevin.tian@intel.com>
To: Lu Baolu <baolu.lu@linux.intel.com>,
	Joerg Roedel <joro@8bytes.org>, Jason Gunthorpe <jgg@nvidia.com>,
	Christoph Hellwig <hch@infradead.org>,
	"Raj, Ashok" <ashok.raj@intel.com>, Will Deacon <will@kernel.org>,
	"Robin Murphy" <robin.murphy@arm.com>,
	Jean-Philippe Brucker <jean-philippe@linaro.com>
Cc: Eric Auger <eric.auger@redhat.com>,
	"Liu, Yi L" <yi.l.liu@intel.com>,
	"Pan, Jacob jun" <jacob.jun.pan@intel.com>,
	"iommu@lists.linux-foundation.org"
	<iommu@lists.linux-foundation.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Subject: RE: [PATCH RFC 03/11] iommu: Add attach/detach_dev_pasid domain ops
Date: Mon, 21 Mar 2022 07:13:49 +0000	[thread overview]
Message-ID: <BL1PR11MB527174765D1253AB4B88D2AD8C169@BL1PR11MB5271.namprd11.prod.outlook.com> (raw)
In-Reply-To: <20220320064030.2936936-4-baolu.lu@linux.intel.com>

> From: Lu Baolu <baolu.lu@linux.intel.com>
> Sent: Sunday, March 20, 2022 2:40 PM
> 
> Attaching an IOMMU domain to a PASID of a device is a generic operation
> for modern IOMMU drivers which support PASID-granular DMA address
> translation. Currently visible usage scenarios include (but not limited):
> 
>  - SVA
>  - kernel DMA with PASID
>  - hardware-assist mediated device
> 
> This adds a pair of common domain ops for this purpose and implements a
> couple of wrapper helpers for in-kernel usage.
> 
> Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com>
> ---
>  include/linux/iommu.h | 22 ++++++++++++++++++++++
>  drivers/iommu/iommu.c | 41
> +++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 63 insertions(+)
> 
> diff --git a/include/linux/iommu.h b/include/linux/iommu.h
> index 3e179b853380..e51845b9a146 100644
> --- a/include/linux/iommu.h
> +++ b/include/linux/iommu.h
> @@ -268,6 +268,8 @@ struct iommu_ops {
>   * struct iommu_domain_ops - domain specific operations
>   * @attach_dev: attach an iommu domain to a device
>   * @detach_dev: detach an iommu domain from a device
> + * @attach_dev_pasid: attach an iommu domain to a pasid of device
> + * @detach_dev_pasid: detach an iommu domain from a pasid of device
>   * @map: map a physically contiguous memory region to an iommu domain
>   * @map_pages: map a physically contiguous set of pages of the same size
> to
>   *             an iommu domain.
> @@ -285,6 +287,10 @@ struct iommu_ops {
>  struct iommu_domain_ops {
>  	int (*attach_dev)(struct iommu_domain *domain, struct device *dev);
>  	void (*detach_dev)(struct iommu_domain *domain, struct device
> *dev);
> +	int (*attach_dev_pasid)(struct iommu_domain *domain,
> +				struct device *dev, ioasid_t id);
> +	void (*detach_dev_pasid)(struct iommu_domain *domain,
> +				 struct device *dev, ioasid_t id);
> 
>  	int (*map)(struct iommu_domain *domain, unsigned long iova,
>  		   phys_addr_t paddr, size_t size, int prot, gfp_t gfp);
> @@ -678,6 +684,11 @@ int iommu_group_claim_dma_owner(struct
> iommu_group *group, void *owner);
>  void iommu_group_release_dma_owner(struct iommu_group *group);
>  bool iommu_group_dma_owner_claimed(struct iommu_group *group);
> 
> +int iommu_attach_device_pasid(struct iommu_domain *domain,
> +			      struct device *dev, ioasid_t pasid);
> +void iommu_detach_device_pasid(struct iommu_domain *domain,
> +			       struct device *dev, ioasid_t pasid);
> +
>  #else /* CONFIG_IOMMU_API */
> 
>  struct iommu_ops {};
> @@ -1046,6 +1057,17 @@ static inline bool
> iommu_group_dma_owner_claimed(struct iommu_group *group)
>  {
>  	return false;
>  }
> +
> +static inline int iommu_attach_device_pasid(struct iommu_domain
> *domain,
> +					    struct device *dev, ioasid_t pasid)
> +{
> +	return -ENODEV;
> +}
> +
> +static inline void iommu_detach_device_pasid(struct iommu_domain
> *domain,
> +					     struct device *dev, ioasid_t pasid)
> +{
> +}
>  #endif /* CONFIG_IOMMU_API */
> 
>  /**
> diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
> index 0c42ece25854..78c71ee15f36 100644
> --- a/drivers/iommu/iommu.c
> +++ b/drivers/iommu/iommu.c
> @@ -3167,3 +3167,44 @@ bool iommu_group_dma_owner_claimed(struct
> iommu_group *group)
>  	return user;
>  }
>  EXPORT_SYMBOL_GPL(iommu_group_dma_owner_claimed);
> +
> +int iommu_attach_device_pasid(struct iommu_domain *domain,
> +			      struct device *dev, ioasid_t pasid)
> +{
> +	struct iommu_group *group;
> +	int ret = -EINVAL;
> +
> +	if (!domain->ops->attach_dev_pasid)
> +		return -EINVAL;
> +
> +	group = iommu_group_get(dev);
> +	if (!group)
> +		return -ENODEV;
> +
> +	mutex_lock(&group->mutex);
> +	if (iommu_group_device_count(group) != 1)
> +		goto out_unlock;

Need move the reason of above limitation from iommu_sva_bind_device()
to here:

	/*
	 * To keep things simple, SVA currently doesn't support IOMMU groups
	 * with more than one device. Existing SVA-capable systems are not
	 * affected by the problems that required IOMMU groups (lack of ACS
	 * isolation, device ID aliasing and other hardware issues).
	 */
	if (iommu_group_device_count(group) != 1)
		goto out_unlock;

btw I didn't see any safeguard on above assumption in device hotplug path
to a group which already has SVA enabled...

> +
> +	ret = domain->ops->attach_dev_pasid(domain, dev, pasid);
> +
> +out_unlock:
> +	mutex_unlock(&group->mutex);
> +	iommu_group_put(group);
> +
> +	return ret;
> +}
> +
> +void iommu_detach_device_pasid(struct iommu_domain *domain,
> +			       struct device *dev, ioasid_t pasid)
> +{
> +	struct iommu_group *group;
> +
> +	group = iommu_group_get(dev);
> +	if (WARN_ON(!group))
> +		return;
> +
> +	mutex_lock(&group->mutex);
> +	domain->ops->detach_dev_pasid(domain, dev, pasid);
> +	mutex_unlock(&group->mutex);
> +	iommu_group_put(group);
> +}
> --
> 2.25.1


WARNING: multiple messages have this Message-ID (diff)
From: "Tian, Kevin" <kevin.tian@intel.com>
To: Lu Baolu <baolu.lu@linux.intel.com>,
	Joerg Roedel <joro@8bytes.org>, Jason Gunthorpe <jgg@nvidia.com>,
	Christoph Hellwig <hch@infradead.org>,
	"Raj, Ashok" <ashok.raj@intel.com>, Will Deacon <will@kernel.org>,
	"Robin Murphy" <robin.murphy@arm.com>,
	Jean-Philippe Brucker <jean-philippe@linaro.com>
Cc: "iommu@lists.linux-foundation.org"
	<iommu@lists.linux-foundation.org>,
	"Pan, Jacob jun" <jacob.jun.pan@intel.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Subject: RE: [PATCH RFC 03/11] iommu: Add attach/detach_dev_pasid domain ops
Date: Mon, 21 Mar 2022 07:13:49 +0000	[thread overview]
Message-ID: <BL1PR11MB527174765D1253AB4B88D2AD8C169@BL1PR11MB5271.namprd11.prod.outlook.com> (raw)
In-Reply-To: <20220320064030.2936936-4-baolu.lu@linux.intel.com>

> From: Lu Baolu <baolu.lu@linux.intel.com>
> Sent: Sunday, March 20, 2022 2:40 PM
> 
> Attaching an IOMMU domain to a PASID of a device is a generic operation
> for modern IOMMU drivers which support PASID-granular DMA address
> translation. Currently visible usage scenarios include (but not limited):
> 
>  - SVA
>  - kernel DMA with PASID
>  - hardware-assist mediated device
> 
> This adds a pair of common domain ops for this purpose and implements a
> couple of wrapper helpers for in-kernel usage.
> 
> Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com>
> ---
>  include/linux/iommu.h | 22 ++++++++++++++++++++++
>  drivers/iommu/iommu.c | 41
> +++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 63 insertions(+)
> 
> diff --git a/include/linux/iommu.h b/include/linux/iommu.h
> index 3e179b853380..e51845b9a146 100644
> --- a/include/linux/iommu.h
> +++ b/include/linux/iommu.h
> @@ -268,6 +268,8 @@ struct iommu_ops {
>   * struct iommu_domain_ops - domain specific operations
>   * @attach_dev: attach an iommu domain to a device
>   * @detach_dev: detach an iommu domain from a device
> + * @attach_dev_pasid: attach an iommu domain to a pasid of device
> + * @detach_dev_pasid: detach an iommu domain from a pasid of device
>   * @map: map a physically contiguous memory region to an iommu domain
>   * @map_pages: map a physically contiguous set of pages of the same size
> to
>   *             an iommu domain.
> @@ -285,6 +287,10 @@ struct iommu_ops {
>  struct iommu_domain_ops {
>  	int (*attach_dev)(struct iommu_domain *domain, struct device *dev);
>  	void (*detach_dev)(struct iommu_domain *domain, struct device
> *dev);
> +	int (*attach_dev_pasid)(struct iommu_domain *domain,
> +				struct device *dev, ioasid_t id);
> +	void (*detach_dev_pasid)(struct iommu_domain *domain,
> +				 struct device *dev, ioasid_t id);
> 
>  	int (*map)(struct iommu_domain *domain, unsigned long iova,
>  		   phys_addr_t paddr, size_t size, int prot, gfp_t gfp);
> @@ -678,6 +684,11 @@ int iommu_group_claim_dma_owner(struct
> iommu_group *group, void *owner);
>  void iommu_group_release_dma_owner(struct iommu_group *group);
>  bool iommu_group_dma_owner_claimed(struct iommu_group *group);
> 
> +int iommu_attach_device_pasid(struct iommu_domain *domain,
> +			      struct device *dev, ioasid_t pasid);
> +void iommu_detach_device_pasid(struct iommu_domain *domain,
> +			       struct device *dev, ioasid_t pasid);
> +
>  #else /* CONFIG_IOMMU_API */
> 
>  struct iommu_ops {};
> @@ -1046,6 +1057,17 @@ static inline bool
> iommu_group_dma_owner_claimed(struct iommu_group *group)
>  {
>  	return false;
>  }
> +
> +static inline int iommu_attach_device_pasid(struct iommu_domain
> *domain,
> +					    struct device *dev, ioasid_t pasid)
> +{
> +	return -ENODEV;
> +}
> +
> +static inline void iommu_detach_device_pasid(struct iommu_domain
> *domain,
> +					     struct device *dev, ioasid_t pasid)
> +{
> +}
>  #endif /* CONFIG_IOMMU_API */
> 
>  /**
> diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
> index 0c42ece25854..78c71ee15f36 100644
> --- a/drivers/iommu/iommu.c
> +++ b/drivers/iommu/iommu.c
> @@ -3167,3 +3167,44 @@ bool iommu_group_dma_owner_claimed(struct
> iommu_group *group)
>  	return user;
>  }
>  EXPORT_SYMBOL_GPL(iommu_group_dma_owner_claimed);
> +
> +int iommu_attach_device_pasid(struct iommu_domain *domain,
> +			      struct device *dev, ioasid_t pasid)
> +{
> +	struct iommu_group *group;
> +	int ret = -EINVAL;
> +
> +	if (!domain->ops->attach_dev_pasid)
> +		return -EINVAL;
> +
> +	group = iommu_group_get(dev);
> +	if (!group)
> +		return -ENODEV;
> +
> +	mutex_lock(&group->mutex);
> +	if (iommu_group_device_count(group) != 1)
> +		goto out_unlock;

Need move the reason of above limitation from iommu_sva_bind_device()
to here:

	/*
	 * To keep things simple, SVA currently doesn't support IOMMU groups
	 * with more than one device. Existing SVA-capable systems are not
	 * affected by the problems that required IOMMU groups (lack of ACS
	 * isolation, device ID aliasing and other hardware issues).
	 */
	if (iommu_group_device_count(group) != 1)
		goto out_unlock;

btw I didn't see any safeguard on above assumption in device hotplug path
to a group which already has SVA enabled...

> +
> +	ret = domain->ops->attach_dev_pasid(domain, dev, pasid);
> +
> +out_unlock:
> +	mutex_unlock(&group->mutex);
> +	iommu_group_put(group);
> +
> +	return ret;
> +}
> +
> +void iommu_detach_device_pasid(struct iommu_domain *domain,
> +			       struct device *dev, ioasid_t pasid)
> +{
> +	struct iommu_group *group;
> +
> +	group = iommu_group_get(dev);
> +	if (WARN_ON(!group))
> +		return;
> +
> +	mutex_lock(&group->mutex);
> +	domain->ops->detach_dev_pasid(domain, dev, pasid);
> +	mutex_unlock(&group->mutex);
> +	iommu_group_put(group);
> +}
> --
> 2.25.1

_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

  reply	other threads:[~2022-03-21  7:13 UTC|newest]

Thread overview: 112+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-03-20  6:40 [PATCH RFC 00/11] iommu: SVA and IOPF refactoring Lu Baolu
2022-03-20  6:40 ` Lu Baolu
2022-03-20  6:40 ` [PATCH RFC 01/11] iommu: Add pasid_bits field in struct dev_iommu Lu Baolu
2022-03-20  6:40   ` Lu Baolu
2022-03-21  7:01   ` Tian, Kevin
2022-03-21  7:01     ` Tian, Kevin
2022-03-21 10:22     ` Lu Baolu
2022-03-21 10:22       ` Lu Baolu
2022-03-22  0:26       ` Tian, Kevin
2022-03-22  0:26         ` Tian, Kevin
2022-03-22  0:48         ` Lu Baolu
2022-03-22  0:48           ` Lu Baolu
2022-03-21 11:22   ` Jean-Philippe Brucker
2022-03-21 11:22     ` Jean-Philippe Brucker
2022-03-22  0:45     ` Lu Baolu
2022-03-22  0:45       ` Lu Baolu
2022-03-20  6:40 ` [PATCH RFC 02/11] iommu: Add iommu_domain type for SVA Lu Baolu
2022-03-20  6:40   ` Lu Baolu
2022-03-21  7:06   ` Tian, Kevin
2022-03-21  7:06     ` Tian, Kevin
2022-03-21 10:23     ` Lu Baolu
2022-03-21 10:23       ` Lu Baolu
2022-03-21 11:47   ` Jason Gunthorpe
2022-03-21 11:47     ` Jason Gunthorpe via iommu
2022-03-22  0:54     ` Lu Baolu
2022-03-22  0:54       ` Lu Baolu
2022-03-20  6:40 ` [PATCH RFC 03/11] iommu: Add attach/detach_dev_pasid domain ops Lu Baolu
2022-03-20  6:40   ` Lu Baolu
2022-03-21  7:13   ` Tian, Kevin [this message]
2022-03-21  7:13     ` Tian, Kevin
2022-03-21 10:27     ` Lu Baolu
2022-03-21 10:27       ` Lu Baolu
2022-03-21 11:53     ` Jason Gunthorpe via iommu
2022-03-21 11:53       ` Jason Gunthorpe
2022-03-20  6:40 ` [PATCH RFC 04/11] iommu/vt-d: Add SVA domain support Lu Baolu
2022-03-20  6:40   ` Lu Baolu
2022-03-21  7:45   ` Tian, Kevin
2022-03-21  7:45     ` Tian, Kevin
2022-03-21 10:37     ` Lu Baolu
2022-03-21 10:37       ` Lu Baolu
2022-03-21 11:56   ` Jason Gunthorpe via iommu
2022-03-21 11:56     ` Jason Gunthorpe
2022-03-22  4:25     ` Lu Baolu
2022-03-22  4:25       ` Lu Baolu
2022-03-20  6:40 ` [PATCH RFC 05/11] arm-smmu-v3/sva: " Lu Baolu
2022-03-20  6:40   ` Lu Baolu
2022-03-21 11:31   ` Jean-Philippe Brucker
2022-03-21 11:31     ` Jean-Philippe Brucker
2022-03-21 11:58     ` Jason Gunthorpe
2022-03-21 11:58       ` Jason Gunthorpe via iommu
2022-03-20  6:40 ` [PATCH RFC 06/11] iommu/sva: Use attach/detach_pasid_dev in SVA interfaces Lu Baolu
2022-03-20  6:40   ` Lu Baolu
2022-03-21  8:04   ` Tian, Kevin
2022-03-21  8:04     ` Tian, Kevin
2022-03-21 11:01     ` Lu Baolu
2022-03-21 11:01       ` Lu Baolu
2022-03-21 12:03       ` Jason Gunthorpe
2022-03-21 12:03         ` Jason Gunthorpe via iommu
2022-03-21 11:33   ` Jean-Philippe Brucker
2022-03-21 11:33     ` Jean-Philippe Brucker
2022-03-22  4:29     ` Lu Baolu
2022-03-22  4:29       ` Lu Baolu
2022-03-21 12:05   ` Jason Gunthorpe
2022-03-21 12:05     ` Jason Gunthorpe via iommu
2022-03-22  4:31     ` Lu Baolu
2022-03-22  4:31       ` Lu Baolu
2022-03-20  6:40 ` [PATCH RFC 07/11] iommu: Remove SVA related callbacks from iommu ops Lu Baolu
2022-03-20  6:40   ` Lu Baolu
2022-03-20  6:40 ` [PATCH RFC 08/11] iommu: Handle IO page faults directly Lu Baolu
2022-03-20  6:40   ` Lu Baolu
2022-03-21 11:35   ` Jean-Philippe Brucker
2022-03-21 11:35     ` Jean-Philippe Brucker
2022-03-22  0:39     ` Tian, Kevin
2022-03-22  0:39       ` Tian, Kevin
2022-03-20  6:40 ` [PATCH RFC 09/11] iommu: Add iommu_get_domain_for_dev_pasid() Lu Baolu
2022-03-20  6:40   ` Lu Baolu
2022-03-21 12:40   ` Jason Gunthorpe
2022-03-21 12:40     ` Jason Gunthorpe via iommu
2022-03-22  4:50     ` Lu Baolu
2022-03-22  4:50       ` Lu Baolu
2022-03-20  6:40 ` [PATCH RFC 10/11] iommu: Make IOPF handling framework generic Lu Baolu
2022-03-20  6:40   ` Lu Baolu
2022-03-21  8:09   ` Tian, Kevin
2022-03-21  8:09     ` Tian, Kevin
2022-03-21 11:42     ` Jean-Philippe Brucker
2022-03-21 11:42       ` Jean-Philippe Brucker
2022-03-21 12:43       ` Jason Gunthorpe
2022-03-21 12:43         ` Jason Gunthorpe via iommu
2022-03-22  5:03         ` Lu Baolu
2022-03-22  5:03           ` Lu Baolu
2022-03-22 10:02           ` Jean-Philippe Brucker
2022-03-22 10:02             ` Jean-Philippe Brucker
2022-03-22 12:15           ` Jason Gunthorpe
2022-03-22 12:15             ` Jason Gunthorpe via iommu
2022-03-22  1:00       ` Tian, Kevin
2022-03-22  1:00         ` Tian, Kevin
2022-03-22 10:06         ` Jean-Philippe Brucker
2022-03-22 10:06           ` Jean-Philippe Brucker
2022-03-22 10:24           ` Tian, Kevin
2022-03-22 10:24             ` Tian, Kevin
2022-03-22 10:50             ` Jean-Philippe Brucker
2022-03-22 10:50               ` Jean-Philippe Brucker
2022-03-21 11:39   ` Jean-Philippe Brucker
2022-03-21 11:39     ` Jean-Philippe Brucker
2022-03-22  5:28     ` Lu Baolu
2022-03-22  5:28       ` Lu Baolu
2022-03-21 12:50   ` Jason Gunthorpe
2022-03-21 12:50     ` Jason Gunthorpe via iommu
2022-03-22  5:48     ` Lu Baolu
2022-03-22  5:48       ` Lu Baolu
2022-03-20  6:40 ` [PATCH RFC 11/11] iommu: Rename iommu-sva-lib.{c,h} Lu Baolu
2022-03-20  6:40   ` Lu Baolu

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=BL1PR11MB527174765D1253AB4B88D2AD8C169@BL1PR11MB5271.namprd11.prod.outlook.com \
    --to=kevin.tian@intel.com \
    --cc=ashok.raj@intel.com \
    --cc=baolu.lu@linux.intel.com \
    --cc=eric.auger@redhat.com \
    --cc=hch@infradead.org \
    --cc=iommu@lists.linux-foundation.org \
    --cc=jacob.jun.pan@intel.com \
    --cc=jean-philippe@linaro.com \
    --cc=jgg@nvidia.com \
    --cc=joro@8bytes.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=robin.murphy@arm.com \
    --cc=will@kernel.org \
    --cc=yi.l.liu@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.