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 v2 5/8] vfio/type1: Introduce RESV_IOVA_RANGE capability Date: Fri, 4 Nov 2016 11:24:03 +0000 [thread overview] Message-ID: <1478258646-3117-6-git-send-email-eric.auger@redhat.com> (raw) In-Reply-To: <1478258646-3117-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> --- RFC v1 -> v2: - add resv_mutex lock/unlock --- drivers/vfio/vfio_iommu_type1.c | 70 ++++++++++++++++++++++++++++++++++++++++- include/uapi/linux/vfio.h | 16 +++++++++- 2 files changed, 84 insertions(+), 2 deletions(-) diff --git a/drivers/vfio/vfio_iommu_type1.c b/drivers/vfio/vfio_iommu_type1.c index 2ba1942..205f6ad 100644 --- a/drivers/vfio/vfio_iommu_type1.c +++ b/drivers/vfio/vfio_iommu_type1.c @@ -965,6 +965,49 @@ 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 iommu_reserved_region *resv; + struct vfio_domain *domain; + struct iommu_domain *d; + int ret = 0; + + domain = list_first_entry(&iommu->domain_list, + struct vfio_domain, next); + d = domain->domain; + + mutex_lock(&d->resv_mutex); + iommu_reserved_region_for_each(resv, d) { + ret = add_resv_iova_range(caps, resv->start, + resv->start + resv->length - 1); + if (ret) + break; + } + mutex_unlock(&d->resv_mutex); + return ret; +} + static long vfio_iommu_type1_ioctl(void *iommu_data, unsigned int cmd, unsigned long arg) { @@ -986,8 +1029,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 +1044,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 v2 5/8] vfio/type1: Introduce RESV_IOVA_RANGE capability Date: Fri, 4 Nov 2016 11:24:03 +0000 [thread overview] Message-ID: <1478258646-3117-6-git-send-email-eric.auger@redhat.com> (raw) In-Reply-To: <1478258646-3117-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> --- RFC v1 -> v2: - add resv_mutex lock/unlock --- drivers/vfio/vfio_iommu_type1.c | 70 ++++++++++++++++++++++++++++++++++++++++- include/uapi/linux/vfio.h | 16 +++++++++- 2 files changed, 84 insertions(+), 2 deletions(-) diff --git a/drivers/vfio/vfio_iommu_type1.c b/drivers/vfio/vfio_iommu_type1.c index 2ba1942..205f6ad 100644 --- a/drivers/vfio/vfio_iommu_type1.c +++ b/drivers/vfio/vfio_iommu_type1.c @@ -965,6 +965,49 @@ 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 iommu_reserved_region *resv; + struct vfio_domain *domain; + struct iommu_domain *d; + int ret = 0; + + domain = list_first_entry(&iommu->domain_list, + struct vfio_domain, next); + d = domain->domain; + + mutex_lock(&d->resv_mutex); + iommu_reserved_region_for_each(resv, d) { + ret = add_resv_iova_range(caps, resv->start, + resv->start + resv->length - 1); + if (ret) + break; + } + mutex_unlock(&d->resv_mutex); + return ret; +} + static long vfio_iommu_type1_ioctl(void *iommu_data, unsigned int cmd, unsigned long arg) { @@ -986,8 +1029,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 +1044,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-04 11:25 UTC|newest] Thread overview: 91+ messages / expand[flat|nested] mbox.gz Atom feed top 2016-11-04 11:23 [RFC v2 0/8] KVM PCIe/MSI passthrough on ARM/ARM64 - Alt II Eric Auger 2016-11-04 11:23 ` Eric Auger 2016-11-04 11:23 ` Eric Auger 2016-11-04 11:23 ` [RFC v2 1/8] vfio: fix vfio_info_cap_add/shift Eric Auger 2016-11-04 11:23 ` Eric Auger 2016-11-04 11:24 ` [RFC v2 2/8] iommu/iova: fix __alloc_and_insert_iova_range Eric Auger 2016-11-04 11:24 ` Eric Auger 2016-11-10 15:22 ` Joerg Roedel 2016-11-10 15:22 ` Joerg Roedel 2016-11-10 15:22 ` Joerg Roedel 2016-11-10 15:41 ` Auger Eric 2016-11-10 15:41 ` Auger Eric 2016-11-04 11:24 ` [RFC v2 3/8] iommu/dma: Allow MSI-only cookies Eric Auger 2016-11-14 12:36 ` Robin Murphy 2016-11-14 12:36 ` Robin Murphy 2016-11-14 12:36 ` Robin Murphy 2016-11-14 23:23 ` Auger Eric 2016-11-14 23:23 ` Auger Eric 2016-11-14 23:23 ` Auger Eric 2016-11-15 14:52 ` Robin Murphy 2016-11-15 14:52 ` Robin Murphy 2016-11-04 11:24 ` [RFC v2 4/8] iommu: Add a list of iommu_reserved_region in iommu_domain Eric Auger 2016-11-04 11:24 ` Eric Auger 2016-11-04 14:00 ` Robin Murphy 2016-11-04 14:00 ` Robin Murphy 2016-11-04 14:00 ` Robin Murphy 2016-11-10 11:22 ` Auger Eric 2016-11-10 11:22 ` Auger Eric 2016-11-10 11:54 ` Robin Murphy 2016-11-10 11:54 ` Robin Murphy 2016-11-10 12:14 ` Auger Eric 2016-11-10 12:14 ` Auger Eric 2016-11-10 12:48 ` Robin Murphy 2016-11-10 12:48 ` Robin Murphy 2016-11-10 12:48 ` Robin Murphy 2016-11-10 15:37 ` Joerg Roedel 2016-11-10 15:37 ` Joerg Roedel 2016-11-10 15:37 ` Joerg Roedel 2016-11-10 15:42 ` Auger Eric 2016-11-10 15:42 ` Auger Eric 2016-11-04 11:24 ` Eric Auger [this message] 2016-11-04 11:24 ` [RFC v2 5/8] vfio/type1: Introduce RESV_IOVA_RANGE capability Eric Auger 2016-11-04 11:24 ` [RFC v2 6/8] iommu: Handle the list of reserved regions Eric Auger 2016-11-04 11:24 ` [RFC v2 7/8] iommu/vt-d: Implement add_reserved_regions callback Eric Auger 2016-11-04 11:24 ` Eric Auger 2016-11-04 11:24 ` [RFC v2 8/8] iommu/arm-smmu: implement " Eric Auger 2016-11-04 11:24 ` Eric Auger 2016-11-04 14:16 ` Robin Murphy 2016-11-04 14:16 ` Robin Murphy 2016-11-10 15:46 ` Joerg Roedel 2016-11-10 15:46 ` Joerg Roedel 2016-11-10 15:46 ` Joerg Roedel 2016-11-10 15:57 ` Auger Eric 2016-11-10 15:57 ` Auger Eric 2016-11-10 15:57 ` Auger Eric 2016-11-10 16:13 ` Joerg Roedel 2016-11-10 16:13 ` Joerg Roedel 2016-11-10 18:00 ` Auger Eric 2016-11-10 18:00 ` Auger Eric 2016-11-10 18:00 ` Auger Eric 2016-11-11 11:42 ` Joerg Roedel 2016-11-11 11:42 ` Joerg Roedel 2016-11-11 11:42 ` Joerg Roedel 2016-11-11 15:47 ` Auger Eric 2016-11-11 15:47 ` Auger Eric 2016-11-11 16:22 ` Joerg Roedel 2016-11-11 16:22 ` Joerg Roedel 2016-11-11 16:45 ` Auger Eric 2016-11-11 16:45 ` Auger Eric 2016-11-11 16:45 ` Auger Eric 2016-11-14 15:31 ` Joerg Roedel 2016-11-14 15:31 ` Joerg Roedel 2016-11-14 16:08 ` Auger Eric 2016-11-14 16:08 ` Auger Eric 2016-11-14 16:20 ` Joerg Roedel 2016-11-14 16:20 ` Joerg Roedel 2016-11-14 16:20 ` Joerg Roedel 2016-11-14 16:57 ` Auger Eric 2016-11-14 16:57 ` Auger Eric 2016-11-10 16:07 ` Robin Murphy 2016-11-10 16:07 ` Robin Murphy 2016-11-10 16:07 ` Robin Murphy 2016-11-10 16:16 ` Joerg Roedel 2016-11-10 16:16 ` Joerg Roedel 2016-11-10 16:16 ` Joerg Roedel 2016-11-11 14:34 ` Robin Murphy 2016-11-11 14:34 ` Robin Murphy 2016-11-11 14:34 ` Robin Murphy 2016-11-11 15:03 ` Joerg Roedel 2016-11-11 15:03 ` Joerg Roedel 2016-11-11 15:03 ` Joerg Roedel
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=1478258646-3117-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.