Commit 8c4dc1a5 authored by Pranjal Shrivastava's avatar Pranjal Shrivastava Committed by Jason Gunthorpe
Browse files

iommufd/selftest: Remove MOCK_IOMMUPT_AMDV1 format

syzbot found that allocating a mock domain with AMDV1 format could
cause a WARN_ON because the selftest enabled DYNAMIC_TOP without
providing the required driver_ops.

The AMDV1 format in the selftest was a placeholder and was not actually
used by any of the existing selftests. Instead of adding dummy
driver_ops to satisfy the requirements of a format we don't currently
test, remove the AMDV1 format option from the selftest.

The MOCK_IOMMUPT_DEFAULT and MOCK_IOMMUPT_HUGE formats are unaffected as
they use the amdv1_mock variant which does not enable DYNAMIC_TOP.

Fixes: dcd6a011 ("iommupt: Add map_pages op")
Link: https://patch.msgid.link/r/20260330092609.2659235-1-praan@google.com


Reported-by: default avatar <syzbot+453eb7add07c3767adab@syzkaller.appspotmail.com>
Closes: https://lore.kernel.org/all/69c1d50b.a70a0220.3cae05.0001.GAE@google.com/


Signed-off-by: default avatarPranjal Shrivastava <praan@google.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
parent aaca2aa9
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -36,7 +36,6 @@ enum {
enum {
	MOCK_IOMMUPT_DEFAULT = 0,
	MOCK_IOMMUPT_HUGE,
	MOCK_IOMMUPT_AMDV1,
};

/* These values are true for MOCK_IOMMUPT_DEFAULT */
+0 −31
Original line number Diff line number Diff line
@@ -421,19 +421,6 @@ static const struct iommu_dirty_ops amdv1_mock_dirty_ops = {
	.set_dirty_tracking = mock_domain_set_dirty_tracking,
};

static const struct iommu_domain_ops amdv1_ops = {
	IOMMU_PT_DOMAIN_OPS(amdv1),
	.free = mock_domain_free,
	.attach_dev = mock_domain_nop_attach,
	.set_dev_pasid = mock_domain_set_dev_pasid_nop,
	.iotlb_sync = &mock_iotlb_sync,
};

static const struct iommu_dirty_ops amdv1_dirty_ops = {
	IOMMU_PT_DIRTY_OPS(amdv1),
	.set_dirty_tracking = mock_domain_set_dirty_tracking,
};

static struct mock_iommu_domain *
mock_domain_alloc_pgtable(struct device *dev,
			  const struct iommu_hwpt_selftest *user_cfg, u32 flags)
@@ -477,24 +464,6 @@ mock_domain_alloc_pgtable(struct device *dev,
			mock->domain.dirty_ops = &amdv1_mock_dirty_ops;
		break;
	}

	case MOCK_IOMMUPT_AMDV1: {
		struct pt_iommu_amdv1_cfg cfg = {};

		cfg.common.hw_max_vasz_lg2 = 64;
		cfg.common.hw_max_oasz_lg2 = 52;
		cfg.common.features = BIT(PT_FEAT_DYNAMIC_TOP) |
				      BIT(PT_FEAT_AMDV1_ENCRYPT_TABLES) |
				      BIT(PT_FEAT_AMDV1_FORCE_COHERENCE);
		cfg.starting_level = 2;
		mock->domain.ops = &amdv1_ops;
		rc = pt_iommu_amdv1_init(&mock->amdv1, &cfg, GFP_KERNEL);
		if (rc)
			goto err_free;
		if (flags & IOMMU_HWPT_ALLOC_DIRTY_TRACKING)
			mock->domain.dirty_ops = &amdv1_dirty_ops;
		break;
	}
	default:
		rc = -EOPNOTSUPP;
		goto err_free;