iommufd/selftest: Add IOMMU_TEST_OP_TRIGGER_VEVENT for vEVENTQ coverage
The handler will get vDEVICE object from the given mdev and convert it to its per-vIOMMU virtual ID to mimic a real IOMMU driver. Link: https://patch.msgid.link/r/1ea874d20e56d65e7cfd6e0e8e01bd3dbd038761.1741719725.git.nicolinc@nvidia.com Reviewed-by: Kevin Tian <kevin.tian@intel.com> Signed-off-by: Nicolin Chen <nicolinc@nvidia.com> Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
This commit is contained in:
committed by
Jason Gunthorpe
parent
941d0719aa
commit
b3cc0b7599
@@ -24,6 +24,7 @@ enum {
|
||||
IOMMU_TEST_OP_MD_CHECK_IOTLB,
|
||||
IOMMU_TEST_OP_TRIGGER_IOPF,
|
||||
IOMMU_TEST_OP_DEV_CHECK_CACHE,
|
||||
IOMMU_TEST_OP_TRIGGER_VEVENT,
|
||||
};
|
||||
|
||||
enum {
|
||||
@@ -145,6 +146,9 @@ struct iommu_test_cmd {
|
||||
__u32 id;
|
||||
__u32 cache;
|
||||
} check_dev_cache;
|
||||
struct {
|
||||
__u32 dev_id;
|
||||
} trigger_vevent;
|
||||
};
|
||||
__u32 last;
|
||||
};
|
||||
@@ -212,4 +216,10 @@ struct iommu_viommu_invalidate_selftest {
|
||||
__u32 cache_id;
|
||||
};
|
||||
|
||||
#define IOMMU_VEVENTQ_TYPE_SELFTEST 0xbeefbeef
|
||||
|
||||
struct iommu_viommu_event_selftest {
|
||||
__u32 virt_id;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1621,6 +1621,34 @@ static int iommufd_test_trigger_iopf(struct iommufd_ucmd *ucmd,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int iommufd_test_trigger_vevent(struct iommufd_ucmd *ucmd,
|
||||
struct iommu_test_cmd *cmd)
|
||||
{
|
||||
struct iommu_viommu_event_selftest test = {};
|
||||
struct iommufd_device *idev;
|
||||
struct mock_dev *mdev;
|
||||
int rc = -ENOENT;
|
||||
|
||||
idev = iommufd_get_device(ucmd, cmd->trigger_vevent.dev_id);
|
||||
if (IS_ERR(idev))
|
||||
return PTR_ERR(idev);
|
||||
mdev = to_mock_dev(idev->dev);
|
||||
|
||||
down_read(&mdev->viommu_rwsem);
|
||||
if (!mdev->viommu || !mdev->vdev_id)
|
||||
goto out_unlock;
|
||||
|
||||
test.virt_id = mdev->vdev_id;
|
||||
rc = iommufd_viommu_report_event(&mdev->viommu->core,
|
||||
IOMMU_VEVENTQ_TYPE_SELFTEST, &test,
|
||||
sizeof(test));
|
||||
out_unlock:
|
||||
up_read(&mdev->viommu_rwsem);
|
||||
iommufd_put_object(ucmd->ictx, &idev->obj);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
void iommufd_selftest_destroy(struct iommufd_object *obj)
|
||||
{
|
||||
struct selftest_obj *sobj = to_selftest_obj(obj);
|
||||
@@ -1702,6 +1730,8 @@ int iommufd_test(struct iommufd_ucmd *ucmd)
|
||||
cmd->dirty.flags);
|
||||
case IOMMU_TEST_OP_TRIGGER_IOPF:
|
||||
return iommufd_test_trigger_iopf(ucmd, cmd);
|
||||
case IOMMU_TEST_OP_TRIGGER_VEVENT:
|
||||
return iommufd_test_trigger_vevent(ucmd, cmd);
|
||||
default:
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user