From: Robin Murphy <robin.murphy-5wv7dgnIgG8@public.gmane.org>
To: Joerg Roedel <joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>,
"iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org"
<iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org>
Cc: "jroedel-l3A5Bk7waGM@public.gmane.org"
<jroedel-l3A5Bk7waGM@public.gmane.org>,
Laurent Pinchart
<laurent.pinchart-ryLnwIuWjnjg/C1BVhZhaw@public.gmane.org>,
Heiko Stuebner <heiko-4mtYJXux2i+zQB+pC5nmwQ@public.gmane.org>,
Will Deacon <Will.Deacon-5wv7dgnIgG8@public.gmane.org>,
"linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org"
<linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
Thierry Reding
<thierry.reding-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>,
Kukjin Kim <kgene-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>,
David Woodhouse <dwmw2-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org>
Subject: Re: [PATCH 06/22] iommu: Allocate a default domain for iommu groups
Date: Thu, 11 Jun 2015 18:33:02 +0100 [thread overview]
Message-ID: <5579C64E.3020100@arm.com> (raw)
In-Reply-To: <1432831305-11126-7-git-send-email-joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
Hi Joerg,
On 28/05/15 17:41, Joerg Roedel wrote:
> From: Joerg Roedel <jroedel-l3A5Bk7waGM@public.gmane.org>
>
> The default domain will be used (if supported by the iommu
> driver) when the devices in the iommu group are not attached
> to any other domain.
>
> Signed-off-by: Joerg Roedel <jroedel-l3A5Bk7waGM@public.gmane.org>
> ---
> drivers/iommu/iommu.c | 32 ++++++++++++++++++++++++++++----
> 1 file changed, 28 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
> index d69e0ca..fbfc015 100644
> --- a/drivers/iommu/iommu.c
> +++ b/drivers/iommu/iommu.c
> @@ -51,6 +51,7 @@ struct iommu_group {
> void (*iommu_data_release)(void *iommu_data);
> char *name;
> int id;
> + struct iommu_domain *default_domain;
> };
>
> struct iommu_device {
> @@ -75,6 +76,9 @@ struct iommu_group_attribute iommu_group_attr_##_name = \
> #define to_iommu_group(_kobj) \
> container_of(_kobj, struct iommu_group, kobj)
>
> +static struct iommu_domain *__iommu_domain_alloc(struct bus_type *bus,
> + unsigned type);
> +
> static ssize_t iommu_group_attr_show(struct kobject *kobj,
> struct attribute *__attr, char *buf)
> {
> @@ -137,6 +141,9 @@ static void iommu_group_release(struct kobject *kobj)
> ida_remove(&iommu_group_ida, group->id);
> mutex_unlock(&iommu_group_mutex);
>
> + if (group->default_domain)
> + iommu_domain_free(group->default_domain);
> +
> kfree(group->name);
> kfree(group);
> }
> @@ -701,7 +708,18 @@ static struct iommu_group *iommu_group_get_for_pci_dev(struct pci_dev *pdev)
> return group;
>
> /* No shared group found, allocate new */
> - return iommu_group_alloc();
> + group = iommu_group_alloc();
> + if (group) {
> + /*
> + * Try to allocate a default domain - needs support from the
> + * IOMMU driver.
> + */
> + group->default_domain = __iommu_domain_alloc(pdev->dev.bus,
> + IOMMU_DOMAIN_DMA);
> + group->domain = group->default_domain;
> + }
> +
> + return group;
> }
>
> /**
> @@ -922,22 +940,28 @@ void iommu_set_fault_handler(struct iommu_domain *domain,
> }
> EXPORT_SYMBOL_GPL(iommu_set_fault_handler);
>
> -struct iommu_domain *iommu_domain_alloc(struct bus_type *bus)
> +static struct iommu_domain *__iommu_domain_alloc(struct bus_type *bus,
> + unsigned type)
I'd be happier if we passed the iommu_ops in here...
> {
> struct iommu_domain *domain;
>
> if (bus == NULL || bus->iommu_ops == NULL)
> return NULL;
>
> - domain = bus->iommu_ops->domain_alloc(IOMMU_DOMAIN_UNMANAGED);
> + domain = bus->iommu_ops->domain_alloc(type);
> if (!domain)
> return NULL;
>
> domain->ops = bus->iommu_ops;
> - domain->type = IOMMU_DOMAIN_UNMANAGED;
> + domain->type = type;
>
> return domain;
> }
> +
> +struct iommu_domain *iommu_domain_alloc(struct bus_type *bus)
> +{
..having pulled them out of the bus here.
> + return __iommu_domain_alloc(bus, IOMMU_DOMAIN_UNMANAGED);
> +}
> EXPORT_SYMBOL_GPL(iommu_domain_alloc);
>
> void iommu_domain_free(struct iommu_domain *domain)
>
Even if it's only to symbolically inch us closer to having some other
solution for platform bus devices. The SMMU page size debate is one
thing, but it's really only a subtle case of the "IOMMU instances"
problem. Once there are two different IOMMU drivers in the system each
serving a subset of platform devices, how can we make sure the domain
allocated here is wrapped in the right driver-private struct? I've had a
try with making iommu_ops per-instance, but even that doesn't work in
this case.
Robin.
WARNING: multiple messages have this Message-ID (diff)
From: Robin Murphy <robin.murphy@arm.com>
To: Joerg Roedel <joro@8bytes.org>,
"iommu@lists.linux-foundation.org"
<iommu@lists.linux-foundation.org>
Cc: Will Deacon <Will.Deacon@arm.com>, Kukjin Kim <kgene@kernel.org>,
David Woodhouse <dwmw2@infradead.org>,
Heiko Stuebner <heiko@sntech.de>, Hiroshi Doyu <hdoyu@nvidia.com>,
Thierry Reding <thierry.reding@gmail.com>,
Alex Williamson <alex.williamson@redhat.com>,
Laurent Pinchart <laurent.pinchart@ideasonboard.com>,
Oded Gabbay <oded.gabbay@gmail.com>,
"jroedel@suse.de" <jroedel@suse.de>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH 06/22] iommu: Allocate a default domain for iommu groups
Date: Thu, 11 Jun 2015 18:33:02 +0100 [thread overview]
Message-ID: <5579C64E.3020100@arm.com> (raw)
In-Reply-To: <1432831305-11126-7-git-send-email-joro@8bytes.org>
Hi Joerg,
On 28/05/15 17:41, Joerg Roedel wrote:
> From: Joerg Roedel <jroedel@suse.de>
>
> The default domain will be used (if supported by the iommu
> driver) when the devices in the iommu group are not attached
> to any other domain.
>
> Signed-off-by: Joerg Roedel <jroedel@suse.de>
> ---
> drivers/iommu/iommu.c | 32 ++++++++++++++++++++++++++++----
> 1 file changed, 28 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
> index d69e0ca..fbfc015 100644
> --- a/drivers/iommu/iommu.c
> +++ b/drivers/iommu/iommu.c
> @@ -51,6 +51,7 @@ struct iommu_group {
> void (*iommu_data_release)(void *iommu_data);
> char *name;
> int id;
> + struct iommu_domain *default_domain;
> };
>
> struct iommu_device {
> @@ -75,6 +76,9 @@ struct iommu_group_attribute iommu_group_attr_##_name = \
> #define to_iommu_group(_kobj) \
> container_of(_kobj, struct iommu_group, kobj)
>
> +static struct iommu_domain *__iommu_domain_alloc(struct bus_type *bus,
> + unsigned type);
> +
> static ssize_t iommu_group_attr_show(struct kobject *kobj,
> struct attribute *__attr, char *buf)
> {
> @@ -137,6 +141,9 @@ static void iommu_group_release(struct kobject *kobj)
> ida_remove(&iommu_group_ida, group->id);
> mutex_unlock(&iommu_group_mutex);
>
> + if (group->default_domain)
> + iommu_domain_free(group->default_domain);
> +
> kfree(group->name);
> kfree(group);
> }
> @@ -701,7 +708,18 @@ static struct iommu_group *iommu_group_get_for_pci_dev(struct pci_dev *pdev)
> return group;
>
> /* No shared group found, allocate new */
> - return iommu_group_alloc();
> + group = iommu_group_alloc();
> + if (group) {
> + /*
> + * Try to allocate a default domain - needs support from the
> + * IOMMU driver.
> + */
> + group->default_domain = __iommu_domain_alloc(pdev->dev.bus,
> + IOMMU_DOMAIN_DMA);
> + group->domain = group->default_domain;
> + }
> +
> + return group;
> }
>
> /**
> @@ -922,22 +940,28 @@ void iommu_set_fault_handler(struct iommu_domain *domain,
> }
> EXPORT_SYMBOL_GPL(iommu_set_fault_handler);
>
> -struct iommu_domain *iommu_domain_alloc(struct bus_type *bus)
> +static struct iommu_domain *__iommu_domain_alloc(struct bus_type *bus,
> + unsigned type)
I'd be happier if we passed the iommu_ops in here...
> {
> struct iommu_domain *domain;
>
> if (bus == NULL || bus->iommu_ops == NULL)
> return NULL;
>
> - domain = bus->iommu_ops->domain_alloc(IOMMU_DOMAIN_UNMANAGED);
> + domain = bus->iommu_ops->domain_alloc(type);
> if (!domain)
> return NULL;
>
> domain->ops = bus->iommu_ops;
> - domain->type = IOMMU_DOMAIN_UNMANAGED;
> + domain->type = type;
>
> return domain;
> }
> +
> +struct iommu_domain *iommu_domain_alloc(struct bus_type *bus)
> +{
..having pulled them out of the bus here.
> + return __iommu_domain_alloc(bus, IOMMU_DOMAIN_UNMANAGED);
> +}
> EXPORT_SYMBOL_GPL(iommu_domain_alloc);
>
> void iommu_domain_free(struct iommu_domain *domain)
>
Even if it's only to symbolically inch us closer to having some other
solution for platform bus devices. The SMMU page size debate is one
thing, but it's really only a subtle case of the "IOMMU instances"
problem. Once there are two different IOMMU drivers in the system each
serving a subset of platform devices, how can we make sure the domain
allocated here is wrapped in the right driver-private struct? I've had a
try with making iommu_ops per-instance, but even that doesn't work in
this case.
Robin.
next prev parent reply other threads:[~2015-06-11 17:33 UTC|newest]
Thread overview: 69+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-05-28 16:41 [PATCH 00/22 v2] Introduce default domains for iommu groups Joerg Roedel
2015-05-28 16:41 ` Joerg Roedel
[not found] ` <1432831305-11126-1-git-send-email-joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2015-05-28 16:41 ` [PATCH 01/22] iommu: Remove function name from pr_fmt() Joerg Roedel
2015-05-28 16:41 ` Joerg Roedel
2015-05-28 16:41 ` [PATCH 02/22] iommu: Add a few printk messages to group handling code Joerg Roedel
2015-05-28 16:41 ` Joerg Roedel
2015-05-28 16:41 ` [PATCH 03/22] iommu: Propagate error in add_iommu_group Joerg Roedel
2015-05-28 16:41 ` Joerg Roedel
[not found] ` <1432831305-11126-4-git-send-email-joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2015-06-29 9:28 ` Heiko Stübner
2015-06-29 9:28 ` Heiko Stübner
2015-06-29 9:37 ` Joerg Roedel
2015-06-29 9:37 ` Joerg Roedel
2015-06-29 14:06 ` Joerg Roedel
2015-06-29 14:06 ` Joerg Roedel
[not found] ` <20150629140637.GK18569-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2015-06-29 19:55 ` Heiko Stübner
2015-06-29 19:55 ` Heiko Stübner
2015-05-28 16:41 ` [PATCH 04/22] iommu: Clean up after a failed bus initialization Joerg Roedel
2015-05-28 16:41 ` Joerg Roedel
2015-05-28 16:41 ` [PATCH 05/22] iommu: Call remove_device call-back after driver release Joerg Roedel
2015-05-28 16:41 ` Joerg Roedel
2015-05-28 16:41 ` [PATCH 06/22] iommu: Allocate a default domain for iommu groups Joerg Roedel
2015-05-28 16:41 ` Joerg Roedel
[not found] ` <1432831305-11126-7-git-send-email-joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2015-06-11 17:33 ` Robin Murphy [this message]
2015-06-11 17:33 ` Robin Murphy
2015-06-11 17:33 ` Robin Murphy
2015-06-11 17:33 ` Robin Murphy
2015-05-28 16:41 ` [PATCH 07/22] iommu: Limit iommu_attach/detach_device to devices with their own group Joerg Roedel
2015-05-28 16:41 ` Joerg Roedel
2015-05-28 16:41 ` [PATCH 08/22] iommu: Make sure a device is always attached to a domain Joerg Roedel
2015-05-28 16:41 ` Joerg Roedel
[not found] ` <1432831305-11126-9-git-send-email-joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2015-06-11 17:41 ` Robin Murphy
2015-06-11 17:41 ` Robin Murphy
2015-05-28 16:41 ` [PATCH 09/22] iommu: Add iommu_get_domain_for_dev function Joerg Roedel
2015-05-28 16:41 ` Joerg Roedel
2015-05-28 16:41 ` [PATCH 10/22] iommu: Introduce direct mapped region handling Joerg Roedel
2015-05-28 16:41 ` Joerg Roedel
[not found] ` <1432831305-11126-11-git-send-email-joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2015-06-05 14:17 ` Will Deacon
2015-06-05 14:17 ` Will Deacon
[not found] ` <20150605141749.GA7420-5wv7dgnIgG8@public.gmane.org>
2015-06-05 14:32 ` jroedel-l3A5Bk7waGM
2015-06-05 14:32 ` jroedel
2015-06-11 19:22 ` Robin Murphy
2015-06-11 19:22 ` Robin Murphy
2015-05-28 16:41 ` [PATCH 11/22] iommu: Create direct mappings in default domains Joerg Roedel
2015-05-28 16:41 ` Joerg Roedel
2015-05-28 16:41 ` [PATCH 12/22] iommu: Add function to query the default domain of a group Joerg Roedel
2015-05-28 16:41 ` Joerg Roedel
2015-05-28 16:41 ` [PATCH 13/22] iommu: Introduce iommu_request_dm_for_dev() Joerg Roedel
2015-05-28 16:41 ` Joerg Roedel
2015-05-28 16:41 ` [PATCH 14/22] iommu/amd: Implement dm_region call-backs Joerg Roedel
2015-05-28 16:41 ` Joerg Roedel
2015-05-28 16:41 ` [PATCH 15/22] iommu/amd: Use default domain if available for DMA-API Joerg Roedel
2015-05-28 16:41 ` Joerg Roedel
2015-05-28 16:41 ` [PATCH 16/22] iommu/amd: Implement add_device and remove_device Joerg Roedel
2015-05-28 16:41 ` Joerg Roedel
2015-05-28 16:41 ` [PATCH 17/22] iommu/amd: Support IOMMU_DOMAIN_DMA type allocation Joerg Roedel
2015-05-28 16:41 ` Joerg Roedel
2015-05-28 16:41 ` [PATCH 18/22] iommu/amd: Support IOMMU_DOMAIN_IDENTITY " Joerg Roedel
2015-05-28 16:41 ` Joerg Roedel
2015-05-28 16:41 ` [PATCH 19/22] iommu/amd: Put IOMMUv2 devices in a direct mapped domain Joerg Roedel
2015-05-28 16:41 ` Joerg Roedel
2015-05-28 16:41 ` [PATCH 20/22] iommu/amd: Get rid of device_dma_ops_init() Joerg Roedel
2015-05-28 16:41 ` Joerg Roedel
2015-05-28 16:41 ` [PATCH 21/22] iommu/amd: Remove unused fields from struct dma_ops_domain Joerg Roedel
2015-05-28 16:41 ` Joerg Roedel
2015-05-28 16:41 ` [PATCH 22/22] iommu/amd: Propagate errors from amd_iommu_init_api Joerg Roedel
2015-05-28 16:41 ` Joerg Roedel
2015-06-05 14:22 ` [PATCH 00/22 v2] Introduce default domains for iommu groups Will Deacon
2015-06-05 14:22 ` Will Deacon
2015-06-05 14:35 ` jroedel
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=5579C64E.3020100@arm.com \
--to=robin.murphy-5wv7dgnigg8@public.gmane.org \
--cc=Will.Deacon-5wv7dgnIgG8@public.gmane.org \
--cc=dwmw2-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org \
--cc=heiko-4mtYJXux2i+zQB+pC5nmwQ@public.gmane.org \
--cc=iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org \
--cc=joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org \
--cc=jroedel-l3A5Bk7waGM@public.gmane.org \
--cc=kgene-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org \
--cc=laurent.pinchart-ryLnwIuWjnjg/C1BVhZhaw@public.gmane.org \
--cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=thierry.reding-Re5JQEeQqe8AvxtiuMwx3w@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 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.