From: Lu Baolu <baolu.lu-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
To: Jean-Philippe Brucker
<jean-philippe.brucker-5wv7dgnIgG8@public.gmane.org>,
iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org
Cc: kevin.tian-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org,
rafael-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org,
gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r@public.gmane.org,
will.deacon-5wv7dgnIgG8@public.gmane.org,
christian.koenig-5C7GfCeVMHo@public.gmane.org,
alex.williamson-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org,
robin.murphy-5wv7dgnIgG8@public.gmane.org
Subject: Re: [RFC PATCH 1/6] iommu: Adapt attach/detach_dev() for auxiliary domains
Date: Mon, 22 Oct 2018 10:32:50 +0800 [thread overview]
Message-ID: <f757bbfb-6a04-0560-87e1-6544a92dab91@linux.intel.com> (raw)
In-Reply-To: <20181019181158.2395-2-jean-philippe.brucker-5wv7dgnIgG8@public.gmane.org>
Hi,
On 10/20/18 2:11 AM, Jean-Philippe Brucker wrote:
> The same set of functions, iommu_attach/detach_device/group, is used
> both to change a device's domain (let's call it "main domain") and to
> add auxiliary domains. The former is used by vfio-pci for example, to
> assign the whole device to userspace. The latter is used by vfio-mdev to
> assign partitions of devices using PASIDs. Device drivers set or unset
> the 'AUXD' device attribute to switch between these modes.
>
> Supporting both auxiliary and main domain through the same callback
> requires some core changes. For an IOMMU driver that supports both, the
> new semantics of attach_dev() and detach_dev() ops are:
>
> attach_dev(dev, new_domain)
> (1) When auxd is disabled, detach from the current domain and attach to
> the new domain.
>
> (2) When auxd is enabled, keep the current domain and attach to the new
> domain.
When auxd is enabled, the "main domain" is not affected. An auxiliary
domain is added.
>
> detach_dev(dev, new_domain)
> (3) When auxd is disabled, detach from the domain. Previously the core
> didn't call detach_dev explicitly when a device has a default domain,
> since case (1) already takes care of it. But in order to also handle
> case (4), we now need to always call detach_dev.
>
> (4) When auxd is enabled, detach from the given domain, but stay attached
> to the default domain.
When auxd is enabled, the "main domain" is not affected. An auxiliary
domain is removed.
>
> attach_dev() now returns a value greater than 0 if the domain is in
> auxiliary mode. This allows the core to know if the main domain
> (group->domain) is affected. detach_dev() should probably do the same
> (currently group->domain is always cleared on detach), but that requires
> changing all IOMMU drivers.
>
> Since the core doesn't know about auxiliary domains when attaching, we
> have to relax attach_dev a bit: we can't check if the user is trying to
> replace the main domain with a new unmanaged domain anymore.
The core can know about the auxiliary domain by calling:
iommu_get_dev_attr(dev, IOMMU_DEV_ATTR_AUXD_ENABLED)
>
> IOMMU drivers that don't support auxiliary domains are also affected by
> the change in (3). Those that support default_domain now get
> detach_dev() followed by attach_dev() callback on iommu_detach_device(),
> instead of just attach_dev().
>
> Signed-off-by: Jean-Philippe Brucker <jean-philippe.brucker-5wv7dgnIgG8@public.gmane.org>
> ---
> drivers/iommu/iommu.c | 58 ++++++++++++++++++++++++++++++-------------
> 1 file changed, 41 insertions(+), 17 deletions(-)
>
> diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
> index a8a144dded52..667ccfc6d3fd 100644
> --- a/drivers/iommu/iommu.c
> +++ b/drivers/iommu/iommu.c
> @@ -1553,7 +1553,7 @@ static int __iommu_attach_device(struct iommu_domain *domain,
> return -ENODEV;
>
> ret = domain->ops->attach_dev(domain, dev);
> - if (!ret)
> + if (ret >= 0)
> trace_attach_device_to_domain(dev);
> return ret;
> }
> @@ -1726,6 +1726,12 @@ struct iommu_domain *iommu_get_domain_for_dev(struct device *dev)
> }
> EXPORT_SYMBOL_GPL(iommu_get_domain_for_dev);
>
> +struct iommu_attach_group_info {
> + struct iommu_domain *domain;
> + unsigned long count;
> + int ret;
> +};
> +
> /*
> * IOMMU groups are really the natrual working unit of the IOMMU, but
> * the IOMMU API works on domains and devices. Bridge that gap by
> @@ -1738,20 +1744,31 @@ EXPORT_SYMBOL_GPL(iommu_get_domain_for_dev);
> */
> static int iommu_group_do_attach_device(struct device *dev, void *data)
> {
> - struct iommu_domain *domain = data;
> + int ret;
> + struct iommu_attach_group_info *info = data;
>
> - return __iommu_attach_device(domain, dev);
> + ret = __iommu_attach_device(info->domain, dev);
> + if (ret < 0)
> + return ret;
> +
> + /* Can't mix auxiliary and main domain within a group */
> + if (info->count++ && ret != info->ret)
> + /* TODO: rollback */
> + return -ENODEV;
To make it simple, we can disable the AUXD feature on devices which
share its group with other devices.
Best regards,
Lu Baolu
> + info->ret = ret;
> +
> + return 0;
> }
>
> static int __iommu_attach_group(struct iommu_domain *domain,
> struct iommu_group *group)
> {
> int ret;
> + struct iommu_attach_group_info info = {
> + .domain = domain,
> + };
>
> - if (group->default_domain && group->domain != group->default_domain)
> - return -EBUSY;
> -
> - ret = __iommu_group_for_each_dev(group, domain,
> + ret = __iommu_group_for_each_dev(group, &info,
> iommu_group_do_attach_device);
> if (ret == 0)
> group->domain = domain;
> @@ -1784,23 +1801,30 @@ static void __iommu_detach_group(struct iommu_domain *domain,
> struct iommu_group *group)
> {
> int ret;
> + struct iommu_attach_group_info info = {
> + .domain = group->default_domain,
> + };
>
> + __iommu_group_for_each_dev(group, domain, iommu_group_do_detach_device);
> if (!group->default_domain) {
> - __iommu_group_for_each_dev(group, domain,
> - iommu_group_do_detach_device);
> + /*
> + * If detach returned, then we're not removing the main domain
> + * but an auxiliary one.
> + *
> + * FIXME: don't clear domain!
> + */
> group->domain = NULL;
> return;
> }
>
> - if (group->domain == group->default_domain)
> - return;
> -
> - /* Detach by re-attaching to the default domain */
> - ret = __iommu_group_for_each_dev(group, group->default_domain,
> + /*
> + * Detach by re-attaching to the default domain. If the device is
> + * already attached, then @domain was in auxiliary mode and the driver
> + * returns a value > 0.
> + */
> + ret = __iommu_group_for_each_dev(group, &info,
> iommu_group_do_attach_device);
> - if (ret != 0)
> - WARN_ON(1);
> - else
> + if (ret == 0)
> group->domain = group->default_domain;
> }
>
>
next prev parent reply other threads:[~2018-10-22 2:32 UTC|newest]
Thread overview: 60+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-10-19 18:11 [RFC PATCH 0/6] Auxiliary IOMMU domains and Arm SMMUv3 Jean-Philippe Brucker
[not found] ` <20181019181158.2395-1-jean-philippe.brucker-5wv7dgnIgG8@public.gmane.org>
2018-10-19 18:11 ` [RFC PATCH 1/6] iommu: Adapt attach/detach_dev() for auxiliary domains Jean-Philippe Brucker
[not found] ` <20181019181158.2395-2-jean-philippe.brucker-5wv7dgnIgG8@public.gmane.org>
2018-10-22 2:32 ` Lu Baolu [this message]
2018-10-19 18:11 ` [RFC PATCH 2/6] drivers core: Add I/O ASID allocator Jean-Philippe Brucker
[not found] ` <20181019181158.2395-3-jean-philippe.brucker-5wv7dgnIgG8@public.gmane.org>
2018-10-22 4:49 ` Lu Baolu
[not found] ` <9c6cd6c1-3569-4251-8344-fc9df0e743bc-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2018-10-22 10:22 ` Raj, Ashok
[not found] ` <20181022102254.GA25399-7RUrO8UaCDyr4tA6zuQqW9h3ngVCH38I@public.gmane.org>
2018-10-23 6:56 ` Lu Baolu
[not found] ` <02006e4f-2acf-6ff8-b695-c54c99509b46-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2018-10-23 22:13 ` Tian, Kevin
2018-11-07 4:53 ` Lu Baolu
[not found] ` <fb2bd5fe-5742-fcd8-b8f0-1885040e8d4f-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2018-11-08 18:51 ` Jean-Philippe Brucker
2018-11-12 14:40 ` Joerg Roedel
[not found] ` <20181112144039.GA25808-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2018-11-21 11:16 ` Jean-Philippe Brucker
[not found] ` <8f17757a-c657-aab9-a6a0-fb0cc9c610a8-5wv7dgnIgG8@public.gmane.org>
2018-11-21 19:10 ` Koenig, Christian
[not found] ` <62f05552-df46-6e12-10ed-820429dfda59-5C7GfCeVMHo@public.gmane.org>
2018-11-22 6:59 ` Tian, Kevin
2018-11-22 8:38 ` Joerg Roedel
2018-11-22 8:44 ` Joerg Roedel
[not found] ` <20181122084429.GB1586-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2018-11-22 11:17 ` Jean-Philippe Brucker
2018-10-19 18:11 ` [RFC PATCH 3/6] iommu/sva: Use external PASID allocator Jean-Philippe Brucker
2018-10-19 18:11 ` [RFC PATCH 4/6] iommu/sva: Support AUXD feature Jean-Philippe Brucker
2018-10-19 18:11 ` [RFC PATCH 5/6] iommu/arm-smmu-v3: Implement detach_dev op Jean-Philippe Brucker
2018-10-19 18:11 ` [RFC PATCH 6/6] iommu/arm-smmu-v3: Add support for auxiliary domains Jean-Philippe Brucker
2018-10-20 3:36 ` [RFC PATCH 0/6] Auxiliary IOMMU domains and Arm SMMUv3 Xu Zaibo
2018-10-22 6:53 ` Tian, Kevin
[not found] ` <AADFC41AFE54684AB9EE6CBC0274A5D19BE0E176-0J0gbvR4kThpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2018-10-22 11:50 ` Robin Murphy
[not found] ` <11f88122-afd3-a34c-3cd4-db681bf5498b-5wv7dgnIgG8@public.gmane.org>
2018-10-22 15:35 ` Jordan Crouse
2018-10-22 18:01 ` Jean-Philippe Brucker
2018-11-06 16:25 ` joro-zLv9SwRftAIdnm+yROfE0A
[not found] ` <20181106162539.4gmkvg57mja3bn7k-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2018-11-07 3:40 ` Lu Baolu
[not found] ` <e22e3631-2ecb-664d-5666-8e0f865dec83-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2018-11-07 16:43 ` joro-zLv9SwRftAIdnm+yROfE0A
[not found] ` <20181107164323.GA19831-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2018-11-07 17:23 ` Alex Williamson
2018-11-21 4:40 ` Lu Baolu
[not found] ` <758bb120-5bc0-1e2d-ccd0-9be0bcc5d8bc-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2018-11-23 11:21 ` joro-zLv9SwRftAIdnm+yROfE0A
[not found] ` <20181123112125.GF1586-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2018-11-25 6:51 ` Lu Baolu
2018-11-26 3:01 ` Tian, Kevin
[not found] ` <AADFC41AFE54684AB9EE6CBC0274A5D19BE68777@SHSMSX101.ccr.corp.intel.com>
[not found] ` <AADFC41AFE54684AB9EE6CBC0274A5D19BE68777-0J0gbvR4kThpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2018-11-26 7:29 ` Tian, Kevin
[not found] ` <AADFC41AFE54684AB9EE6CBC0274A5D19BE689B8-0J0gbvR4kThpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2018-12-07 10:29 ` 'joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org'
[not found] ` <20181207102926.GM16835-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2018-12-10 2:06 ` Tian, Kevin
[not found] ` <AADFC41AFE54684AB9EE6CBC0274A5D19BE95394-0J0gbvR4kThpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2018-12-10 8:57 ` 'joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org'
[not found] ` <20181210085745.GN16835-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2018-12-11 18:34 ` Jean-Philippe Brucker
[not found] ` <4be63d12-fa1c-b180-761b-5e8ceed58545-5wv7dgnIgG8@public.gmane.org>
2018-12-12 9:22 ` 'joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org'
2018-12-12 9:31 ` Tian, Kevin
[not found] ` <AADFC41AFE54684AB9EE6CBC0274A5D19BE9D6CA-0J0gbvR4kThpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2018-12-12 9:54 ` 'joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org'
[not found] ` <20181212095403.GU16835-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2018-12-12 10:03 ` Tian, Kevin
2018-12-10 2:57 ` Lu Baolu
[not found] ` <bf1ee4a3-6d3f-e0db-a02a-1db819843a60-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2018-12-10 8:59 ` 'joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org'
2018-12-11 13:35 ` Jean-Philippe Brucker
[not found] ` <fc173d9f-57e2-dd87-95d0-1c615f2e14e3-5wv7dgnIgG8@public.gmane.org>
2018-12-12 9:29 ` 'joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org'
2018-11-08 18:29 ` Jean-Philippe Brucker
[not found] ` <42949d93-e22c-dd4d-cd49-46efc0b73cdb-5wv7dgnIgG8@public.gmane.org>
2018-11-12 14:55 ` joro-zLv9SwRftAIdnm+yROfE0A
[not found] ` <20181112145541.GB25808-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2018-11-21 19:05 ` Jean-Philippe Brucker
[not found] ` <5dcf9238-62b2-8df6-b378-183ee09c5951-5wv7dgnIgG8@public.gmane.org>
2018-11-23 12:50 ` joro-zLv9SwRftAIdnm+yROfE0A
2018-11-22 8:39 ` Tian, Kevin
[not found] ` <AADFC41AFE54684AB9EE6CBC0274A5D19BE5A7A7-0J0gbvR4kThpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2018-11-23 12:14 ` joro-zLv9SwRftAIdnm+yROfE0A
2018-10-22 10:07 ` Raj, Ashok
[not found] ` <20181021194426.GA11201-7RUrO8UaCDyr4tA6zuQqW9h3ngVCH38I@public.gmane.org>
2018-10-22 16:03 ` Jean-Philippe Brucker
[not found] ` <d45c5222-68e9-1d6e-730b-bb8dbc060586-5wv7dgnIgG8@public.gmane.org>
2018-10-23 17:16 ` Raj, Ashok
[not found] ` <1540314963.21962.20.camel-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2018-10-23 22:08 ` Tian, Kevin
2018-10-26 3:00 ` Lu Baolu
2018-10-22 16:48 ` Jordan Crouse
[not found] ` <20181022164834.GH26762-9PYrDHPZ2Orvke4nUoYGnHL1okKdlPRT@public.gmane.org>
2018-11-02 3:19 ` 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=f757bbfb-6a04-0560-87e1-6544a92dab91@linux.intel.com \
--to=baolu.lu-vuqaysv1563yd54fqh9/ca@public.gmane.org \
--cc=alex.williamson-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org \
--cc=christian.koenig-5C7GfCeVMHo@public.gmane.org \
--cc=gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r@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=rafael-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org \
--cc=robin.murphy-5wv7dgnIgG8@public.gmane.org \
--cc=will.deacon-5wv7dgnIgG8@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).