* [PATCH v3 1/6] iommu/iommufd: Pass iommufd_ctx pointer in iommufd_get_ioas()
2023-03-27 9:33 [PATCH v3 0/6] vfio: Make emulated devices prepared for vfio device cdev Yi Liu
@ 2023-03-27 9:33 ` Yi Liu
2023-03-27 16:35 ` Jason Gunthorpe
2023-03-28 5:23 ` Tian, Kevin
2023-03-27 9:33 ` [PATCH v3 2/6] iommufd: Create access in vfio_iommufd_emulated_bind() Yi Liu
` (8 subsequent siblings)
9 siblings, 2 replies; 17+ messages in thread
From: Yi Liu @ 2023-03-27 9:33 UTC (permalink / raw)
To: alex.williamson, jgg, kevin.tian
Cc: joro, robin.murphy, cohuck, eric.auger, nicolinc, kvm, mjrosato,
chao.p.peng, yi.l.liu, yi.y.sun, peterx, jasowang,
shameerali.kolothum.thodi, lulu, suravee.suthikulpanit,
intel-gvt-dev, intel-gfx, linux-s390, xudong.hao, yan.y.zhao,
terrence.xu, yanting.jiang
no need to pass the iommufd_ucmd pointer.
Signed-off-by: Yi Liu <yi.l.liu@intel.com>
---
drivers/iommu/iommufd/ioas.c | 14 +++++++-------
drivers/iommu/iommufd/iommufd_private.h | 4 ++--
drivers/iommu/iommufd/selftest.c | 6 +++---
drivers/iommu/iommufd/vfio_compat.c | 2 +-
4 files changed, 13 insertions(+), 13 deletions(-)
diff --git a/drivers/iommu/iommufd/ioas.c b/drivers/iommu/iommufd/ioas.c
index 31577e9d434f..d5624577f79f 100644
--- a/drivers/iommu/iommufd/ioas.c
+++ b/drivers/iommu/iommufd/ioas.c
@@ -71,7 +71,7 @@ int iommufd_ioas_iova_ranges(struct iommufd_ucmd *ucmd)
if (cmd->__reserved)
return -EOPNOTSUPP;
- ioas = iommufd_get_ioas(ucmd, cmd->ioas_id);
+ ioas = iommufd_get_ioas(ucmd->ictx, cmd->ioas_id);
if (IS_ERR(ioas))
return PTR_ERR(ioas);
@@ -151,7 +151,7 @@ int iommufd_ioas_allow_iovas(struct iommufd_ucmd *ucmd)
if (cmd->__reserved)
return -EOPNOTSUPP;
- ioas = iommufd_get_ioas(ucmd, cmd->ioas_id);
+ ioas = iommufd_get_ioas(ucmd->ictx, cmd->ioas_id);
if (IS_ERR(ioas))
return PTR_ERR(ioas);
iopt = &ioas->iopt;
@@ -213,7 +213,7 @@ int iommufd_ioas_map(struct iommufd_ucmd *ucmd)
if (cmd->iova >= ULONG_MAX || cmd->length >= ULONG_MAX)
return -EOVERFLOW;
- ioas = iommufd_get_ioas(ucmd, cmd->ioas_id);
+ ioas = iommufd_get_ioas(ucmd->ictx, cmd->ioas_id);
if (IS_ERR(ioas))
return PTR_ERR(ioas);
@@ -253,7 +253,7 @@ int iommufd_ioas_copy(struct iommufd_ucmd *ucmd)
cmd->dst_iova >= ULONG_MAX)
return -EOVERFLOW;
- src_ioas = iommufd_get_ioas(ucmd, cmd->src_ioas_id);
+ src_ioas = iommufd_get_ioas(ucmd->ictx, cmd->src_ioas_id);
if (IS_ERR(src_ioas))
return PTR_ERR(src_ioas);
rc = iopt_get_pages(&src_ioas->iopt, cmd->src_iova, cmd->length,
@@ -262,7 +262,7 @@ int iommufd_ioas_copy(struct iommufd_ucmd *ucmd)
if (rc)
return rc;
- dst_ioas = iommufd_get_ioas(ucmd, cmd->dst_ioas_id);
+ dst_ioas = iommufd_get_ioas(ucmd->ictx, cmd->dst_ioas_id);
if (IS_ERR(dst_ioas)) {
rc = PTR_ERR(dst_ioas);
goto out_pages;
@@ -292,7 +292,7 @@ int iommufd_ioas_unmap(struct iommufd_ucmd *ucmd)
unsigned long unmapped = 0;
int rc;
- ioas = iommufd_get_ioas(ucmd, cmd->ioas_id);
+ ioas = iommufd_get_ioas(ucmd->ictx, cmd->ioas_id);
if (IS_ERR(ioas))
return PTR_ERR(ioas);
@@ -381,7 +381,7 @@ int iommufd_ioas_option(struct iommufd_ucmd *ucmd)
if (cmd->__reserved)
return -EOPNOTSUPP;
- ioas = iommufd_get_ioas(ucmd, cmd->object_id);
+ ioas = iommufd_get_ioas(ucmd->ictx, cmd->object_id);
if (IS_ERR(ioas))
return PTR_ERR(ioas);
diff --git a/drivers/iommu/iommufd/iommufd_private.h b/drivers/iommu/iommufd/iommufd_private.h
index 9d7f71510ca1..2e6e8e217cce 100644
--- a/drivers/iommu/iommufd/iommufd_private.h
+++ b/drivers/iommu/iommufd/iommufd_private.h
@@ -211,10 +211,10 @@ struct iommufd_ioas {
struct list_head hwpt_list;
};
-static inline struct iommufd_ioas *iommufd_get_ioas(struct iommufd_ucmd *ucmd,
+static inline struct iommufd_ioas *iommufd_get_ioas(struct iommufd_ctx *ictx,
u32 id)
{
- return container_of(iommufd_get_object(ucmd->ictx, id,
+ return container_of(iommufd_get_object(ictx, id,
IOMMUFD_OBJ_IOAS),
struct iommufd_ioas, obj);
}
diff --git a/drivers/iommu/iommufd/selftest.c b/drivers/iommu/iommufd/selftest.c
index cfb5fe9a5e0e..8667eb222cf1 100644
--- a/drivers/iommu/iommufd/selftest.c
+++ b/drivers/iommu/iommufd/selftest.c
@@ -75,7 +75,7 @@ void iommufd_test_syz_conv_iova_id(struct iommufd_ucmd *ucmd,
return;
*flags &= ~(u32)MOCK_FLAGS_ACCESS_SYZ;
- ioas = iommufd_get_ioas(ucmd, ioas_id);
+ ioas = iommufd_get_ioas(ucmd->ictx, ioas_id);
if (IS_ERR(ioas))
return;
*iova = iommufd_test_syz_conv_iova(&ioas->iopt, iova);
@@ -279,7 +279,7 @@ static int iommufd_test_mock_domain(struct iommufd_ucmd *ucmd,
struct iommufd_ioas *ioas;
int rc;
- ioas = iommufd_get_ioas(ucmd, cmd->id);
+ ioas = iommufd_get_ioas(ucmd->ictx, cmd->id);
if (IS_ERR(ioas))
return PTR_ERR(ioas);
@@ -322,7 +322,7 @@ static int iommufd_test_add_reserved(struct iommufd_ucmd *ucmd,
struct iommufd_ioas *ioas;
int rc;
- ioas = iommufd_get_ioas(ucmd, mockpt_id);
+ ioas = iommufd_get_ioas(ucmd->ictx, mockpt_id);
if (IS_ERR(ioas))
return PTR_ERR(ioas);
down_write(&ioas->iopt.iova_rwsem);
diff --git a/drivers/iommu/iommufd/vfio_compat.c b/drivers/iommu/iommufd/vfio_compat.c
index 514494a0025b..fe02517c73cc 100644
--- a/drivers/iommu/iommufd/vfio_compat.c
+++ b/drivers/iommu/iommufd/vfio_compat.c
@@ -137,7 +137,7 @@ int iommufd_vfio_ioas(struct iommufd_ucmd *ucmd)
return iommufd_ucmd_respond(ucmd, sizeof(*cmd));
case IOMMU_VFIO_IOAS_SET:
- ioas = iommufd_get_ioas(ucmd, cmd->ioas_id);
+ ioas = iommufd_get_ioas(ucmd->ictx, cmd->ioas_id);
if (IS_ERR(ioas))
return PTR_ERR(ioas);
xa_lock(&ucmd->ictx->objects);
--
2.34.1
^ permalink raw reply related [flat|nested] 17+ messages in thread* Re: [PATCH v3 1/6] iommu/iommufd: Pass iommufd_ctx pointer in iommufd_get_ioas()
2023-03-27 9:33 ` [PATCH v3 1/6] iommu/iommufd: Pass iommufd_ctx pointer in iommufd_get_ioas() Yi Liu
@ 2023-03-27 16:35 ` Jason Gunthorpe
2023-03-28 5:23 ` Tian, Kevin
1 sibling, 0 replies; 17+ messages in thread
From: Jason Gunthorpe @ 2023-03-27 16:35 UTC (permalink / raw)
To: Yi Liu
Cc: alex.williamson, kevin.tian, joro, robin.murphy, cohuck,
eric.auger, nicolinc, kvm, mjrosato, chao.p.peng, yi.y.sun,
peterx, jasowang, shameerali.kolothum.thodi, lulu,
suravee.suthikulpanit, intel-gvt-dev, intel-gfx, linux-s390,
xudong.hao, yan.y.zhao, terrence.xu, yanting.jiang
On Mon, Mar 27, 2023 at 02:33:46AM -0700, Yi Liu wrote:
> no need to pass the iommufd_ucmd pointer.
>
> Signed-off-by: Yi Liu <yi.l.liu@intel.com>
> ---
> drivers/iommu/iommufd/ioas.c | 14 +++++++-------
> drivers/iommu/iommufd/iommufd_private.h | 4 ++--
> drivers/iommu/iommufd/selftest.c | 6 +++---
> drivers/iommu/iommufd/vfio_compat.c | 2 +-
> 4 files changed, 13 insertions(+), 13 deletions(-)
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Jason
^ permalink raw reply [flat|nested] 17+ messages in thread
* RE: [PATCH v3 1/6] iommu/iommufd: Pass iommufd_ctx pointer in iommufd_get_ioas()
2023-03-27 9:33 ` [PATCH v3 1/6] iommu/iommufd: Pass iommufd_ctx pointer in iommufd_get_ioas() Yi Liu
2023-03-27 16:35 ` Jason Gunthorpe
@ 2023-03-28 5:23 ` Tian, Kevin
1 sibling, 0 replies; 17+ messages in thread
From: Tian, Kevin @ 2023-03-28 5:23 UTC (permalink / raw)
To: Liu, Yi L, alex.williamson@redhat.com, jgg@nvidia.com
Cc: joro@8bytes.org, 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,
intel-gvt-dev@lists.freedesktop.org,
intel-gfx@lists.freedesktop.org, linux-s390@vger.kernel.org,
Hao, Xudong, Zhao, Yan Y, Xu, Terrence, Jiang, Yanting
> From: Liu, Yi L <yi.l.liu@intel.com>
> Sent: Monday, March 27, 2023 5:34 PM
>
> no need to pass the iommufd_ucmd pointer.
>
> Signed-off-by: Yi Liu <yi.l.liu@intel.com>
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH v3 2/6] iommufd: Create access in vfio_iommufd_emulated_bind()
2023-03-27 9:33 [PATCH v3 0/6] vfio: Make emulated devices prepared for vfio device cdev Yi Liu
2023-03-27 9:33 ` [PATCH v3 1/6] iommu/iommufd: Pass iommufd_ctx pointer in iommufd_get_ioas() Yi Liu
@ 2023-03-27 9:33 ` Yi Liu
2023-03-29 19:59 ` Jason Gunthorpe
2023-03-27 9:33 ` [PATCH v3 3/6] vfio-iommufd: No need to record iommufd_ctx in vfio_device Yi Liu
` (7 subsequent siblings)
9 siblings, 1 reply; 17+ messages in thread
From: Yi Liu @ 2023-03-27 9:33 UTC (permalink / raw)
To: alex.williamson, jgg, kevin.tian
Cc: joro, robin.murphy, cohuck, eric.auger, nicolinc, kvm, mjrosato,
chao.p.peng, yi.l.liu, yi.y.sun, peterx, jasowang,
shameerali.kolothum.thodi, lulu, suravee.suthikulpanit,
intel-gvt-dev, intel-gfx, linux-s390, xudong.hao, yan.y.zhao,
terrence.xu, yanting.jiang
From: Nicolin Chen <nicolinc@nvidia.com>
There are needs to created iommufd_access prior to have an IOAS and set
IOAS later. Like the vfio device cdev needs to have an iommufd object
to represent the bond (iommufd_access) and IOAS replacement.
Moves the iommufd_access_create() call into vfio_iommufd_emulated_bind(),
making it symmetric with the __vfio_iommufd_access_destroy() call in the
vfio_iommufd_emulated_unbind(). This means an access is created/destroyed
by the bind()/unbind(), and the vfio_iommufd_emulated_attach_ioas() only
updates the access->ioas pointer.
Since vfio_iommufd_emulated_bind() does not provide ioas_id, drop it from
the argument list of iommufd_access_create(). Instead, add a new access
API iommufd_access_attach() to set the access->ioas pointer. Also, set
vdev->iommufd_attached accordingly, similar to the physical pathway.
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Tested-by: Terrence Xu <terrence.xu@intel.com>
Signed-off-by: Nicolin Chen <nicolinc@nvidia.com>
Signed-off-by: Yi Liu <yi.l.liu@intel.com>
---
drivers/iommu/iommufd/device.c | 51 +++++++++++++++++++-------------
drivers/iommu/iommufd/selftest.c | 5 +++-
drivers/vfio/iommufd.c | 24 ++++++++++-----
include/linux/iommufd.h | 3 +-
4 files changed, 53 insertions(+), 30 deletions(-)
diff --git a/drivers/iommu/iommufd/device.c b/drivers/iommu/iommufd/device.c
index a0c66f47a65a..6999a10b5496 100644
--- a/drivers/iommu/iommufd/device.c
+++ b/drivers/iommu/iommufd/device.c
@@ -412,9 +412,12 @@ void iommufd_access_destroy_object(struct iommufd_object *obj)
struct iommufd_access *access =
container_of(obj, struct iommufd_access, obj);
- iopt_remove_access(&access->ioas->iopt, access);
+ if (access->ioas) {
+ iopt_remove_access(&access->ioas->iopt, access);
+ refcount_dec(&access->ioas->obj.users);
+ access->ioas = NULL;
+ }
iommufd_ctx_put(access->ictx);
- refcount_dec(&access->ioas->obj.users);
}
/**
@@ -431,12 +434,10 @@ void iommufd_access_destroy_object(struct iommufd_object *obj)
* The provided ops are required to use iommufd_access_pin_pages().
*/
struct iommufd_access *
-iommufd_access_create(struct iommufd_ctx *ictx, u32 ioas_id,
+iommufd_access_create(struct iommufd_ctx *ictx,
const struct iommufd_access_ops *ops, void *data)
{
struct iommufd_access *access;
- struct iommufd_object *obj;
- int rc;
/*
* There is no uAPI for the access object, but to keep things symmetric
@@ -449,21 +450,10 @@ iommufd_access_create(struct iommufd_ctx *ictx, u32 ioas_id,
access->data = data;
access->ops = ops;
- obj = iommufd_get_object(ictx, ioas_id, IOMMUFD_OBJ_IOAS);
- if (IS_ERR(obj)) {
- rc = PTR_ERR(obj);
- goto out_abort;
- }
- access->ioas = container_of(obj, struct iommufd_ioas, obj);
- iommufd_ref_to_users(obj);
-
if (ops->needs_pin_pages)
access->iova_alignment = PAGE_SIZE;
else
access->iova_alignment = 1;
- rc = iopt_add_access(&access->ioas->iopt, access);
- if (rc)
- goto out_put_ioas;
/* The calling driver is a user until iommufd_access_destroy() */
refcount_inc(&access->obj.users);
@@ -471,11 +461,6 @@ iommufd_access_create(struct iommufd_ctx *ictx, u32 ioas_id,
iommufd_ctx_get(ictx);
iommufd_object_finalize(ictx, &access->obj);
return access;
-out_put_ioas:
- refcount_dec(&access->ioas->obj.users);
-out_abort:
- iommufd_object_abort(ictx, &access->obj);
- return ERR_PTR(rc);
}
EXPORT_SYMBOL_NS_GPL(iommufd_access_create, IOMMUFD);
@@ -494,6 +479,30 @@ void iommufd_access_destroy(struct iommufd_access *access)
}
EXPORT_SYMBOL_NS_GPL(iommufd_access_destroy, IOMMUFD);
+int iommufd_access_attach(struct iommufd_access *access, u32 ioas_id)
+{
+ struct iommufd_ioas *new_ioas;
+ int rc = 0;
+
+ if (access->ioas != NULL && access->ioas->obj.id != ioas_id)
+ return -EINVAL;
+
+ new_ioas = iommufd_get_ioas(access->ictx, ioas_id);
+ if (IS_ERR(new_ioas))
+ return PTR_ERR(new_ioas);
+
+ rc = iopt_add_access(&new_ioas->iopt, access);
+ if (rc) {
+ iommufd_put_object(&new_ioas->obj);
+ return rc;
+ }
+ iommufd_ref_to_users(&new_ioas->obj);
+
+ access->ioas = new_ioas;
+ return 0;
+}
+EXPORT_SYMBOL_NS_GPL(iommufd_access_attach, IOMMUFD);
+
/**
* iommufd_access_notify_unmap - Notify users of an iopt to stop using it
* @iopt: iopt to work on
diff --git a/drivers/iommu/iommufd/selftest.c b/drivers/iommu/iommufd/selftest.c
index 8667eb222cf1..1e89e1a8c5f0 100644
--- a/drivers/iommu/iommufd/selftest.c
+++ b/drivers/iommu/iommufd/selftest.c
@@ -571,7 +571,7 @@ static int iommufd_test_create_access(struct iommufd_ucmd *ucmd,
}
access = iommufd_access_create(
- ucmd->ictx, ioas_id,
+ ucmd->ictx,
(flags & MOCK_FLAGS_ACCESS_CREATE_NEEDS_PIN_PAGES) ?
&selftest_access_ops_pin :
&selftest_access_ops,
@@ -580,6 +580,9 @@ static int iommufd_test_create_access(struct iommufd_ucmd *ucmd,
rc = PTR_ERR(access);
goto out_put_fdno;
}
+ rc = iommufd_access_attach(access, ioas_id);
+ if (rc)
+ goto out_destroy;
cmd->create_access.out_access_fd = fdno;
rc = iommufd_ucmd_respond(ucmd, sizeof(*cmd));
if (rc)
diff --git a/drivers/vfio/iommufd.c b/drivers/vfio/iommufd.c
index db4efbd56042..0695a06db30d 100644
--- a/drivers/vfio/iommufd.c
+++ b/drivers/vfio/iommufd.c
@@ -138,10 +138,18 @@ static const struct iommufd_access_ops vfio_user_ops = {
int vfio_iommufd_emulated_bind(struct vfio_device *vdev,
struct iommufd_ctx *ictx, u32 *out_device_id)
{
+ struct iommufd_access *user;
+
lockdep_assert_held(&vdev->dev_set->lock);
- vdev->iommufd_ictx = ictx;
iommufd_ctx_get(ictx);
+ user = iommufd_access_create(ictx, &vfio_user_ops, vdev);
+ if (IS_ERR(user)) {
+ iommufd_ctx_put(ictx);
+ return PTR_ERR(user);
+ }
+ vdev->iommufd_access = user;
+ vdev->iommufd_ictx = ictx;
return 0;
}
EXPORT_SYMBOL_GPL(vfio_iommufd_emulated_bind);
@@ -152,6 +160,7 @@ void vfio_iommufd_emulated_unbind(struct vfio_device *vdev)
if (vdev->iommufd_access) {
iommufd_access_destroy(vdev->iommufd_access);
+ vdev->iommufd_attached = false;
vdev->iommufd_access = NULL;
}
iommufd_ctx_put(vdev->iommufd_ictx);
@@ -161,15 +170,16 @@ EXPORT_SYMBOL_GPL(vfio_iommufd_emulated_unbind);
int vfio_iommufd_emulated_attach_ioas(struct vfio_device *vdev, u32 *pt_id)
{
- struct iommufd_access *user;
+ int rc;
lockdep_assert_held(&vdev->dev_set->lock);
- user = iommufd_access_create(vdev->iommufd_ictx, *pt_id, &vfio_user_ops,
- vdev);
- if (IS_ERR(user))
- return PTR_ERR(user);
- vdev->iommufd_access = user;
+ if (vdev->iommufd_attached)
+ return -EBUSY;
+ rc = iommufd_access_attach(vdev->iommufd_access, *pt_id);
+ if (rc)
+ return rc;
+ vdev->iommufd_attached = true;
return 0;
}
EXPORT_SYMBOL_GPL(vfio_iommufd_emulated_attach_ioas);
diff --git a/include/linux/iommufd.h b/include/linux/iommufd.h
index c0b5b3ac34f1..155d3630aedc 100644
--- a/include/linux/iommufd.h
+++ b/include/linux/iommufd.h
@@ -40,9 +40,10 @@ enum {
};
struct iommufd_access *
-iommufd_access_create(struct iommufd_ctx *ictx, u32 ioas_id,
+iommufd_access_create(struct iommufd_ctx *ictx,
const struct iommufd_access_ops *ops, void *data);
void iommufd_access_destroy(struct iommufd_access *access);
+int iommufd_access_attach(struct iommufd_access *access, u32 ioas_id);
void iommufd_ctx_get(struct iommufd_ctx *ictx);
--
2.34.1
^ permalink raw reply related [flat|nested] 17+ messages in thread* Re: [PATCH v3 2/6] iommufd: Create access in vfio_iommufd_emulated_bind()
2023-03-27 9:33 ` [PATCH v3 2/6] iommufd: Create access in vfio_iommufd_emulated_bind() Yi Liu
@ 2023-03-29 19:59 ` Jason Gunthorpe
2023-03-31 8:16 ` Tian, Kevin
0 siblings, 1 reply; 17+ messages in thread
From: Jason Gunthorpe @ 2023-03-29 19:59 UTC (permalink / raw)
To: Yi Liu
Cc: alex.williamson, kevin.tian, joro, robin.murphy, cohuck,
eric.auger, nicolinc, kvm, mjrosato, chao.p.peng, yi.y.sun,
peterx, jasowang, shameerali.kolothum.thodi, lulu,
suravee.suthikulpanit, intel-gvt-dev, intel-gfx, linux-s390,
xudong.hao, yan.y.zhao, terrence.xu, yanting.jiang
On Mon, Mar 27, 2023 at 02:33:47AM -0700, Yi Liu wrote:
> @@ -494,6 +479,30 @@ void iommufd_access_destroy(struct iommufd_access *access)
> }
> EXPORT_SYMBOL_NS_GPL(iommufd_access_destroy, IOMMUFD);
>
> +int iommufd_access_attach(struct iommufd_access *access, u32 ioas_id)
> +{
> + struct iommufd_ioas *new_ioas;
> + int rc = 0;
> +
> + if (access->ioas != NULL && access->ioas->obj.id != ioas_id)
> + return -EINVAL;
This should just be
if (access->ioas)
return -EINVAL;
> +
> + new_ioas = iommufd_get_ioas(access->ictx, ioas_id);
> + if (IS_ERR(new_ioas))
> + return PTR_ERR(new_ioas);
> +
> + rc = iopt_add_access(&new_ioas->iopt, access);
> + if (rc) {
> + iommufd_put_object(&new_ioas->obj);
> + return rc;
> + }
> + iommufd_ref_to_users(&new_ioas->obj);
> +
> + access->ioas = new_ioas;
Since if ioas is non-null here then we will lose the reference counts
already held.
I'll fix it
Jason
^ permalink raw reply [flat|nested] 17+ messages in thread* RE: [PATCH v3 2/6] iommufd: Create access in vfio_iommufd_emulated_bind()
2023-03-29 19:59 ` Jason Gunthorpe
@ 2023-03-31 8:16 ` Tian, Kevin
2023-03-31 16:55 ` Jason Gunthorpe
0 siblings, 1 reply; 17+ messages in thread
From: Tian, Kevin @ 2023-03-31 8:16 UTC (permalink / raw)
To: Jason Gunthorpe, Liu, Yi L
Cc: alex.williamson@redhat.com, joro@8bytes.org, 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,
intel-gvt-dev@lists.freedesktop.org,
intel-gfx@lists.freedesktop.org, linux-s390@vger.kernel.org,
Hao, Xudong, Zhao, Yan Y, Xu, Terrence, Jiang, Yanting
> From: Jason Gunthorpe <jgg@nvidia.com>
> Sent: Thursday, March 30, 2023 4:00 AM
>
> On Mon, Mar 27, 2023 at 02:33:47AM -0700, Yi Liu wrote:
> > @@ -494,6 +479,30 @@ void iommufd_access_destroy(struct
> iommufd_access *access)
> > }
> > EXPORT_SYMBOL_NS_GPL(iommufd_access_destroy, IOMMUFD);
> >
> > +int iommufd_access_attach(struct iommufd_access *access, u32 ioas_id)
> > +{
> > + struct iommufd_ioas *new_ioas;
> > + int rc = 0;
> > +
> > + if (access->ioas != NULL && access->ioas->obj.id != ioas_id)
> > + return -EINVAL;
>
> This should just be
>
> if (access->ioas)
> return -EINVAL;
the physical path has the same check:
if (idev->igroup->hwpt != NULL && idev->igroup->hwpt != hwpt) {
rc = -EINVAL;
goto err_unlock;
}
If we change here then that one should be changed too.
^ permalink raw reply [flat|nested] 17+ messages in thread* Re: [PATCH v3 2/6] iommufd: Create access in vfio_iommufd_emulated_bind()
2023-03-31 8:16 ` Tian, Kevin
@ 2023-03-31 16:55 ` Jason Gunthorpe
0 siblings, 0 replies; 17+ messages in thread
From: Jason Gunthorpe @ 2023-03-31 16:55 UTC (permalink / raw)
To: Tian, Kevin
Cc: Liu, Yi L, alex.williamson@redhat.com, joro@8bytes.org,
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,
intel-gvt-dev@lists.freedesktop.org,
intel-gfx@lists.freedesktop.org, linux-s390@vger.kernel.org,
Hao, Xudong, Zhao, Yan Y, Xu, Terrence, Jiang, Yanting
On Fri, Mar 31, 2023 at 08:16:16AM +0000, Tian, Kevin wrote:
> > From: Jason Gunthorpe <jgg@nvidia.com>
> > Sent: Thursday, March 30, 2023 4:00 AM
> >
> > On Mon, Mar 27, 2023 at 02:33:47AM -0700, Yi Liu wrote:
> > > @@ -494,6 +479,30 @@ void iommufd_access_destroy(struct
> > iommufd_access *access)
> > > }
> > > EXPORT_SYMBOL_NS_GPL(iommufd_access_destroy, IOMMUFD);
> > >
> > > +int iommufd_access_attach(struct iommufd_access *access, u32 ioas_id)
> > > +{
> > > + struct iommufd_ioas *new_ioas;
> > > + int rc = 0;
> > > +
> > > + if (access->ioas != NULL && access->ioas->obj.id != ioas_id)
> > > + return -EINVAL;
> >
> > This should just be
> >
> > if (access->ioas)
> > return -EINVAL;
>
> the physical path has the same check:
>
> if (idev->igroup->hwpt != NULL && idev->igroup->hwpt != hwpt) {
> rc = -EINVAL;
> goto err_unlock;
> }
>
> If we change here then that one should be changed too.
No, that one is checking if the another device attached to the same
group is a compatible hwpt so we succeed to attach the new device
Jason
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH v3 3/6] vfio-iommufd: No need to record iommufd_ctx in vfio_device
2023-03-27 9:33 [PATCH v3 0/6] vfio: Make emulated devices prepared for vfio device cdev Yi Liu
2023-03-27 9:33 ` [PATCH v3 1/6] iommu/iommufd: Pass iommufd_ctx pointer in iommufd_get_ioas() Yi Liu
2023-03-27 9:33 ` [PATCH v3 2/6] iommufd: Create access in vfio_iommufd_emulated_bind() Yi Liu
@ 2023-03-27 9:33 ` Yi Liu
2023-03-27 9:33 ` [PATCH v3 4/6] vfio-iommufd: Make vfio_iommufd_emulated_bind() return iommufd_access ID Yi Liu
` (6 subsequent siblings)
9 siblings, 0 replies; 17+ messages in thread
From: Yi Liu @ 2023-03-27 9:33 UTC (permalink / raw)
To: alex.williamson, jgg, kevin.tian
Cc: joro, robin.murphy, cohuck, eric.auger, nicolinc, kvm, mjrosato,
chao.p.peng, yi.l.liu, yi.y.sun, peterx, jasowang,
shameerali.kolothum.thodi, lulu, suravee.suthikulpanit,
intel-gvt-dev, intel-gfx, linux-s390, xudong.hao, yan.y.zhao,
terrence.xu, yanting.jiang
iommufd_ctx is stored in vfio_device for emulated devices per bind_iommufd.
However, as iommufd_access is created in bind, no more need to stored it
since iommufd_access implicitly stores it.
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
Tested-by: Terrence Xu <terrence.xu@intel.com>
Signed-off-by: Yi Liu <yi.l.liu@intel.com>
---
drivers/vfio/iommufd.c | 8 +-------
include/linux/vfio.h | 1 -
2 files changed, 1 insertion(+), 8 deletions(-)
diff --git a/drivers/vfio/iommufd.c b/drivers/vfio/iommufd.c
index 0695a06db30d..78e2486586d7 100644
--- a/drivers/vfio/iommufd.c
+++ b/drivers/vfio/iommufd.c
@@ -142,14 +142,10 @@ int vfio_iommufd_emulated_bind(struct vfio_device *vdev,
lockdep_assert_held(&vdev->dev_set->lock);
- iommufd_ctx_get(ictx);
user = iommufd_access_create(ictx, &vfio_user_ops, vdev);
- if (IS_ERR(user)) {
- iommufd_ctx_put(ictx);
+ if (IS_ERR(user))
return PTR_ERR(user);
- }
vdev->iommufd_access = user;
- vdev->iommufd_ictx = ictx;
return 0;
}
EXPORT_SYMBOL_GPL(vfio_iommufd_emulated_bind);
@@ -163,8 +159,6 @@ void vfio_iommufd_emulated_unbind(struct vfio_device *vdev)
vdev->iommufd_attached = false;
vdev->iommufd_access = NULL;
}
- iommufd_ctx_put(vdev->iommufd_ictx);
- vdev->iommufd_ictx = NULL;
}
EXPORT_SYMBOL_GPL(vfio_iommufd_emulated_unbind);
diff --git a/include/linux/vfio.h b/include/linux/vfio.h
index 93134b023968..3188d8a374bd 100644
--- a/include/linux/vfio.h
+++ b/include/linux/vfio.h
@@ -60,7 +60,6 @@ struct vfio_device {
void (*put_kvm)(struct kvm *kvm);
#if IS_ENABLED(CONFIG_IOMMUFD)
struct iommufd_device *iommufd_device;
- struct iommufd_ctx *iommufd_ictx;
bool iommufd_attached;
#endif
};
--
2.34.1
^ permalink raw reply related [flat|nested] 17+ messages in thread* [PATCH v3 4/6] vfio-iommufd: Make vfio_iommufd_emulated_bind() return iommufd_access ID
2023-03-27 9:33 [PATCH v3 0/6] vfio: Make emulated devices prepared for vfio device cdev Yi Liu
` (2 preceding siblings ...)
2023-03-27 9:33 ` [PATCH v3 3/6] vfio-iommufd: No need to record iommufd_ctx in vfio_device Yi Liu
@ 2023-03-27 9:33 ` Yi Liu
2023-03-27 9:33 ` [PATCH v3 5/6] vfio/mdev: Uses the vfio emulated iommufd ops set in the mdev sample drivers Yi Liu
` (5 subsequent siblings)
9 siblings, 0 replies; 17+ messages in thread
From: Yi Liu @ 2023-03-27 9:33 UTC (permalink / raw)
To: alex.williamson, jgg, kevin.tian
Cc: joro, robin.murphy, cohuck, eric.auger, nicolinc, kvm, mjrosato,
chao.p.peng, yi.l.liu, yi.y.sun, peterx, jasowang,
shameerali.kolothum.thodi, lulu, suravee.suthikulpanit,
intel-gvt-dev, intel-gfx, linux-s390, xudong.hao, yan.y.zhao,
terrence.xu, yanting.jiang
vfio device cdev needs to return iommufd_access ID to userspace if
bind_iommufd succeeds.
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Tested-by: Terrence Xu <terrence.xu@intel.com>
Signed-off-by: Yi Liu <yi.l.liu@intel.com>
---
drivers/iommu/iommufd/device.c | 4 +++-
drivers/iommu/iommufd/selftest.c | 3 ++-
drivers/vfio/iommufd.c | 2 +-
include/linux/iommufd.h | 2 +-
4 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/drivers/iommu/iommufd/device.c b/drivers/iommu/iommufd/device.c
index 6999a10b5496..25115d401d8f 100644
--- a/drivers/iommu/iommufd/device.c
+++ b/drivers/iommu/iommufd/device.c
@@ -426,6 +426,7 @@ void iommufd_access_destroy_object(struct iommufd_object *obj)
* @ioas_id: ID for a IOMMUFD_OBJ_IOAS
* @ops: Driver's ops to associate with the access
* @data: Opaque data to pass into ops functions
+ * @id: Output ID number to return to userspace for this access
*
* An iommufd_access allows a driver to read/write to the IOAS without using
* DMA. The underlying CPU memory can be accessed using the
@@ -435,7 +436,7 @@ void iommufd_access_destroy_object(struct iommufd_object *obj)
*/
struct iommufd_access *
iommufd_access_create(struct iommufd_ctx *ictx,
- const struct iommufd_access_ops *ops, void *data)
+ const struct iommufd_access_ops *ops, void *data, u32 *id)
{
struct iommufd_access *access;
@@ -460,6 +461,7 @@ iommufd_access_create(struct iommufd_ctx *ictx,
access->ictx = ictx;
iommufd_ctx_get(ictx);
iommufd_object_finalize(ictx, &access->obj);
+ *id = access->obj.id;
return access;
}
EXPORT_SYMBOL_NS_GPL(iommufd_access_create, IOMMUFD);
diff --git a/drivers/iommu/iommufd/selftest.c b/drivers/iommu/iommufd/selftest.c
index 1e89e1a8c5f0..e6e04dceffe3 100644
--- a/drivers/iommu/iommufd/selftest.c
+++ b/drivers/iommu/iommufd/selftest.c
@@ -554,6 +554,7 @@ static int iommufd_test_create_access(struct iommufd_ucmd *ucmd,
struct iommu_test_cmd *cmd = ucmd->cmd;
struct selftest_access *staccess;
struct iommufd_access *access;
+ u32 id;
int fdno;
int rc;
@@ -575,7 +576,7 @@ static int iommufd_test_create_access(struct iommufd_ucmd *ucmd,
(flags & MOCK_FLAGS_ACCESS_CREATE_NEEDS_PIN_PAGES) ?
&selftest_access_ops_pin :
&selftest_access_ops,
- staccess);
+ staccess, &id);
if (IS_ERR(access)) {
rc = PTR_ERR(access);
goto out_put_fdno;
diff --git a/drivers/vfio/iommufd.c b/drivers/vfio/iommufd.c
index 78e2486586d7..1ee558c0be25 100644
--- a/drivers/vfio/iommufd.c
+++ b/drivers/vfio/iommufd.c
@@ -142,7 +142,7 @@ int vfio_iommufd_emulated_bind(struct vfio_device *vdev,
lockdep_assert_held(&vdev->dev_set->lock);
- user = iommufd_access_create(ictx, &vfio_user_ops, vdev);
+ user = iommufd_access_create(ictx, &vfio_user_ops, vdev, out_device_id);
if (IS_ERR(user))
return PTR_ERR(user);
vdev->iommufd_access = user;
diff --git a/include/linux/iommufd.h b/include/linux/iommufd.h
index 155d3630aedc..1129a36a74c4 100644
--- a/include/linux/iommufd.h
+++ b/include/linux/iommufd.h
@@ -41,7 +41,7 @@ enum {
struct iommufd_access *
iommufd_access_create(struct iommufd_ctx *ictx,
- const struct iommufd_access_ops *ops, void *data);
+ const struct iommufd_access_ops *ops, void *data, u32 *id);
void iommufd_access_destroy(struct iommufd_access *access);
int iommufd_access_attach(struct iommufd_access *access, u32 ioas_id);
--
2.34.1
^ permalink raw reply related [flat|nested] 17+ messages in thread* [PATCH v3 5/6] vfio/mdev: Uses the vfio emulated iommufd ops set in the mdev sample drivers
2023-03-27 9:33 [PATCH v3 0/6] vfio: Make emulated devices prepared for vfio device cdev Yi Liu
` (3 preceding siblings ...)
2023-03-27 9:33 ` [PATCH v3 4/6] vfio-iommufd: Make vfio_iommufd_emulated_bind() return iommufd_access ID Yi Liu
@ 2023-03-27 9:33 ` Yi Liu
2023-03-27 9:33 ` [PATCH v3 6/6] vfio: Check the presence for iommufd callbacks in __vfio_register_dev() Yi Liu
` (4 subsequent siblings)
9 siblings, 0 replies; 17+ messages in thread
From: Yi Liu @ 2023-03-27 9:33 UTC (permalink / raw)
To: alex.williamson, jgg, kevin.tian
Cc: joro, robin.murphy, cohuck, eric.auger, nicolinc, kvm, mjrosato,
chao.p.peng, yi.l.liu, yi.y.sun, peterx, jasowang,
shameerali.kolothum.thodi, lulu, suravee.suthikulpanit,
intel-gvt-dev, intel-gfx, linux-s390, xudong.hao, yan.y.zhao,
terrence.xu, yanting.jiang
This harmonizes the no-DMA devices (the vfio-mdev sample drivers) with
the emulated devices (gvt-g, vfio-ap etc.). It makes it easier to add
BIND_IOMMUFD user interface which requires to return an iommufd ID to
represent the device/iommufd bond.
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
Tested-by: Terrence Xu <terrence.xu@intel.com>
Signed-off-by: Yi Liu <yi.l.liu@intel.com>
---
drivers/vfio/iommufd.c | 14 ++++++--------
samples/vfio-mdev/mbochs.c | 3 +++
samples/vfio-mdev/mdpy.c | 3 +++
samples/vfio-mdev/mtty.c | 3 +++
4 files changed, 15 insertions(+), 8 deletions(-)
diff --git a/drivers/vfio/iommufd.c b/drivers/vfio/iommufd.c
index 1ee558c0be25..890ea101685c 100644
--- a/drivers/vfio/iommufd.c
+++ b/drivers/vfio/iommufd.c
@@ -32,12 +32,8 @@ int vfio_iommufd_bind(struct vfio_device *vdev, struct iommufd_ctx *ictx)
return 0;
}
- /*
- * If the driver doesn't provide this op then it means the device does
- * not do DMA at all. So nothing to do.
- */
- if (!vdev->ops->bind_iommufd)
- return 0;
+ if (WARN_ON(!vdev->ops->bind_iommufd))
+ return -ENODEV;
ret = vdev->ops->bind_iommufd(vdev, ictx, &device_id);
if (ret)
@@ -119,7 +115,8 @@ EXPORT_SYMBOL_GPL(vfio_iommufd_physical_attach_ioas);
/*
* The emulated standard ops mean that vfio_device is going to use the
* "mdev path" and will call vfio_pin_pages()/vfio_dma_rw(). Drivers using this
- * ops set should call vfio_register_emulated_iommu_dev().
+ * ops set should call vfio_register_emulated_iommu_dev(). Drivers that do
+ * not call vfio_pin_pages()/vfio_dma_rw() have no need to provide dma_unmap.
*/
static void vfio_emulated_unmap(void *data, unsigned long iova,
@@ -127,7 +124,8 @@ static void vfio_emulated_unmap(void *data, unsigned long iova,
{
struct vfio_device *vdev = data;
- vdev->ops->dma_unmap(vdev, iova, length);
+ if (vdev->ops->dma_unmap)
+ vdev->ops->dma_unmap(vdev, iova, length);
}
static const struct iommufd_access_ops vfio_user_ops = {
diff --git a/samples/vfio-mdev/mbochs.c b/samples/vfio-mdev/mbochs.c
index e54eb752e1ba..19391dda5fba 100644
--- a/samples/vfio-mdev/mbochs.c
+++ b/samples/vfio-mdev/mbochs.c
@@ -1374,6 +1374,9 @@ static const struct vfio_device_ops mbochs_dev_ops = {
.write = mbochs_write,
.ioctl = mbochs_ioctl,
.mmap = mbochs_mmap,
+ .bind_iommufd = vfio_iommufd_emulated_bind,
+ .unbind_iommufd = vfio_iommufd_emulated_unbind,
+ .attach_ioas = vfio_iommufd_emulated_attach_ioas,
};
static struct mdev_driver mbochs_driver = {
diff --git a/samples/vfio-mdev/mdpy.c b/samples/vfio-mdev/mdpy.c
index e8400fdab71d..5f48aef36995 100644
--- a/samples/vfio-mdev/mdpy.c
+++ b/samples/vfio-mdev/mdpy.c
@@ -663,6 +663,9 @@ static const struct vfio_device_ops mdpy_dev_ops = {
.write = mdpy_write,
.ioctl = mdpy_ioctl,
.mmap = mdpy_mmap,
+ .bind_iommufd = vfio_iommufd_emulated_bind,
+ .unbind_iommufd = vfio_iommufd_emulated_unbind,
+ .attach_ioas = vfio_iommufd_emulated_attach_ioas,
};
static struct mdev_driver mdpy_driver = {
diff --git a/samples/vfio-mdev/mtty.c b/samples/vfio-mdev/mtty.c
index e887de672c52..35460901b9f7 100644
--- a/samples/vfio-mdev/mtty.c
+++ b/samples/vfio-mdev/mtty.c
@@ -1269,6 +1269,9 @@ static const struct vfio_device_ops mtty_dev_ops = {
.read = mtty_read,
.write = mtty_write,
.ioctl = mtty_ioctl,
+ .bind_iommufd = vfio_iommufd_emulated_bind,
+ .unbind_iommufd = vfio_iommufd_emulated_unbind,
+ .attach_ioas = vfio_iommufd_emulated_attach_ioas,
};
static struct mdev_driver mtty_driver = {
--
2.34.1
^ permalink raw reply related [flat|nested] 17+ messages in thread* [PATCH v3 6/6] vfio: Check the presence for iommufd callbacks in __vfio_register_dev()
2023-03-27 9:33 [PATCH v3 0/6] vfio: Make emulated devices prepared for vfio device cdev Yi Liu
` (4 preceding siblings ...)
2023-03-27 9:33 ` [PATCH v3 5/6] vfio/mdev: Uses the vfio emulated iommufd ops set in the mdev sample drivers Yi Liu
@ 2023-03-27 9:33 ` Yi Liu
2023-03-27 17:47 ` [PATCH v3 0/6] vfio: Make emulated devices prepared for vfio device cdev Nicolin Chen
` (3 subsequent siblings)
9 siblings, 0 replies; 17+ messages in thread
From: Yi Liu @ 2023-03-27 9:33 UTC (permalink / raw)
To: alex.williamson, jgg, kevin.tian
Cc: joro, robin.murphy, cohuck, eric.auger, nicolinc, kvm, mjrosato,
chao.p.peng, yi.l.liu, yi.y.sun, peterx, jasowang,
shameerali.kolothum.thodi, lulu, suravee.suthikulpanit,
intel-gvt-dev, intel-gfx, linux-s390, xudong.hao, yan.y.zhao,
terrence.xu, yanting.jiang
After making the no-DMA drivers (samples/vfio-mdev) providing iommufd
callbacks, __vfio_register_dev() should check the presence of the iommufd
callbacks if CONFIG_IOMMUFD is enabled.
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
Tested-by: Terrence Xu <terrence.xu@intel.com>
Signed-off-by: Yi Liu <yi.l.liu@intel.com>
---
drivers/vfio/iommufd.c | 3 ---
drivers/vfio/vfio_main.c | 5 +++--
2 files changed, 3 insertions(+), 5 deletions(-)
diff --git a/drivers/vfio/iommufd.c b/drivers/vfio/iommufd.c
index 890ea101685c..88b00c501015 100644
--- a/drivers/vfio/iommufd.c
+++ b/drivers/vfio/iommufd.c
@@ -32,9 +32,6 @@ int vfio_iommufd_bind(struct vfio_device *vdev, struct iommufd_ctx *ictx)
return 0;
}
- if (WARN_ON(!vdev->ops->bind_iommufd))
- return -ENODEV;
-
ret = vdev->ops->bind_iommufd(vdev, ictx, &device_id);
if (ret)
return ret;
diff --git a/drivers/vfio/vfio_main.c b/drivers/vfio/vfio_main.c
index 43bd6b76e2b6..89497c933490 100644
--- a/drivers/vfio/vfio_main.c
+++ b/drivers/vfio/vfio_main.c
@@ -255,8 +255,9 @@ static int __vfio_register_dev(struct vfio_device *device,
{
int ret;
- if (WARN_ON(device->ops->bind_iommufd &&
- (!device->ops->unbind_iommufd ||
+ if (WARN_ON(IS_ENABLED(CONFIG_IOMMUFD) &&
+ (!device->ops->bind_iommufd ||
+ !device->ops->unbind_iommufd ||
!device->ops->attach_ioas)))
return -EINVAL;
--
2.34.1
^ permalink raw reply related [flat|nested] 17+ messages in thread* Re: [PATCH v3 0/6] vfio: Make emulated devices prepared for vfio device cdev
2023-03-27 9:33 [PATCH v3 0/6] vfio: Make emulated devices prepared for vfio device cdev Yi Liu
` (5 preceding siblings ...)
2023-03-27 9:33 ` [PATCH v3 6/6] vfio: Check the presence for iommufd callbacks in __vfio_register_dev() Yi Liu
@ 2023-03-27 17:47 ` Nicolin Chen
2023-03-29 19:47 ` Jason Gunthorpe
` (2 subsequent siblings)
9 siblings, 0 replies; 17+ messages in thread
From: Nicolin Chen @ 2023-03-27 17:47 UTC (permalink / raw)
To: Yi Liu
Cc: alex.williamson, jgg, kevin.tian, joro, robin.murphy, cohuck,
eric.auger, kvm, mjrosato, chao.p.peng, yi.y.sun, peterx,
jasowang, shameerali.kolothum.thodi, lulu, suravee.suthikulpanit,
intel-gvt-dev, intel-gfx, linux-s390, xudong.hao, yan.y.zhao,
terrence.xu, yanting.jiang
On Mon, Mar 27, 2023 at 02:33:45AM -0700, Yi Liu wrote:
> External email: Use caution opening links or attachments
>
>
> The .bind_iommufd op of vfio emulated devices are either empty or does
> nothing. This is different with the vfio physical devices, to add vfio
> device cdev, need to make them act the same.
>
> This series first makes the .bind_iommufd op of vfio emulated devices
> to create iommufd_access, this introduces a new iommufd API. Then let
> the driver that does not provide .bind_iommufd op to use the vfio emulated
> iommufd op set. This makes all vfio device drivers have consistent iommufd
> operations, which is good for adding new device uAPIs in the device cdev
> series.
>
> Change log:
>
> v3:
> - Use iommufd_get_ioas() for ioas get, hence patch 01 is added to modify
> the input parameter of iommufd_get_ioas(). (Jason)
> - Add r-b from Jason and Kevin
> - Add t-b from Terrence Xu
This runs well with iommufd selftest on x86 and QEMU sanity on
ARM64, applying nesting series on top of this and cdev series:
https://github.com/nicolinc/iommufd/commits/wip/iommufd_nesting-03272023
Tested-by: Nicolin Chen <nicolinc@nvidia.com>
^ permalink raw reply [flat|nested] 17+ messages in thread* Re: [PATCH v3 0/6] vfio: Make emulated devices prepared for vfio device cdev
2023-03-27 9:33 [PATCH v3 0/6] vfio: Make emulated devices prepared for vfio device cdev Yi Liu
` (6 preceding siblings ...)
2023-03-27 17:47 ` [PATCH v3 0/6] vfio: Make emulated devices prepared for vfio device cdev Nicolin Chen
@ 2023-03-29 19:47 ` Jason Gunthorpe
2023-03-30 19:21 ` Alex Williamson
2023-03-31 3:13 ` Jiang, Yanting
2023-03-31 4:57 ` Jiang, Yanting
9 siblings, 1 reply; 17+ messages in thread
From: Jason Gunthorpe @ 2023-03-29 19:47 UTC (permalink / raw)
To: Yi Liu
Cc: alex.williamson, kevin.tian, joro, robin.murphy, cohuck,
eric.auger, nicolinc, kvm, mjrosato, chao.p.peng, yi.y.sun,
peterx, jasowang, shameerali.kolothum.thodi, lulu,
suravee.suthikulpanit, intel-gvt-dev, intel-gfx, linux-s390,
xudong.hao, yan.y.zhao, terrence.xu, yanting.jiang
On Mon, Mar 27, 2023 at 02:33:45AM -0700, Yi Liu wrote:
> Nicolin Chen (1):
> iommufd: Create access in vfio_iommufd_emulated_bind()
>
> Yi Liu (5):
> iommu/iommufd: Pass iommufd_ctx pointer in iommufd_get_ioas()
> vfio-iommufd: No need to record iommufd_ctx in vfio_device
> vfio-iommufd: Make vfio_iommufd_emulated_bind() return iommufd_access
> ID
> vfio/mdev: Uses the vfio emulated iommufd ops set in the mdev sample
> drivers
> vfio: Check the presence for iommufd callbacks in
> __vfio_register_dev()
>
> drivers/iommu/iommufd/device.c | 55 +++++++++++++++----------
> drivers/iommu/iommufd/ioas.c | 14 +++----
> drivers/iommu/iommufd/iommufd_private.h | 4 +-
> drivers/iommu/iommufd/selftest.c | 14 ++++---
> drivers/iommu/iommufd/vfio_compat.c | 2 +-
> drivers/vfio/iommufd.c | 37 ++++++++---------
> drivers/vfio/vfio_main.c | 5 ++-
> include/linux/iommufd.h | 5 ++-
> include/linux/vfio.h | 1 -
> samples/vfio-mdev/mbochs.c | 3 ++
> samples/vfio-mdev/mdpy.c | 3 ++
> samples/vfio-mdev/mtty.c | 3 ++
> 12 files changed, 85 insertions(+), 61 deletions(-)
It looks like most of this is iommufd so I will take it - Ok Alex?
The following cdev patch needs it so I'll stick it on its own branch
and we can sort it out after the reset series is done
Thanls,
Jason
^ permalink raw reply [flat|nested] 17+ messages in thread* Re: [PATCH v3 0/6] vfio: Make emulated devices prepared for vfio device cdev
2023-03-29 19:47 ` Jason Gunthorpe
@ 2023-03-30 19:21 ` Alex Williamson
0 siblings, 0 replies; 17+ messages in thread
From: Alex Williamson @ 2023-03-30 19:21 UTC (permalink / raw)
To: Jason Gunthorpe
Cc: Yi Liu, kevin.tian, joro, robin.murphy, cohuck, eric.auger,
nicolinc, kvm, mjrosato, chao.p.peng, yi.y.sun, peterx, jasowang,
shameerali.kolothum.thodi, lulu, suravee.suthikulpanit,
intel-gvt-dev, intel-gfx, linux-s390, xudong.hao, yan.y.zhao,
terrence.xu, yanting.jiang
On Wed, 29 Mar 2023 16:47:39 -0300
Jason Gunthorpe <jgg@nvidia.com> wrote:
> On Mon, Mar 27, 2023 at 02:33:45AM -0700, Yi Liu wrote:
> > Nicolin Chen (1):
> > iommufd: Create access in vfio_iommufd_emulated_bind()
> >
> > Yi Liu (5):
> > iommu/iommufd: Pass iommufd_ctx pointer in iommufd_get_ioas()
> > vfio-iommufd: No need to record iommufd_ctx in vfio_device
> > vfio-iommufd: Make vfio_iommufd_emulated_bind() return iommufd_access
> > ID
> > vfio/mdev: Uses the vfio emulated iommufd ops set in the mdev sample
> > drivers
> > vfio: Check the presence for iommufd callbacks in
> > __vfio_register_dev()
> >
> > drivers/iommu/iommufd/device.c | 55 +++++++++++++++----------
> > drivers/iommu/iommufd/ioas.c | 14 +++----
> > drivers/iommu/iommufd/iommufd_private.h | 4 +-
> > drivers/iommu/iommufd/selftest.c | 14 ++++---
> > drivers/iommu/iommufd/vfio_compat.c | 2 +-
> > drivers/vfio/iommufd.c | 37 ++++++++---------
> > drivers/vfio/vfio_main.c | 5 ++-
> > include/linux/iommufd.h | 5 ++-
> > include/linux/vfio.h | 1 -
> > samples/vfio-mdev/mbochs.c | 3 ++
> > samples/vfio-mdev/mdpy.c | 3 ++
> > samples/vfio-mdev/mtty.c | 3 ++
> > 12 files changed, 85 insertions(+), 61 deletions(-)
>
> It looks like most of this is iommufd so I will take it - Ok Alex?
>
> The following cdev patch needs it so I'll stick it on its own branch
> and we can sort it out after the reset series is done
Ok
Acked-by: Alex Williamson <alex.williamson@redhat.com>
^ permalink raw reply [flat|nested] 17+ messages in thread
* RE: [PATCH v3 0/6] vfio: Make emulated devices prepared for vfio device cdev
2023-03-27 9:33 [PATCH v3 0/6] vfio: Make emulated devices prepared for vfio device cdev Yi Liu
` (7 preceding siblings ...)
2023-03-29 19:47 ` Jason Gunthorpe
@ 2023-03-31 3:13 ` Jiang, Yanting
2023-03-31 4:57 ` Jiang, Yanting
9 siblings, 0 replies; 17+ messages in thread
From: Jiang, Yanting @ 2023-03-31 3:13 UTC (permalink / raw)
To: Liu, Yi L, alex.williamson@redhat.com, jgg@nvidia.com,
Tian, Kevin
Cc: joro@8bytes.org, 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,
intel-gvt-dev@lists.freedesktop.org,
intel-gfx@lists.freedesktop.org, linux-s390@vger.kernel.org,
Hao, Xudong, Zhao, Yan Y, Xu, Terrence
>
> The .bind_iommufd op of vfio emulated devices are either empty or does
> nothing. This is different with the vfio physical devices, to add vfio device cdev,
> need to make them act the same.
>
> This series first makes the .bind_iommufd op of vfio emulated devices to create
> iommufd_access, this introduces a new iommufd API. Then let the driver that
> does not provide .bind_iommufd op to use the vfio emulated iommufd op set.
> This makes all vfio device drivers have consistent iommufd operations, which is
> good for adding new device uAPIs in the device cdev series.
>
Tested NIC passthrough on Intel platform.
Result looks good hence,
Tested by: Jiang, Yanting <yanting.jiang@intel.com>
Thanks,
Yanting
^ permalink raw reply [flat|nested] 17+ messages in thread* RE: [PATCH v3 0/6] vfio: Make emulated devices prepared for vfio device cdev
2023-03-27 9:33 [PATCH v3 0/6] vfio: Make emulated devices prepared for vfio device cdev Yi Liu
` (8 preceding siblings ...)
2023-03-31 3:13 ` Jiang, Yanting
@ 2023-03-31 4:57 ` Jiang, Yanting
9 siblings, 0 replies; 17+ messages in thread
From: Jiang, Yanting @ 2023-03-31 4:57 UTC (permalink / raw)
To: Liu, Yi L, alex.williamson@redhat.com, jgg@nvidia.com,
Tian, Kevin
Cc: joro@8bytes.org, 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,
intel-gvt-dev@lists.freedesktop.org,
intel-gfx@lists.freedesktop.org, linux-s390@vger.kernel.org,
Hao, Xudong, Zhao, Yan Y, Xu, Terrence
> The .bind_iommufd op of vfio emulated devices are either empty or does
> nothing. This is different with the vfio physical devices, to add vfio device cdev,
> need to make them act the same.
>
> This series first makes the .bind_iommufd op of vfio emulated devices to create
> iommufd_access, this introduces a new iommufd API. Then let the driver that
> does not provide .bind_iommufd op to use the vfio emulated iommufd op set.
> This makes all vfio device drivers have consistent iommufd operations, which is
> good for adding new device uAPIs in the device cdev series.
>
Tested-by: Yanting Jiang <yanting.jiang@intel.com>
Thanks,
Yanting
^ permalink raw reply [flat|nested] 17+ messages in thread