From: Auger Eric <eric.auger@redhat.com>
To: Robin Murphy <robin.murphy@arm.com>,
eric.auger.pro@gmail.com, christoffer.dall@linaro.org,
marc.zyngier@arm.com, alex.williamson@redhat.com,
will.deacon@arm.com, joro@8bytes.org, tglx@linutronix.de,
jason@lakedaemon.net, linux-arm-kernel@lists.infradead.org
Cc: kvm@vger.kernel.org, drjones@redhat.com,
linux-kernel@vger.kernel.org, pranav.sawargaonkar@gmail.com,
iommu@lists.linux-foundation.org, punit.agrawal@arm.com,
diana.craciun@nxp.com
Subject: Re: [RFC v3 06/10] iommu: iommu_get_group_resv_regions
Date: Wed, 7 Dec 2016 16:13:46 +0100 [thread overview]
Message-ID: <c2a635f7-6b2b-d8f8-12c3-7759cbd7da43@redhat.com> (raw)
In-Reply-To: <8eb9662b-d677-546c-feb8-32fe5bd624f2@arm.com>
Hi Robin,
On 06/12/2016 19:13, Robin Murphy wrote:
> On 15/11/16 13:09, Eric Auger wrote:
>> Introduce iommu_get_group_resv_regions whose role consists in
>> enumerating all devices from the group and collecting their
>> reserved regions. It checks duplicates.
>>
>> Signed-off-by: Eric Auger <eric.auger@redhat.com>
>>
>> ---
>>
>> - we do not move list elements from device to group list since
>> the iommu_put_resv_regions() could not be called.
>> - at the moment I did not introduce any iommu_put_group_resv_regions
>> since it simply consists in voiding/freeing the list
>> ---
>> drivers/iommu/iommu.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++
>> include/linux/iommu.h | 8 ++++++++
>> 2 files changed, 61 insertions(+)
>>
>> diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
>> index a4530ad..e0fbcc5 100644
>> --- a/drivers/iommu/iommu.c
>> +++ b/drivers/iommu/iommu.c
>> @@ -133,6 +133,59 @@ static ssize_t iommu_group_show_name(struct iommu_group *group, char *buf)
>> return sprintf(buf, "%s\n", group->name);
>> }
>>
>> +static bool iommu_resv_region_present(struct iommu_resv_region *region,
>> + struct list_head *head)
>> +{
>> + struct iommu_resv_region *entry;
>> +
>> + list_for_each_entry(entry, head, list) {
>> + if ((region->start == entry->start) &&
>> + (region->length == entry->length) &&
>> + (region->prot == entry->prot))
>> + return true;
>> + }
>> + return false;
>> +}
>> +
>> +static int
>> +iommu_insert_device_resv_regions(struct list_head *dev_resv_regions,
>> + struct list_head *group_resv_regions)
>> +{
>> + struct iommu_resv_region *entry, *region;
>> +
>> + list_for_each_entry(entry, dev_resv_regions, list) {
>> + if (iommu_resv_region_present(entry, group_resv_regions))
>> + continue;
>
> In the case of overlapping regions which _aren't_ an exact match, would
> it be better to expand the existing one rather than leave the caller to
> sort it out? It seems a bit inconsistent to handle only the one case here.
Well this is mostly here to avoid inserting several times the same PCIe
host bridge windows (retrieved from several PCIe EP attached to the same
bridge). I don't know if it is worth making things over-complicated. Do
you have another situation in mind?
>
>> + region = iommu_alloc_resv_region(entry->start, entry->length,
>> + entry->prot);
>> + if (!region)
>> + return -ENOMEM;
>> +
>> + list_add_tail(®ion->list, group_resv_regions);
>> + }
>> + return 0;
>> +}
>> +
>> +int iommu_get_group_resv_regions(struct iommu_group *group,
>> + struct list_head *head)
>> +{
>> + struct iommu_device *device;
>> + int ret = 0;
>> +
>> + list_for_each_entry(device, &group->devices, list) {
>
> Should we not be taking the group mutex around this?
Yes you're right.
Thanks
Eric
>
> Robin.
>
>> + struct list_head dev_resv_regions;
>> +
>> + INIT_LIST_HEAD(&dev_resv_regions);
>> + iommu_get_resv_regions(device->dev, &dev_resv_regions);
>> + ret = iommu_insert_device_resv_regions(&dev_resv_regions, head);
>> + iommu_put_resv_regions(device->dev, &dev_resv_regions);
>> + if (ret)
>> + break;
>> + }
>> + return ret;
>> +}
>> +EXPORT_SYMBOL_GPL(iommu_get_group_resv_regions);
>> +
>> static IOMMU_GROUP_ATTR(name, S_IRUGO, iommu_group_show_name, NULL);
>>
>> static void iommu_group_release(struct kobject *kobj)
>> diff --git a/include/linux/iommu.h b/include/linux/iommu.h
>> index 0aea877..0f7ae2c 100644
>> --- a/include/linux/iommu.h
>> +++ b/include/linux/iommu.h
>> @@ -243,6 +243,8 @@ extern void iommu_set_fault_handler(struct iommu_domain *domain,
>> extern int iommu_request_dm_for_dev(struct device *dev);
>> extern struct iommu_resv_region *
>> iommu_alloc_resv_region(phys_addr_t start, size_t length, unsigned int prot);
>> +extern int iommu_get_group_resv_regions(struct iommu_group *group,
>> + struct list_head *head);
>>
>> extern int iommu_attach_group(struct iommu_domain *domain,
>> struct iommu_group *group);
>> @@ -462,6 +464,12 @@ static inline void iommu_put_resv_regions(struct device *dev,
>> return NULL;
>> }
>>
>> +static inline int iommu_get_group_resv_regions(struct iommu_group *group,
>> + struct list_head *head)
>> +{
>> + return -ENODEV;
>> +}
>> +
>> static inline int iommu_request_dm_for_dev(struct device *dev)
>> {
>> return -ENODEV;
>>
>
> --
> To unsubscribe from this list: send the line "unsubscribe kvm" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
next prev parent reply other threads:[~2016-12-07 15:14 UTC|newest]
Thread overview: 45+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-11-15 13:09 [RFC v3 00/10] KVM PCIe/MSI passthrough on ARM/ARM64 and IOVA reserved regions Eric Auger
2016-11-15 13:09 ` [RFC v3 01/10] iommu/dma: Allow MSI-only cookies Eric Auger
2016-11-15 13:09 ` [RFC v3 02/10] iommu: Rename iommu_dm_regions into iommu_resv_regions Eric Auger
2016-12-06 17:30 ` Robin Murphy
2016-11-15 13:09 ` [RFC v3 03/10] iommu: Add new reserved IOMMU attributes Eric Auger
2016-12-06 17:28 ` Robin Murphy
2016-11-15 13:09 ` [RFC v3 04/10] iommu: iommu_alloc_resv_region Eric Auger
2016-11-29 16:11 ` Joerg Roedel
2016-11-30 9:41 ` Auger Eric
2016-12-06 17:30 ` Robin Murphy
2016-11-15 13:09 ` [RFC v3 05/10] iommu: Do not map reserved regions Eric Auger
2016-12-06 17:36 ` Robin Murphy
2016-12-07 15:15 ` Auger Eric
2016-11-15 13:09 ` [RFC v3 06/10] iommu: iommu_get_group_resv_regions Eric Auger
2016-12-06 18:13 ` Robin Murphy
2016-12-07 15:13 ` Auger Eric [this message]
2016-11-15 13:09 ` [RFC v3 07/10] iommu: Implement reserved_regions iommu-group sysfs file Eric Auger
2016-11-15 13:09 ` [RFC v3 08/10] iommu/vt-d: Implement reserved region get/put callbacks Eric Auger
2016-11-15 13:09 ` [RFC v3 09/10] iommu/arm-smmu: " Eric Auger
2016-12-06 18:55 ` Robin Murphy
2016-12-07 15:02 ` Auger Eric
2016-12-07 18:24 ` Robin Murphy
2016-12-08 7:57 ` Auger Eric
2016-11-15 13:09 ` [RFC v3 10/10] vfio/type1: Get MSI cookie Eric Auger
2016-11-18 5:34 ` [RFC v3 00/10] KVM PCIe/MSI passthrough on ARM/ARM64 and IOVA reserved regions Bharat Bhushan
2016-11-18 8:33 ` Auger Eric
2016-11-30 9:49 ` Auger Eric
2016-11-30 10:04 ` Ganapatrao Kulkarni
2016-11-30 10:14 ` Auger Eric
2016-11-30 10:52 ` Ganapatrao Kulkarni
2016-11-30 13:57 ` Robin Murphy
2016-11-30 10:37 ` Will Deacon
2016-11-30 14:08 ` Auger Eric
2016-11-30 14:41 ` Robin Murphy
2016-12-07 18:52 ` Shanker Donthineni
2016-12-08 7:34 ` Auger Eric
2016-12-08 3:56 ` Bharat Bhushan
2016-12-08 9:36 ` Auger Eric
2016-12-08 13:14 ` Robin Murphy
2016-12-08 13:36 ` Auger Eric
2016-12-08 15:46 ` Robin Murphy
2016-12-08 17:01 ` Alex Williamson
2016-12-08 18:42 ` Robin Murphy
2016-12-11 2:05 ` Don Dutile
2016-12-12 8:12 ` 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=c2a635f7-6b2b-d8f8-12c3-7759cbd7da43@redhat.com \
--to=eric.auger@redhat.com \
--cc=alex.williamson@redhat.com \
--cc=christoffer.dall@linaro.org \
--cc=diana.craciun@nxp.com \
--cc=drjones@redhat.com \
--cc=eric.auger.pro@gmail.com \
--cc=iommu@lists.linux-foundation.org \
--cc=jason@lakedaemon.net \
--cc=joro@8bytes.org \
--cc=kvm@vger.kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=marc.zyngier@arm.com \
--cc=pranav.sawargaonkar@gmail.com \
--cc=punit.agrawal@arm.com \
--cc=robin.murphy@arm.com \
--cc=tglx@linutronix.de \
--cc=will.deacon@arm.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®