From: Jason Gunthorpe <jgg@nvidia.com>
To: Baolu Lu <baolu.lu@linux.intel.com>
Cc: Yi Liu <yi.l.liu@intel.com>,
joro@8bytes.org, alex.williamson@redhat.com,
kevin.tian@intel.com, robin.murphy@arm.com, cohuck@redhat.com,
eric.auger@redhat.com, nicolinc@nvidia.com, kvm@vger.kernel.org,
mjrosato@linux.ibm.com, chao.p.peng@linux.intel.com,
yi.y.sun@linux.intel.com, peterx@redhat.com, jasowang@redhat.com,
shameerali.kolothum.thodi@huawei.com, lulu@redhat.com,
suravee.suthikulpanit@amd.com, iommu@lists.linux.dev,
linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org,
zhenzhong.duan@intel.com
Subject: Re: [PATCH v5 3/4] iommufd: Add IOMMU_GET_HW_INFO
Date: Fri, 4 Aug 2023 11:12:11 -0300 [thread overview]
Message-ID: <ZM0HO02QRHnIKIIJ@nvidia.com> (raw)
In-Reply-To: <51418f60-db2f-8ee3-ed9c-1a97d89774cf@linux.intel.com>
On Fri, Aug 04, 2023 at 09:59:11AM +0800, Baolu Lu wrote:
> On 2023/8/3 22:31, Yi Liu wrote:
> > Under nested IOMMU translation, userspace owns the stage-1 translation
> > table (e.g. the stage-1 page table of Intel VT-d or the context table
> > of ARM SMMUv3, and etc.). Stage-1 translation tables are vendor specific,
> > and need to be compatiable with the underlying IOMMU hardware. Hence,
>
> compatible
>
> > userspace should know the IOMMU hardware capability before creating and
> > configuring the stage-1 translation table to kernel.
> >
> > This adds IOMMU_GET_HW_INFO ioctl to query the IOMMU hardware information
> > (a.k.a capability) for a given device. The returned data is vendor specific,
> > userspace needs to decode it with the structure mapped by the @out_data_type
> > field.
> >
> > As only physical devices have IOMMU hardware, so this will return error
> > if the given device is not a physical device.
> >
> > Co-developed-by: Nicolin Chen <nicolinc@nvidia.com>
> > Signed-off-by: Nicolin Chen <nicolinc@nvidia.com>
> > Signed-off-by: Yi Liu <yi.l.liu@intel.com>
> > ---
> > drivers/iommu/iommufd/main.c | 79 ++++++++++++++++++++++++++++++++++++
> > include/uapi/linux/iommufd.h | 36 ++++++++++++++++
> > 2 files changed, 115 insertions(+)
> >
> > diff --git a/drivers/iommu/iommufd/main.c b/drivers/iommu/iommufd/main.c
> > index 94c498b8fdf6..a0302bcaa97c 100644
> > --- a/drivers/iommu/iommufd/main.c
> > +++ b/drivers/iommu/iommufd/main.c
> > @@ -17,6 +17,7 @@
> > #include <linux/bug.h>
> > #include <uapi/linux/iommufd.h>
> > #include <linux/iommufd.h>
> > +#include "../iommu-priv.h"
> > #include "io_pagetable.h"
> > #include "iommufd_private.h"
> > @@ -177,6 +178,81 @@ static int iommufd_destroy(struct iommufd_ucmd *ucmd)
> > return 0;
> > }
> > +static int iommufd_zero_fill_user(void __user *ptr, size_t bytes)
> > +{
> > + int index = 0;
> > +
> > + for (; index < bytes; index++) {
> > + if (put_user(0, (uint8_t __user *)(ptr + index)))
> > + return -EFAULT;
> > + }
> > + return 0;
> > +}
> > +
> > +static int iommufd_get_hw_info(struct iommufd_ucmd *ucmd)
> > +{
> > + u32 hw_info_type = IOMMU_HW_INFO_TYPE_NONE;
> > + struct iommu_hw_info *cmd = ucmd->cmd;
> > + unsigned int length = 0, data_len;
> > + struct iommufd_device *idev;
> > + const struct iommu_ops *ops;
> > + void __user *user_ptr;
> > + void *data = NULL;
> > + int rc = 0;
> > +
> > + if (cmd->flags || cmd->__reserved || !cmd->data_len)
> > + return -EOPNOTSUPP;
> > +
> > + idev = iommufd_get_device(ucmd, cmd->dev_id);
> > + if (IS_ERR(idev))
> > + return PTR_ERR(idev);
> > +
> > + user_ptr = u64_to_user_ptr(cmd->data_ptr);
> > +
> > + ops = dev_iommu_ops(idev->dev);
> > + if (!ops->hw_info)
> > + goto done;
> > +
> > + data = ops->hw_info(idev->dev, &data_len, &hw_info_type);
> > + if (IS_ERR(data)) {
> > + rc = PTR_ERR(data);
> > + goto out_err;
>
> Can kfree() handle a ERR_PTR input? I am afraid not,
>
> /**
> * kfree - free previously allocated memory
> * @object: pointer returned by kmalloc() or kmem_cache_alloc()
> *
> * If @object is NULL, no operation is performed.
> */
> void kfree(const void *object)
> {
> struct folio *folio;
> struct slab *slab;
> struct kmem_cache *s;
>
> trace_kfree(_RET_IP_, object);
>
> if (unlikely(ZERO_OR_NULL_PTR(object)))
> return;
>
> So, perhaps we should add
>
> data = NULL;
>
> before
> goto out_err;
No, use more labels.
> > + }
> > +
> > + /* driver has hw_info callback should have a unique hw_info_type */
> > + if (WARN_ON_ONCE(hw_info_type == IOMMU_HW_INFO_TYPE_NONE)) {
> > + rc = -ENODEV;
> > + goto out_err;
> > + }
> > +
> > + length = min(cmd->data_len, data_len);
> > + if (copy_to_user(user_ptr, data, length)) {
> > + rc = -EFAULT;
> > + goto out_err;
> > + }
> > +
> > +done:
No label here, put it in a if {}
> > + /*
> > + * Zero the trailing bytes if the user buffer is bigger than the
> > + * data size kernel actually has.
> > + */
> > + if (length < cmd->data_len) {
> > + rc = iommufd_zero_fill_user(user_ptr + length,
> > + cmd->data_len - length);
> > + if (rc)
> > + goto out_err;
> > + }
> > +
> > + cmd->data_len = length;
> > + cmd->out_data_type = hw_info_type;
> > + rc = iommufd_ucmd_respond(ucmd, sizeof(*cmd));
> > +
> > +out_err:
err_free:
> > + kfree(data);
err_put:
> > + iommufd_put_object(&idev->obj);
> > + return rc;
> > +}
Jason
next prev parent reply other threads:[~2023-08-04 14:12 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-08-03 14:31 [PATCH v5 0/4] iommufd: Add iommu hardware info reporting Yi Liu
2023-08-03 14:31 ` [PATCH v5 1/4] iommu: Move dev_iommu_ops() to private header Yi Liu
2023-08-03 14:31 ` [PATCH v5 2/4] iommu: Add new iommu op to get iommu hardware information Yi Liu
2023-08-04 2:58 ` Liu, Jingqi
2023-08-04 6:36 ` Liu, Yi L
2023-08-03 14:31 ` [PATCH v5 3/4] iommufd: Add IOMMU_GET_HW_INFO Yi Liu
2023-08-04 1:59 ` Baolu Lu
2023-08-04 6:35 ` Liu, Yi L
2023-08-04 14:12 ` Jason Gunthorpe [this message]
2023-08-07 8:49 ` Liu, Yi L
2023-08-08 13:02 ` Jason Gunthorpe
2023-08-08 15:36 ` Liu, Yi L
2023-08-03 14:31 ` [PATCH v5 4/4] iommufd/selftest: Add coverage for IOMMU_GET_HW_INFO ioctl Yi Liu
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=ZM0HO02QRHnIKIIJ@nvidia.com \
--to=jgg@nvidia.com \
--cc=alex.williamson@redhat.com \
--cc=baolu.lu@linux.intel.com \
--cc=chao.p.peng@linux.intel.com \
--cc=cohuck@redhat.com \
--cc=eric.auger@redhat.com \
--cc=iommu@lists.linux.dev \
--cc=jasowang@redhat.com \
--cc=joro@8bytes.org \
--cc=kevin.tian@intel.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=lulu@redhat.com \
--cc=mjrosato@linux.ibm.com \
--cc=nicolinc@nvidia.com \
--cc=peterx@redhat.com \
--cc=robin.murphy@arm.com \
--cc=shameerali.kolothum.thodi@huawei.com \
--cc=suravee.suthikulpanit@amd.com \
--cc=yi.l.liu@intel.com \
--cc=yi.y.sun@linux.intel.com \
--cc=zhenzhong.duan@intel.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 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.