mirror of
https://github.com/torvalds/linux.git
synced 2026-05-30 10:04:04 +02:00
iommufd/selftest: Add IOMMU_TEST_OP_DEV_CHECK_CACHE test command
Similar to IOMMU_TEST_OP_MD_CHECK_IOTLB verifying a mock_domain's iotlb, IOMMU_TEST_OP_DEV_CHECK_CACHE will be used to verify a mock_dev's cache. Link: https://patch.msgid.link/r/cd4082079d75427bd67ed90c3c825e15b5720a5f.1730836308.git.nicolinc@nvidia.com Reviewed-by: Kevin Tian <kevin.tian@intel.com> Reviewed-by: Jason Gunthorpe <jgg@nvidia.com> Signed-off-by: Nicolin Chen <nicolinc@nvidia.com> Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
This commit is contained in:
parent
d6563aa2a8
commit
576ad6eb45
|
|
@ -23,6 +23,7 @@ enum {
|
|||
IOMMU_TEST_OP_DIRTY,
|
||||
IOMMU_TEST_OP_MD_CHECK_IOTLB,
|
||||
IOMMU_TEST_OP_TRIGGER_IOPF,
|
||||
IOMMU_TEST_OP_DEV_CHECK_CACHE,
|
||||
};
|
||||
|
||||
enum {
|
||||
|
|
@ -140,6 +141,10 @@ struct iommu_test_cmd {
|
|||
__u32 perm;
|
||||
__u64 addr;
|
||||
} trigger_iopf;
|
||||
struct {
|
||||
__u32 id;
|
||||
__u32 cache;
|
||||
} check_dev_cache;
|
||||
};
|
||||
__u32 last;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1125,6 +1125,24 @@ static int iommufd_test_md_check_iotlb(struct iommufd_ucmd *ucmd,
|
|||
return rc;
|
||||
}
|
||||
|
||||
static int iommufd_test_dev_check_cache(struct iommufd_ucmd *ucmd, u32 idev_id,
|
||||
unsigned int cache_id, u32 cache)
|
||||
{
|
||||
struct iommufd_device *idev;
|
||||
struct mock_dev *mdev;
|
||||
int rc = 0;
|
||||
|
||||
idev = iommufd_get_device(ucmd, idev_id);
|
||||
if (IS_ERR(idev))
|
||||
return PTR_ERR(idev);
|
||||
mdev = container_of(idev->dev, struct mock_dev, dev);
|
||||
|
||||
if (cache_id > MOCK_DEV_CACHE_ID_MAX || mdev->cache[cache_id] != cache)
|
||||
rc = -EINVAL;
|
||||
iommufd_put_object(ucmd->ictx, &idev->obj);
|
||||
return rc;
|
||||
}
|
||||
|
||||
struct selftest_access {
|
||||
struct iommufd_access *access;
|
||||
struct file *file;
|
||||
|
|
@ -1634,6 +1652,10 @@ int iommufd_test(struct iommufd_ucmd *ucmd)
|
|||
return iommufd_test_md_check_iotlb(ucmd, cmd->id,
|
||||
cmd->check_iotlb.id,
|
||||
cmd->check_iotlb.iotlb);
|
||||
case IOMMU_TEST_OP_DEV_CHECK_CACHE:
|
||||
return iommufd_test_dev_check_cache(ucmd, cmd->id,
|
||||
cmd->check_dev_cache.id,
|
||||
cmd->check_dev_cache.cache);
|
||||
case IOMMU_TEST_OP_CREATE_ACCESS:
|
||||
return iommufd_test_create_access(ucmd, cmd->id,
|
||||
cmd->create_access.flags);
|
||||
|
|
|
|||
|
|
@ -227,6 +227,8 @@ FIXTURE_SETUP(iommufd_ioas)
|
|||
for (i = 0; i != variant->mock_domains; i++) {
|
||||
test_cmd_mock_domain(self->ioas_id, &self->stdev_id,
|
||||
&self->hwpt_id, &self->device_id);
|
||||
test_cmd_dev_check_cache_all(self->device_id,
|
||||
IOMMU_TEST_DEV_CACHE_DEFAULT);
|
||||
self->base_iova = MOCK_APERTURE_START;
|
||||
}
|
||||
}
|
||||
|
|
@ -1392,9 +1394,12 @@ FIXTURE_SETUP(iommufd_mock_domain)
|
|||
|
||||
ASSERT_GE(ARRAY_SIZE(self->hwpt_ids), variant->mock_domains);
|
||||
|
||||
for (i = 0; i != variant->mock_domains; i++)
|
||||
for (i = 0; i != variant->mock_domains; i++) {
|
||||
test_cmd_mock_domain(self->ioas_id, &self->stdev_ids[i],
|
||||
&self->hwpt_ids[i], &self->idev_ids[i]);
|
||||
test_cmd_dev_check_cache_all(self->idev_ids[0],
|
||||
IOMMU_TEST_DEV_CACHE_DEFAULT);
|
||||
}
|
||||
self->hwpt_id = self->hwpt_ids[0];
|
||||
|
||||
self->mmap_flags = MAP_SHARED | MAP_ANONYMOUS;
|
||||
|
|
|
|||
|
|
@ -250,6 +250,30 @@ static int _test_cmd_hwpt_alloc(int fd, __u32 device_id, __u32 pt_id, __u32 ft_i
|
|||
test_cmd_hwpt_check_iotlb(hwpt_id, i, expected); \
|
||||
})
|
||||
|
||||
#define test_cmd_dev_check_cache(device_id, cache_id, expected) \
|
||||
({ \
|
||||
struct iommu_test_cmd test_cmd = { \
|
||||
.size = sizeof(test_cmd), \
|
||||
.op = IOMMU_TEST_OP_DEV_CHECK_CACHE, \
|
||||
.id = device_id, \
|
||||
.check_dev_cache = { \
|
||||
.id = cache_id, \
|
||||
.cache = expected, \
|
||||
}, \
|
||||
}; \
|
||||
ASSERT_EQ(0, ioctl(self->fd, \
|
||||
_IOMMU_TEST_CMD( \
|
||||
IOMMU_TEST_OP_DEV_CHECK_CACHE), \
|
||||
&test_cmd)); \
|
||||
})
|
||||
|
||||
#define test_cmd_dev_check_cache_all(device_id, expected) \
|
||||
({ \
|
||||
int c; \
|
||||
for (c = 0; c < MOCK_DEV_CACHE_NUM; c++) \
|
||||
test_cmd_dev_check_cache(device_id, c, expected); \
|
||||
})
|
||||
|
||||
static int _test_cmd_hwpt_invalidate(int fd, __u32 hwpt_id, void *reqs,
|
||||
uint32_t data_type, uint32_t lreq,
|
||||
uint32_t *nreqs)
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user