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 |
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
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
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 --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) {
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(-)