From: Eric Auger <eric.auger@redhat.com> To: eric.auger@redhat.com, eric.auger.pro@gmail.com, christoffer.dall@linaro.org, marc.zyngier@arm.com, robin.murphy@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: [RFC 5/8] vfio/type1: Introduce RESV_IOVA_RANGE capability Date: Thu, 3 Nov 2016 21:39:35 +0000 [thread overview] Message-ID: <1478209178-3009-6-git-send-email-eric.auger@redhat.com> (raw) In-Reply-To: <1478209178-3009-1-git-send-email-eric.auger@redhat.com> This patch allows the user-space to retrieve the reserved IOVA range(s), if any. The implementation is based on capability chains, now also added to VFIO_IOMMU_GET_INFO. Signed-off-by: Eric Auger <eric.auger@redhat.com> --- --- drivers/vfio/vfio_iommu_type1.c | 63 ++++++++++++++++++++++++++++++++++++++++- include/uapi/linux/vfio.h | 16 ++++++++++- 2 files changed, 77 insertions(+), 2 deletions(-) diff --git a/drivers/vfio/vfio_iommu_type1.c b/drivers/vfio/vfio_iommu_type1.c index 2ba1942..0d53ac1 100644 --- a/drivers/vfio/vfio_iommu_type1.c +++ b/drivers/vfio/vfio_iommu_type1.c @@ -965,6 +965,42 @@ static int vfio_domains_have_iommu_cache(struct vfio_iommu *iommu) return ret; } +static int add_resv_iova_range(struct vfio_info_cap *caps, u64 start, u64 end) +{ + struct vfio_iommu_type1_info_cap_resv_iova_range *cap; + struct vfio_info_cap_header *header; + + header = vfio_info_cap_add(caps, sizeof(*cap), + VFIO_IOMMU_TYPE1_INFO_CAP_RESV_IOVA_RANGE, 1); + + if (IS_ERR(header)) + return PTR_ERR(header); + + cap = container_of(header, + struct vfio_iommu_type1_info_cap_resv_iova_range, + header); + + cap->start = start; + cap->end = end; + return 0; +} + +static int build_resv_iova_range_caps(struct vfio_iommu *iommu, + struct vfio_info_cap *caps) +{ + struct vfio_domain *domain; + struct iommu_reserved_region *resv; + + domain = list_first_entry(&iommu->domain_list, + struct vfio_domain, next); + + iommu_reserved_region_for_each(resv, domain->domain) + add_resv_iova_range(caps, resv->start, + resv->start + resv->length - 1); + + return 0; +} + static long vfio_iommu_type1_ioctl(void *iommu_data, unsigned int cmd, unsigned long arg) { @@ -986,8 +1022,10 @@ static long vfio_iommu_type1_ioctl(void *iommu_data, } } else if (cmd == VFIO_IOMMU_GET_INFO) { struct vfio_iommu_type1_info info; + struct vfio_info_cap caps = { .buf = NULL, .size = 0 }; + int ret; - minsz = offsetofend(struct vfio_iommu_type1_info, iova_pgsizes); + minsz = offsetofend(struct vfio_iommu_type1_info, cap_offset); if (copy_from_user(&info, (void __user *)arg, minsz)) return -EFAULT; @@ -999,6 +1037,29 @@ static long vfio_iommu_type1_ioctl(void *iommu_data, info.iova_pgsizes = vfio_pgsize_bitmap(iommu); + ret = build_resv_iova_range_caps(iommu, &caps); + if (ret) + return ret; + + if (caps.size) { + info.flags |= VFIO_IOMMU_INFO_CAPS; + if (info.argsz < sizeof(info) + caps.size) { + info.argsz = sizeof(info) + caps.size; + info.cap_offset = 0; + } else { + vfio_info_cap_shift(&caps, sizeof(info)); + if (copy_to_user((void __user *)arg + + sizeof(info), caps.buf, + caps.size)) { + kfree(caps.buf); + return -EFAULT; + } + info.cap_offset = sizeof(info); + } + + kfree(caps.buf); + } + return copy_to_user((void __user *)arg, &info, minsz) ? -EFAULT : 0; diff --git a/include/uapi/linux/vfio.h b/include/uapi/linux/vfio.h index 255a211..ae96f2c 100644 --- a/include/uapi/linux/vfio.h +++ b/include/uapi/linux/vfio.h @@ -488,7 +488,21 @@ struct vfio_iommu_type1_info { __u32 argsz; __u32 flags; #define VFIO_IOMMU_INFO_PGSIZES (1 << 0) /* supported page sizes info */ - __u64 iova_pgsizes; /* Bitmap of supported page sizes */ +#define VFIO_IOMMU_INFO_CAPS (1 << 1) /* Info supports caps */ + __u64 iova_pgsizes; /* Bitmap of supported page sizes */ + __u32 cap_offset; /* Offset within info struct of first cap */ + __u32 __resv; +}; + +/* + * The RESV_IOVA_RANGE capability allows to report the reserved IOVA range(s), + * if any. + */ +#define VFIO_IOMMU_TYPE1_INFO_CAP_RESV_IOVA_RANGE 1 +struct vfio_iommu_type1_info_cap_resv_iova_range { + struct vfio_info_cap_header header; + __u64 start; + __u64 end; }; #define VFIO_IOMMU_GET_INFO _IO(VFIO_TYPE, VFIO_BASE + 12) -- 1.9.1
WARNING: multiple messages have this Message-ID (diff)
From: Eric Auger <eric.auger-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> To: eric.auger-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org, eric.auger.pro-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org, christoffer.dall-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org, marc.zyngier-5wv7dgnIgG8@public.gmane.org, robin.murphy-5wv7dgnIgG8@public.gmane.org, alex.williamson-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org, will.deacon-5wv7dgnIgG8@public.gmane.org, joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org, tglx-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org, jason-NLaQJdtUoK4Be96aLqz0jA@public.gmane.org, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org Cc: drjones-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org, kvm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, punit.agrawal-5wv7dgnIgG8@public.gmane.org, linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org, pranav.sawargaonkar-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org Subject: [RFC 5/8] vfio/type1: Introduce RESV_IOVA_RANGE capability Date: Thu, 3 Nov 2016 21:39:35 +0000 [thread overview] Message-ID: <1478209178-3009-6-git-send-email-eric.auger@redhat.com> (raw) In-Reply-To: <1478209178-3009-1-git-send-email-eric.auger-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> This patch allows the user-space to retrieve the reserved IOVA range(s), if any. The implementation is based on capability chains, now also added to VFIO_IOMMU_GET_INFO. Signed-off-by: Eric Auger <eric.auger-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> --- --- drivers/vfio/vfio_iommu_type1.c | 63 ++++++++++++++++++++++++++++++++++++++++- include/uapi/linux/vfio.h | 16 ++++++++++- 2 files changed, 77 insertions(+), 2 deletions(-) diff --git a/drivers/vfio/vfio_iommu_type1.c b/drivers/vfio/vfio_iommu_type1.c index 2ba1942..0d53ac1 100644 --- a/drivers/vfio/vfio_iommu_type1.c +++ b/drivers/vfio/vfio_iommu_type1.c @@ -965,6 +965,42 @@ static int vfio_domains_have_iommu_cache(struct vfio_iommu *iommu) return ret; } +static int add_resv_iova_range(struct vfio_info_cap *caps, u64 start, u64 end) +{ + struct vfio_iommu_type1_info_cap_resv_iova_range *cap; + struct vfio_info_cap_header *header; + + header = vfio_info_cap_add(caps, sizeof(*cap), + VFIO_IOMMU_TYPE1_INFO_CAP_RESV_IOVA_RANGE, 1); + + if (IS_ERR(header)) + return PTR_ERR(header); + + cap = container_of(header, + struct vfio_iommu_type1_info_cap_resv_iova_range, + header); + + cap->start = start; + cap->end = end; + return 0; +} + +static int build_resv_iova_range_caps(struct vfio_iommu *iommu, + struct vfio_info_cap *caps) +{ + struct vfio_domain *domain; + struct iommu_reserved_region *resv; + + domain = list_first_entry(&iommu->domain_list, + struct vfio_domain, next); + + iommu_reserved_region_for_each(resv, domain->domain) + add_resv_iova_range(caps, resv->start, + resv->start + resv->length - 1); + + return 0; +} + static long vfio_iommu_type1_ioctl(void *iommu_data, unsigned int cmd, unsigned long arg) { @@ -986,8 +1022,10 @@ static long vfio_iommu_type1_ioctl(void *iommu_data, } } else if (cmd == VFIO_IOMMU_GET_INFO) { struct vfio_iommu_type1_info info; + struct vfio_info_cap caps = { .buf = NULL, .size = 0 }; + int ret; - minsz = offsetofend(struct vfio_iommu_type1_info, iova_pgsizes); + minsz = offsetofend(struct vfio_iommu_type1_info, cap_offset); if (copy_from_user(&info, (void __user *)arg, minsz)) return -EFAULT; @@ -999,6 +1037,29 @@ static long vfio_iommu_type1_ioctl(void *iommu_data, info.iova_pgsizes = vfio_pgsize_bitmap(iommu); + ret = build_resv_iova_range_caps(iommu, &caps); + if (ret) + return ret; + + if (caps.size) { + info.flags |= VFIO_IOMMU_INFO_CAPS; + if (info.argsz < sizeof(info) + caps.size) { + info.argsz = sizeof(info) + caps.size; + info.cap_offset = 0; + } else { + vfio_info_cap_shift(&caps, sizeof(info)); + if (copy_to_user((void __user *)arg + + sizeof(info), caps.buf, + caps.size)) { + kfree(caps.buf); + return -EFAULT; + } + info.cap_offset = sizeof(info); + } + + kfree(caps.buf); + } + return copy_to_user((void __user *)arg, &info, minsz) ? -EFAULT : 0; diff --git a/include/uapi/linux/vfio.h b/include/uapi/linux/vfio.h index 255a211..ae96f2c 100644 --- a/include/uapi/linux/vfio.h +++ b/include/uapi/linux/vfio.h @@ -488,7 +488,21 @@ struct vfio_iommu_type1_info { __u32 argsz; __u32 flags; #define VFIO_IOMMU_INFO_PGSIZES (1 << 0) /* supported page sizes info */ - __u64 iova_pgsizes; /* Bitmap of supported page sizes */ +#define VFIO_IOMMU_INFO_CAPS (1 << 1) /* Info supports caps */ + __u64 iova_pgsizes; /* Bitmap of supported page sizes */ + __u32 cap_offset; /* Offset within info struct of first cap */ + __u32 __resv; +}; + +/* + * The RESV_IOVA_RANGE capability allows to report the reserved IOVA range(s), + * if any. + */ +#define VFIO_IOMMU_TYPE1_INFO_CAP_RESV_IOVA_RANGE 1 +struct vfio_iommu_type1_info_cap_resv_iova_range { + struct vfio_info_cap_header header; + __u64 start; + __u64 end; }; #define VFIO_IOMMU_GET_INFO _IO(VFIO_TYPE, VFIO_BASE + 12) -- 1.9.1
next prev parent reply other threads:[~2016-11-03 21:40 UTC|newest] Thread overview: 119+ messages / expand[flat|nested] mbox.gz Atom feed top 2016-11-03 21:39 [RFC 0/8] KVM PCIe/MSI passthrough on ARM/ARM64 (Alt II) Eric Auger 2016-11-03 21:39 ` Eric Auger 2016-11-03 21:39 ` Eric Auger 2016-11-03 21:39 ` [RFC 1/8] vfio: fix vfio_info_cap_add/shift Eric Auger 2016-11-03 21:39 ` Eric Auger 2016-11-03 21:39 ` [RFC 2/8] iommu/iova: fix __alloc_and_insert_iova_range Eric Auger 2016-11-03 21:39 ` Eric Auger 2016-11-03 21:39 ` [RFC 3/8] iommu/dma: Allow MSI-only cookies Eric Auger 2016-11-03 21:39 ` Eric Auger 2016-11-03 21:39 ` [RFC 4/8] iommu: Add a list of iommu_reserved_region in iommu_domain Eric Auger 2016-11-03 21:39 ` Eric Auger [this message] 2016-11-03 21:39 ` [RFC 5/8] vfio/type1: Introduce RESV_IOVA_RANGE capability Eric Auger 2016-11-03 21:39 ` [RFC 6/8] iommu: Handle the list of reserved regions Eric Auger 2016-11-03 21:39 ` [RFC 7/8] iommu/vt-d: Implement add_reserved_regions callback Eric Auger 2016-11-03 21:39 ` [RFC 8/8] iommu/arm-smmu: implement " Eric Auger 2016-11-03 21:39 ` Eric Auger 2016-11-04 4:02 ` [RFC 0/8] KVM PCIe/MSI passthrough on ARM/ARM64 (Alt II) Alex Williamson 2016-11-04 4:02 ` Alex Williamson 2016-11-04 4:02 ` Alex Williamson 2016-11-08 2:45 ` Summary of LPC guest MSI discussion in Santa Fe (was: Re: [RFC 0/8] KVM PCIe/MSI passthrough on ARM/ARM64 (Alt II)) Will Deacon 2016-11-08 2:45 ` Will Deacon 2016-11-08 14:27 ` Summary of LPC guest MSI discussion in Santa Fe Auger Eric 2016-11-08 14:27 ` Auger Eric 2016-11-08 17:54 ` Will Deacon 2016-11-08 17:54 ` Will Deacon 2016-11-08 17:54 ` Will Deacon 2016-11-08 19:02 ` Don Dutile 2016-11-08 19:02 ` Don Dutile 2016-11-08 19:02 ` Don Dutile 2016-11-08 19:10 ` Will Deacon 2016-11-08 19:10 ` Will Deacon 2016-11-09 7:43 ` Auger Eric 2016-11-09 7:43 ` Auger Eric 2016-11-09 7:43 ` Auger Eric 2016-11-08 16:02 ` Don Dutile 2016-11-08 16:02 ` Don Dutile 2016-11-08 20:29 ` Summary of LPC guest MSI discussion in Santa Fe (was: Re: [RFC 0/8] KVM PCIe/MSI passthrough on ARM/ARM64 (Alt II)) Christoffer Dall 2016-11-08 20:29 ` Christoffer Dall 2016-11-08 20:29 ` Christoffer Dall 2016-11-08 23:35 ` Alex Williamson 2016-11-08 23:35 ` Alex Williamson 2016-11-08 23:35 ` Alex Williamson 2016-11-09 2:52 ` Summary of LPC guest MSI discussion in Santa Fe Don Dutile 2016-11-09 2:52 ` Don Dutile 2016-11-09 2:52 ` Don Dutile 2016-11-09 17:03 ` Will Deacon 2016-11-09 17:03 ` Will Deacon 2016-11-09 17:03 ` Will Deacon 2016-11-09 18:59 ` Don Dutile 2016-11-09 18:59 ` Don Dutile 2016-11-09 19:23 ` Christoffer Dall 2016-11-09 19:23 ` Christoffer Dall 2016-11-09 19:23 ` Christoffer Dall 2016-11-09 20:01 ` Alex Williamson 2016-11-09 20:01 ` Alex Williamson 2016-11-09 20:01 ` Alex Williamson 2016-11-10 14:40 ` Joerg Roedel 2016-11-10 14:40 ` Joerg Roedel 2016-11-10 17:07 ` Alex Williamson 2016-11-10 17:07 ` Alex Williamson 2016-11-10 17:07 ` Alex Williamson 2016-11-09 20:31 ` Will Deacon 2016-11-09 20:31 ` Will Deacon 2016-11-09 22:17 ` Alex Williamson 2016-11-09 22:17 ` Alex Williamson 2016-11-09 22:17 ` Alex Williamson 2016-11-09 22:25 ` Will Deacon 2016-11-09 22:25 ` Will Deacon 2016-11-09 22:25 ` Will Deacon 2016-11-09 23:24 ` Alex Williamson 2016-11-09 23:24 ` Alex Williamson 2016-11-09 23:24 ` Alex Williamson 2016-11-09 23:38 ` Will Deacon 2016-11-09 23:38 ` Will Deacon 2016-11-09 23:59 ` Alex Williamson 2016-11-09 23:59 ` Alex Williamson 2016-11-09 23:59 ` Alex Williamson 2016-11-10 0:14 ` Auger Eric 2016-11-10 0:14 ` Auger Eric 2016-11-10 0:55 ` Alex Williamson 2016-11-10 0:55 ` Alex Williamson 2016-11-10 0:55 ` Alex Williamson 2016-11-10 2:01 ` Will Deacon 2016-11-10 2:01 ` Will Deacon 2016-11-10 11:14 ` Auger Eric 2016-11-10 11:14 ` Auger Eric 2016-11-10 11:14 ` Auger Eric 2016-11-10 17:46 ` Alex Williamson 2016-11-10 17:46 ` Alex Williamson 2016-11-10 17:46 ` Alex Williamson 2016-11-11 11:19 ` Joerg Roedel 2016-11-11 11:19 ` Joerg Roedel 2016-11-11 15:50 ` Alex Williamson 2016-11-11 15:50 ` Alex Williamson 2016-11-11 15:50 ` Alex Williamson 2016-11-11 16:05 ` Alex Williamson 2016-11-11 16:05 ` Alex Williamson 2016-11-11 16:05 ` Alex Williamson 2016-11-14 15:19 ` Joerg Roedel 2016-11-14 15:19 ` Joerg Roedel 2016-11-11 16:25 ` Don Dutile 2016-11-11 16:25 ` Don Dutile 2016-11-11 16:25 ` Don Dutile 2016-11-11 16:00 ` Don Dutile 2016-11-11 16:00 ` Don Dutile 2016-11-11 16:00 ` Don Dutile 2016-11-10 14:52 ` Joerg Roedel 2016-11-10 14:52 ` Joerg Roedel 2016-11-09 20:11 ` Robin Murphy 2016-11-09 20:11 ` Robin Murphy 2016-11-10 15:18 ` Joerg Roedel 2016-11-10 15:18 ` Joerg Roedel 2016-11-10 15:18 ` Joerg Roedel 2016-11-21 5:13 ` Jon Masters 2016-11-21 5:13 ` Jon Masters 2016-11-21 5:13 ` Jon Masters 2016-11-23 20:12 ` Don Dutile 2016-11-23 20:12 ` Don Dutile 2016-11-23 20:12 ` Don Dutile
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=1478209178-3009-6-git-send-email-eric.auger@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: linkBe 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.