iommufd/selftest: Add container_of helpers
Use these inline helpers to shorten those container_of lines. Note that one of them goes back and forth between iommu_domain and mock_iommu_domain, which isn't necessary. So drop its container_of. Link: https://patch.msgid.link/r/518ec64dae2e814eb29fd9f170f58a3aad56c81c.1730836219.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:
committed by
Jason Gunthorpe
parent
13a750180f
commit
fd6b853f50
@@ -126,12 +126,24 @@ struct mock_iommu_domain {
|
||||
struct xarray pfns;
|
||||
};
|
||||
|
||||
static inline struct mock_iommu_domain *
|
||||
to_mock_domain(struct iommu_domain *domain)
|
||||
{
|
||||
return container_of(domain, struct mock_iommu_domain, domain);
|
||||
}
|
||||
|
||||
struct mock_iommu_domain_nested {
|
||||
struct iommu_domain domain;
|
||||
struct mock_iommu_domain *parent;
|
||||
u32 iotlb[MOCK_NESTED_DOMAIN_IOTLB_NUM];
|
||||
};
|
||||
|
||||
static inline struct mock_iommu_domain_nested *
|
||||
to_mock_nested(struct iommu_domain *domain)
|
||||
{
|
||||
return container_of(domain, struct mock_iommu_domain_nested, domain);
|
||||
}
|
||||
|
||||
enum selftest_obj_type {
|
||||
TYPE_IDEV,
|
||||
};
|
||||
@@ -142,6 +154,11 @@ struct mock_dev {
|
||||
int id;
|
||||
};
|
||||
|
||||
static inline struct mock_dev *to_mock_dev(struct device *dev)
|
||||
{
|
||||
return container_of(dev, struct mock_dev, dev);
|
||||
}
|
||||
|
||||
struct selftest_obj {
|
||||
struct iommufd_object obj;
|
||||
enum selftest_obj_type type;
|
||||
@@ -155,10 +172,15 @@ struct selftest_obj {
|
||||
};
|
||||
};
|
||||
|
||||
static inline struct selftest_obj *to_selftest_obj(struct iommufd_object *obj)
|
||||
{
|
||||
return container_of(obj, struct selftest_obj, obj);
|
||||
}
|
||||
|
||||
static int mock_domain_nop_attach(struct iommu_domain *domain,
|
||||
struct device *dev)
|
||||
{
|
||||
struct mock_dev *mdev = container_of(dev, struct mock_dev, dev);
|
||||
struct mock_dev *mdev = to_mock_dev(dev);
|
||||
|
||||
if (domain->dirty_ops && (mdev->flags & MOCK_FLAGS_DEVICE_NO_DIRTY))
|
||||
return -EINVAL;
|
||||
@@ -193,8 +215,7 @@ static void *mock_domain_hw_info(struct device *dev, u32 *length, u32 *type)
|
||||
static int mock_domain_set_dirty_tracking(struct iommu_domain *domain,
|
||||
bool enable)
|
||||
{
|
||||
struct mock_iommu_domain *mock =
|
||||
container_of(domain, struct mock_iommu_domain, domain);
|
||||
struct mock_iommu_domain *mock = to_mock_domain(domain);
|
||||
unsigned long flags = mock->flags;
|
||||
|
||||
if (enable && !domain->dirty_ops)
|
||||
@@ -243,8 +264,7 @@ static int mock_domain_read_and_clear_dirty(struct iommu_domain *domain,
|
||||
unsigned long flags,
|
||||
struct iommu_dirty_bitmap *dirty)
|
||||
{
|
||||
struct mock_iommu_domain *mock =
|
||||
container_of(domain, struct mock_iommu_domain, domain);
|
||||
struct mock_iommu_domain *mock = to_mock_domain(domain);
|
||||
unsigned long end = iova + size;
|
||||
void *ent;
|
||||
|
||||
@@ -281,7 +301,7 @@ static const struct iommu_dirty_ops dirty_ops = {
|
||||
|
||||
static struct iommu_domain *mock_domain_alloc_paging(struct device *dev)
|
||||
{
|
||||
struct mock_dev *mdev = container_of(dev, struct mock_dev, dev);
|
||||
struct mock_dev *mdev = to_mock_dev(dev);
|
||||
struct mock_iommu_domain *mock;
|
||||
|
||||
mock = kzalloc(sizeof(*mock), GFP_KERNEL);
|
||||
@@ -327,7 +347,7 @@ mock_domain_alloc_user(struct device *dev, u32 flags,
|
||||
|
||||
/* must be mock_domain */
|
||||
if (!parent) {
|
||||
struct mock_dev *mdev = container_of(dev, struct mock_dev, dev);
|
||||
struct mock_dev *mdev = to_mock_dev(dev);
|
||||
bool has_dirty_flag = flags & IOMMU_HWPT_ALLOC_DIRTY_TRACKING;
|
||||
bool no_dirty_ops = mdev->flags & MOCK_FLAGS_DEVICE_NO_DIRTY;
|
||||
struct iommu_domain *domain;
|
||||
@@ -341,8 +361,7 @@ mock_domain_alloc_user(struct device *dev, u32 flags,
|
||||
if (!domain)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
if (has_dirty_flag)
|
||||
container_of(domain, struct mock_iommu_domain, domain)
|
||||
->domain.dirty_ops = &dirty_ops;
|
||||
domain->dirty_ops = &dirty_ops;
|
||||
return domain;
|
||||
}
|
||||
|
||||
@@ -352,7 +371,7 @@ mock_domain_alloc_user(struct device *dev, u32 flags,
|
||||
if (!parent || parent->ops != mock_ops.default_domain_ops)
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
mock_parent = container_of(parent, struct mock_iommu_domain, domain);
|
||||
mock_parent = to_mock_domain(parent);
|
||||
if (!mock_parent)
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
@@ -366,8 +385,7 @@ mock_domain_alloc_user(struct device *dev, u32 flags,
|
||||
|
||||
static void mock_domain_free(struct iommu_domain *domain)
|
||||
{
|
||||
struct mock_iommu_domain *mock =
|
||||
container_of(domain, struct mock_iommu_domain, domain);
|
||||
struct mock_iommu_domain *mock = to_mock_domain(domain);
|
||||
|
||||
WARN_ON(!xa_empty(&mock->pfns));
|
||||
kfree(mock);
|
||||
@@ -378,8 +396,7 @@ static int mock_domain_map_pages(struct iommu_domain *domain,
|
||||
size_t pgsize, size_t pgcount, int prot,
|
||||
gfp_t gfp, size_t *mapped)
|
||||
{
|
||||
struct mock_iommu_domain *mock =
|
||||
container_of(domain, struct mock_iommu_domain, domain);
|
||||
struct mock_iommu_domain *mock = to_mock_domain(domain);
|
||||
unsigned long flags = MOCK_PFN_START_IOVA;
|
||||
unsigned long start_iova = iova;
|
||||
|
||||
@@ -430,8 +447,7 @@ static size_t mock_domain_unmap_pages(struct iommu_domain *domain,
|
||||
size_t pgcount,
|
||||
struct iommu_iotlb_gather *iotlb_gather)
|
||||
{
|
||||
struct mock_iommu_domain *mock =
|
||||
container_of(domain, struct mock_iommu_domain, domain);
|
||||
struct mock_iommu_domain *mock = to_mock_domain(domain);
|
||||
bool first = true;
|
||||
size_t ret = 0;
|
||||
void *ent;
|
||||
@@ -479,8 +495,7 @@ static size_t mock_domain_unmap_pages(struct iommu_domain *domain,
|
||||
static phys_addr_t mock_domain_iova_to_phys(struct iommu_domain *domain,
|
||||
dma_addr_t iova)
|
||||
{
|
||||
struct mock_iommu_domain *mock =
|
||||
container_of(domain, struct mock_iommu_domain, domain);
|
||||
struct mock_iommu_domain *mock = to_mock_domain(domain);
|
||||
void *ent;
|
||||
|
||||
WARN_ON(iova % MOCK_IO_PAGE_SIZE);
|
||||
@@ -491,7 +506,7 @@ static phys_addr_t mock_domain_iova_to_phys(struct iommu_domain *domain,
|
||||
|
||||
static bool mock_domain_capable(struct device *dev, enum iommu_cap cap)
|
||||
{
|
||||
struct mock_dev *mdev = container_of(dev, struct mock_dev, dev);
|
||||
struct mock_dev *mdev = to_mock_dev(dev);
|
||||
|
||||
switch (cap) {
|
||||
case IOMMU_CAP_CACHE_COHERENCY:
|
||||
@@ -571,18 +586,14 @@ static const struct iommu_ops mock_ops = {
|
||||
|
||||
static void mock_domain_free_nested(struct iommu_domain *domain)
|
||||
{
|
||||
struct mock_iommu_domain_nested *mock_nested =
|
||||
container_of(domain, struct mock_iommu_domain_nested, domain);
|
||||
|
||||
kfree(mock_nested);
|
||||
kfree(to_mock_nested(domain));
|
||||
}
|
||||
|
||||
static int
|
||||
mock_domain_cache_invalidate_user(struct iommu_domain *domain,
|
||||
struct iommu_user_data_array *array)
|
||||
{
|
||||
struct mock_iommu_domain_nested *mock_nested =
|
||||
container_of(domain, struct mock_iommu_domain_nested, domain);
|
||||
struct mock_iommu_domain_nested *mock_nested = to_mock_nested(domain);
|
||||
struct iommu_hwpt_invalidate_selftest inv;
|
||||
u32 processed = 0;
|
||||
int i = 0, j;
|
||||
@@ -657,7 +668,7 @@ get_md_pagetable(struct iommufd_ucmd *ucmd, u32 mockpt_id,
|
||||
iommufd_put_object(ucmd->ictx, &hwpt->obj);
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
*mock = container_of(hwpt->domain, struct mock_iommu_domain, domain);
|
||||
*mock = to_mock_domain(hwpt->domain);
|
||||
return hwpt;
|
||||
}
|
||||
|
||||
@@ -675,14 +686,13 @@ get_md_pagetable_nested(struct iommufd_ucmd *ucmd, u32 mockpt_id,
|
||||
iommufd_put_object(ucmd->ictx, &hwpt->obj);
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
*mock_nested = container_of(hwpt->domain,
|
||||
struct mock_iommu_domain_nested, domain);
|
||||
*mock_nested = to_mock_nested(hwpt->domain);
|
||||
return hwpt;
|
||||
}
|
||||
|
||||
static void mock_dev_release(struct device *dev)
|
||||
{
|
||||
struct mock_dev *mdev = container_of(dev, struct mock_dev, dev);
|
||||
struct mock_dev *mdev = to_mock_dev(dev);
|
||||
|
||||
ida_free(&mock_dev_ida, mdev->id);
|
||||
kfree(mdev);
|
||||
@@ -813,7 +823,7 @@ static int iommufd_test_mock_domain_replace(struct iommufd_ucmd *ucmd,
|
||||
if (IS_ERR(dev_obj))
|
||||
return PTR_ERR(dev_obj);
|
||||
|
||||
sobj = container_of(dev_obj, struct selftest_obj, obj);
|
||||
sobj = to_selftest_obj(dev_obj);
|
||||
if (sobj->type != TYPE_IDEV) {
|
||||
rc = -EINVAL;
|
||||
goto out_dev_obj;
|
||||
@@ -951,8 +961,7 @@ static int iommufd_test_md_check_iotlb(struct iommufd_ucmd *ucmd,
|
||||
if (IS_ERR(hwpt))
|
||||
return PTR_ERR(hwpt);
|
||||
|
||||
mock_nested = container_of(hwpt->domain,
|
||||
struct mock_iommu_domain_nested, domain);
|
||||
mock_nested = to_mock_nested(hwpt->domain);
|
||||
|
||||
if (iotlb_id > MOCK_NESTED_DOMAIN_IOTLB_ID_MAX ||
|
||||
mock_nested->iotlb[iotlb_id] != iotlb)
|
||||
@@ -1431,7 +1440,7 @@ static int iommufd_test_trigger_iopf(struct iommufd_ucmd *ucmd,
|
||||
|
||||
void iommufd_selftest_destroy(struct iommufd_object *obj)
|
||||
{
|
||||
struct selftest_obj *sobj = container_of(obj, struct selftest_obj, obj);
|
||||
struct selftest_obj *sobj = to_selftest_obj(obj);
|
||||
|
||||
switch (sobj->type) {
|
||||
case TYPE_IDEV:
|
||||
|
||||
Reference in New Issue
Block a user