On Fri, Apr 25, 2025 at 10:58:02PM -0700, Nicolin Chen wrote:
> Extend the existing test_cmd/err_viommu_alloc helpers to accept optional
> user data. And add a TEST_F for a loopback test.
> 
> Signed-off-by: Nicolin Chen <nicol...@nvidia.com>

Reviewed-by: Pranjal Shrivastava <pr...@google.com>

> ---
>  tools/testing/selftests/iommu/iommufd_utils.h | 21 +++++++++-----
>  tools/testing/selftests/iommu/iommufd.c       | 29 +++++++++++++++----
>  .../selftests/iommu/iommufd_fail_nth.c        |  5 ++--
>  3 files changed, 39 insertions(+), 16 deletions(-)
> 
> diff --git a/tools/testing/selftests/iommu/iommufd_utils.h 
> b/tools/testing/selftests/iommu/iommufd_utils.h
> index 72f6636e5d90..a5d4cbd089ba 100644
> --- a/tools/testing/selftests/iommu/iommufd_utils.h
> +++ b/tools/testing/selftests/iommu/iommufd_utils.h
> @@ -897,7 +897,8 @@ static int _test_cmd_trigger_iopf(int fd, __u32 
> device_id, __u32 pasid,
>                                           pasid, fault_fd))
>  
>  static int _test_cmd_viommu_alloc(int fd, __u32 device_id, __u32 hwpt_id,
> -                               __u32 type, __u32 flags, __u32 *viommu_id)
> +                               __u32 flags, __u32 type, void *data,
> +                               __u32 data_len, __u32 *viommu_id)
>  {
>       struct iommu_viommu_alloc cmd = {
>               .size = sizeof(cmd),
> @@ -905,6 +906,8 @@ static int _test_cmd_viommu_alloc(int fd, __u32 
> device_id, __u32 hwpt_id,
>               .type = type,
>               .dev_id = device_id,
>               .hwpt_id = hwpt_id,
> +             .data_uptr = (uint64_t)data,
> +             .data_len = data_len,
>       };
>       int ret;
>  
> @@ -916,13 +919,15 @@ static int _test_cmd_viommu_alloc(int fd, __u32 
> device_id, __u32 hwpt_id,
>       return 0;
>  }
>  
> -#define test_cmd_viommu_alloc(device_id, hwpt_id, type, viommu_id)        \
> -     ASSERT_EQ(0, _test_cmd_viommu_alloc(self->fd, device_id, hwpt_id, \
> -                                         type, 0, viommu_id))
> -#define test_err_viommu_alloc(_errno, device_id, hwpt_id, type, viommu_id) \
> -     EXPECT_ERRNO(_errno,                                               \
> -                  _test_cmd_viommu_alloc(self->fd, device_id, hwpt_id,  \
> -                                         type, 0, viommu_id))
> +#define test_cmd_viommu_alloc(device_id, hwpt_id, type, data, data_len,      
> \
> +                           viommu_id)                                     \
> +     ASSERT_EQ(0, _test_cmd_viommu_alloc(self->fd, device_id, hwpt_id, 0, \
> +                                         type, data, data_len, viommu_id))
> +#define test_err_viommu_alloc(_errno, device_id, hwpt_id, type, data,        
> \
> +                           data_len, viommu_id)                           \
> +     EXPECT_ERRNO(_errno,                                                 \
> +                  _test_cmd_viommu_alloc(self->fd, device_id, hwpt_id, 0, \
> +                                         type, data, data_len, viommu_id))
>  
>  static int _test_cmd_vdevice_alloc(int fd, __u32 viommu_id, __u32 idev_id,
>                                  __u64 virt_id, __u32 *vdev_id)
> diff --git a/tools/testing/selftests/iommu/iommufd.c 
> b/tools/testing/selftests/iommu/iommufd.c
> index 1a8e85afe9aa..8ebbb7fda02d 100644
> --- a/tools/testing/selftests/iommu/iommufd.c
> +++ b/tools/testing/selftests/iommu/iommufd.c
> @@ -2688,7 +2688,7 @@ FIXTURE_SETUP(iommufd_viommu)
>  
>               /* Allocate a vIOMMU taking refcount of the parent hwpt */
>               test_cmd_viommu_alloc(self->device_id, self->hwpt_id,
> -                                   IOMMU_VIOMMU_TYPE_SELFTEST,
> +                                   IOMMU_VIOMMU_TYPE_SELFTEST, NULL, 0,
>                                     &self->viommu_id);
>  
>               /* Allocate a regular nested hwpt */
> @@ -2727,24 +2727,27 @@ TEST_F(iommufd_viommu, viommu_negative_tests)
>       if (self->device_id) {
>               /* Negative test -- invalid hwpt (hwpt_id=0) */
>               test_err_viommu_alloc(ENOENT, device_id, 0,
> -                                   IOMMU_VIOMMU_TYPE_SELFTEST, NULL);
> +                                   IOMMU_VIOMMU_TYPE_SELFTEST, NULL, 0,
> +                                   NULL);
>  
>               /* Negative test -- not a nesting parent hwpt */
>               test_cmd_hwpt_alloc(device_id, ioas_id, 0, &hwpt_id);
>               test_err_viommu_alloc(EINVAL, device_id, hwpt_id,
> -                                   IOMMU_VIOMMU_TYPE_SELFTEST, NULL);
> +                                   IOMMU_VIOMMU_TYPE_SELFTEST, NULL, 0,
> +                                   NULL);
>               test_ioctl_destroy(hwpt_id);
>  
>               /* Negative test -- unsupported viommu type */
>               test_err_viommu_alloc(EOPNOTSUPP, device_id, self->hwpt_id,
> -                                   0xdead, NULL);
> +                                   0xdead, NULL, 0, NULL);
>               EXPECT_ERRNO(EBUSY,
>                            _test_ioctl_destroy(self->fd, self->hwpt_id));
>               EXPECT_ERRNO(EBUSY,
>                            _test_ioctl_destroy(self->fd, self->viommu_id));
>       } else {
>               test_err_viommu_alloc(ENOENT, self->device_id, self->hwpt_id,
> -                                   IOMMU_VIOMMU_TYPE_SELFTEST, NULL);
> +                                   IOMMU_VIOMMU_TYPE_SELFTEST, NULL, 0,
> +                                   NULL);
>       }
>  }
>  
> @@ -2791,6 +2794,20 @@ TEST_F(iommufd_viommu, viommu_alloc_nested_iopf)
>       }
>  }
>  
> +TEST_F(iommufd_viommu, viommu_alloc_with_data)
> +{
> +     struct iommu_viommu_selftest data = {
> +             .in_data = 0xbeef,
> +     };
> +
> +     if (self->device_id) {
> +             test_cmd_viommu_alloc(self->device_id, self->hwpt_id,
> +                                   IOMMU_VIOMMU_TYPE_SELFTEST, &data,
> +                                   sizeof(data), &self->viommu_id);
> +             assert(data.out_data == data.in_data);
> +     }
> +}
> +
>  TEST_F(iommufd_viommu, vdevice_alloc)
>  {
>       uint32_t viommu_id = self->viommu_id;
> @@ -3105,7 +3122,7 @@ TEST_F(iommufd_device_pasid, pasid_attach)
>  
>       /* Allocate a regular nested hwpt based on viommu */
>       test_cmd_viommu_alloc(self->device_id, parent_hwpt_id,
> -                           IOMMU_VIOMMU_TYPE_SELFTEST,
> +                           IOMMU_VIOMMU_TYPE_SELFTEST, NULL, 0,
>                             &viommu_id);
>       test_cmd_hwpt_alloc_nested(self->device_id, viommu_id,
>                                  IOMMU_HWPT_ALLOC_PASID,
> diff --git a/tools/testing/selftests/iommu/iommufd_fail_nth.c 
> b/tools/testing/selftests/iommu/iommufd_fail_nth.c
> index e11ec4b121fc..f7ccf1822108 100644
> --- a/tools/testing/selftests/iommu/iommufd_fail_nth.c
> +++ b/tools/testing/selftests/iommu/iommufd_fail_nth.c
> @@ -688,8 +688,9 @@ TEST_FAIL_NTH(basic_fail_nth, device)
>                                IOMMU_HWPT_DATA_NONE, 0, 0))
>               return -1;
>  
> -     if (_test_cmd_viommu_alloc(self->fd, idev_id, hwpt_id,
> -                                IOMMU_VIOMMU_TYPE_SELFTEST, 0, &viommu_id))
> +     if (_test_cmd_viommu_alloc(self->fd, idev_id, hwpt_id, 0,
> +                                IOMMU_VIOMMU_TYPE_SELFTEST, NULL, 0,
> +                                &viommu_id))
>               return -1;
>  
>       if (_test_cmd_vdevice_alloc(self->fd, viommu_id, idev_id, 0, &vdev_id))
> -- 
> 2.43.0
> 

Reply via email to