diff mbox series

[14/14] iommufd/selftest: Add a selftest for IOMMU_HWPT_ALLOC

Message ID 14-v1-7612f88c19f5+2f21-iommufd_alloc_jgg@nvidia.com (mailing list archive)
State New
Headers show
Series Add iommufd physical device operations for replace and alloc hwpt | expand

Commit Message

Jason Gunthorpe Feb. 25, 2023, 12:27 a.m. UTC
Test the basic flow.

Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
---
 tools/testing/selftests/iommu/iommufd.c       | 15 +++++++++++++
 .../selftests/iommu/iommufd_fail_nth.c        | 11 +++++++++-
 tools/testing/selftests/iommu/iommufd_utils.h | 21 +++++++++++++++++++
 3 files changed, 46 insertions(+), 1 deletion(-)

Comments

Nicolin Chen Feb. 26, 2023, 7:29 p.m. UTC | #1
On Fri, Feb 24, 2023 at 08:27:59PM -0400, Jason Gunthorpe wrote:
  
> +static int _test_cmd_hwpt_alloc(int fd, __u32 device_id, __u32 pt_id,
> +					 __u32 *hwpt_id)
> +{
> +	struct iommu_hwpt_alloc cmd = {
> +		.size = sizeof(cmd),
> +		.dev_id = device_id,
> +		.pt_id = pt_id,
> +	};
> +	int ret;

Can we do "s/device_id/idev_id" to differentiate it from the
"device_id" being used for a selftest device object?

Thanks
Nic
Jason Gunthorpe Feb. 27, 2023, 3:02 p.m. UTC | #2
On Sun, Feb 26, 2023 at 11:29:55AM -0800, Nicolin Chen wrote:
> On Fri, Feb 24, 2023 at 08:27:59PM -0400, Jason Gunthorpe wrote:
>   
> > +static int _test_cmd_hwpt_alloc(int fd, __u32 device_id, __u32 pt_id,
> > +					 __u32 *hwpt_id)
> > +{
> > +	struct iommu_hwpt_alloc cmd = {
> > +		.size = sizeof(cmd),
> > +		.dev_id = device_id,
> > +		.pt_id = pt_id,
> > +	};
> > +	int ret;
> 
> Can we do "s/device_id/idev_id" to differentiate it from the
> "device_id" being used for a selftest device object?

I renamed the selftest device object to 'stdev_id' instead

Jason
Nicolin Chen Feb. 28, 2023, 12:17 a.m. UTC | #3
On Mon, Feb 27, 2023 at 11:02:32AM -0400, Jason Gunthorpe wrote:
> On Sun, Feb 26, 2023 at 11:29:55AM -0800, Nicolin Chen wrote:
> > On Fri, Feb 24, 2023 at 08:27:59PM -0400, Jason Gunthorpe wrote:
> >   
> > > +static int _test_cmd_hwpt_alloc(int fd, __u32 device_id, __u32 pt_id,
> > > +					 __u32 *hwpt_id)
> > > +{
> > > +	struct iommu_hwpt_alloc cmd = {
> > > +		.size = sizeof(cmd),
> > > +		.dev_id = device_id,
> > > +		.pt_id = pt_id,
> > > +	};
> > > +	int ret;
> > 
> > Can we do "s/device_id/idev_id" to differentiate it from the
> > "device_id" being used for a selftest device object?
> 
> I renamed the selftest device object to 'stdev_id' instead

Cool. I will pull-rebase.

Thanks
Nic
diff mbox series

Patch

diff --git a/tools/testing/selftests/iommu/iommufd.c b/tools/testing/selftests/iommu/iommufd.c
index 7e6fe263e1b62e..65f1847de5a542 100644
--- a/tools/testing/selftests/iommu/iommufd.c
+++ b/tools/testing/selftests/iommu/iommufd.c
@@ -1307,6 +1307,21 @@  TEST_F(iommufd_mock_domain, replace)
 	test_ioctl_destroy(ioas_id);
 }
 
+TEST_F(iommufd_mock_domain, alloc_hwpt)
+{
+	int i;
+
+	for (i = 0; i != variant->mock_domains; i++) {
+		uint32_t hwpt_id;
+		uint32_t device_id;
+
+		test_cmd_hwpt_alloc(self->idev_ids[0], self->ioas_id, &hwpt_id);
+		test_cmd_mock_domain(hwpt_id, &device_id, NULL, NULL);
+		test_ioctl_destroy(device_id);
+		test_ioctl_destroy(hwpt_id);
+	}
+}
+
 /* VFIO compatibility IOCTLs */
 
 TEST_F(iommufd, simple_ioctls)
diff --git a/tools/testing/selftests/iommu/iommufd_fail_nth.c b/tools/testing/selftests/iommu/iommufd_fail_nth.c
index f2012db43fbc16..5f293825fc37a0 100644
--- a/tools/testing/selftests/iommu/iommufd_fail_nth.c
+++ b/tools/testing/selftests/iommu/iommufd_fail_nth.c
@@ -582,6 +582,8 @@  TEST_FAIL_NTH(basic_fail_nth, device)
 	uint32_t ioas_id;
 	uint32_t ioas_id2;
 	uint32_t device_id;
+	uint32_t idev_id;
+	uint32_t hwpt_id;
 
 	self->fd = open("/dev/iommu", O_RDWR);
 	if (self->fd == -1)
@@ -595,11 +597,18 @@  TEST_FAIL_NTH(basic_fail_nth, device)
 
 	fail_nth_enable();
 
-	if (_test_cmd_mock_domain(self->fd, ioas_id, &device_id, NULL, NULL))
+	if (_test_cmd_mock_domain(self->fd, ioas_id, &device_id, NULL,
+				  &idev_id))
+		return -1;
+
+	if (_test_cmd_hwpt_alloc(self->fd, idev_id, ioas_id, &hwpt_id))
 		return -1;
 
 	if (_test_cmd_mock_domain_replace(self->fd, device_id, ioas_id2, NULL))
 		return -1;
+
+	if (_test_cmd_mock_domain_replace(self->fd, device_id, hwpt_id, NULL))
+		return -1;
 	return 0;
 }
 
diff --git a/tools/testing/selftests/iommu/iommufd_utils.h b/tools/testing/selftests/iommu/iommufd_utils.h
index 807a2421121b51..bc0ca8973e7951 100644
--- a/tools/testing/selftests/iommu/iommufd_utils.h
+++ b/tools/testing/selftests/iommu/iommufd_utils.h
@@ -96,6 +96,27 @@  static int _test_cmd_mock_domain_replace(int fd, __u32 device_id, __u32 pt_id,
 	EXPECT_ERRNO(_errno, _test_cmd_mock_domain_replace(    \
 				     self->fd, device_id, pt_id, NULL))
 
+static int _test_cmd_hwpt_alloc(int fd, __u32 device_id, __u32 pt_id,
+					 __u32 *hwpt_id)
+{
+	struct iommu_hwpt_alloc cmd = {
+		.size = sizeof(cmd),
+		.dev_id = device_id,
+		.pt_id = pt_id,
+	};
+	int ret;
+
+	ret = ioctl(fd, IOMMU_HWPT_ALLOC, &cmd);
+	if (ret)
+		return ret;
+	if (hwpt_id)
+		*hwpt_id = cmd.out_hwpt_id;
+	return 0;
+}
+
+#define test_cmd_hwpt_alloc(device_id, pt_id, hwpt_id) \
+	ASSERT_EQ(0, _test_cmd_hwpt_alloc(self->fd, device_id, pt_id, hwpt_id))
+
 static int _test_cmd_create_access(int fd, unsigned int ioas_id,
 				   __u32 *access_id, unsigned int flags)
 {