lkml.org 
[lkml]   [2023]   [Mar]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v6 3/4] iommufd/selftest: Add IOMMU_TEST_OP_ACCESS_REPLACE_IOAS coverage
    Date
    Add a new IOMMU_TEST_OP_ACCESS_REPLACE_IOAS to allow replacing the
    access->ioas, corresponding to the iommufd_access_replace() helper.

    Then add a replace coverage as a part of user_copy test case, which
    basically repeats the copy test after replacing the old ioas with a
    new one.

    Reviewed-by: Kevin Tian <kevin.tian@intel.com>
    Signed-off-by: Nicolin Chen <nicolinc@nvidia.com>
    ---
    drivers/iommu/iommufd/iommufd_test.h | 4 +++
    drivers/iommu/iommufd/selftest.c | 19 ++++++++++++
    tools/testing/selftests/iommu/iommufd.c | 29 +++++++++++++++++--
    tools/testing/selftests/iommu/iommufd_utils.h | 19 ++++++++++++
    4 files changed, 69 insertions(+), 2 deletions(-)

    diff --git a/drivers/iommu/iommufd/iommufd_test.h b/drivers/iommu/iommufd/iommufd_test.h
    index dd9168a20ddf..258de2253b61 100644
    --- a/drivers/iommu/iommufd/iommufd_test.h
    +++ b/drivers/iommu/iommufd/iommufd_test.h
    @@ -18,6 +18,7 @@ enum {
    IOMMU_TEST_OP_ACCESS_RW,
    IOMMU_TEST_OP_SET_TEMP_MEMORY_LIMIT,
    IOMMU_TEST_OP_MOCK_DOMAIN_REPLACE,
    + IOMMU_TEST_OP_ACCESS_REPLACE_IOAS,
    };

    enum {
    @@ -91,6 +92,9 @@ struct iommu_test_cmd {
    struct {
    __u32 limit;
    } memory_limit;
    + struct {
    + __u32 ioas_id;
    + } access_replace_ioas;
    };
    __u32 last;
    };
    diff --git a/drivers/iommu/iommufd/selftest.c b/drivers/iommu/iommufd/selftest.c
    index 2deda489a934..7714d8f53603 100644
    --- a/drivers/iommu/iommufd/selftest.c
    +++ b/drivers/iommu/iommufd/selftest.c
    @@ -785,6 +785,22 @@ static int iommufd_test_create_access(struct iommufd_ucmd *ucmd,
    return rc;
    }

    +static int iommufd_test_access_replace_ioas(struct iommufd_ucmd *ucmd,
    + unsigned int access_id,
    + unsigned int ioas_id)
    +{
    + struct selftest_access *staccess;
    + int rc;
    +
    + staccess = iommufd_access_get(access_id);
    + if (IS_ERR(staccess))
    + return PTR_ERR(staccess);
    +
    + rc = iommufd_access_replace(staccess->access, ioas_id);
    + fput(staccess->file);
    + return rc;
    +}
    +
    /* Check that the pages in a page array match the pages in the user VA */
    static int iommufd_test_check_pages(void __user *uptr, struct page **pages,
    size_t npages)
    @@ -1000,6 +1016,9 @@ int iommufd_test(struct iommufd_ucmd *ucmd)
    case IOMMU_TEST_OP_CREATE_ACCESS:
    return iommufd_test_create_access(ucmd, cmd->id,
    cmd->create_access.flags);
    + case IOMMU_TEST_OP_ACCESS_REPLACE_IOAS:
    + return iommufd_test_access_replace_ioas(
    + ucmd, cmd->id, cmd->access_replace_ioas.ioas_id);
    case IOMMU_TEST_OP_ACCESS_PAGES:
    return iommufd_test_access_pages(
    ucmd, cmd->id, cmd->access_pages.iova,
    diff --git a/tools/testing/selftests/iommu/iommufd.c b/tools/testing/selftests/iommu/iommufd.c
    index c07252dbf62d..3c8cb9d6c22b 100644
    --- a/tools/testing/selftests/iommu/iommufd.c
    +++ b/tools/testing/selftests/iommu/iommufd.c
    @@ -1252,7 +1252,13 @@ TEST_F(iommufd_mock_domain, user_copy)
    .dst_iova = MOCK_APERTURE_START,
    .length = BUFFER_SIZE,
    };
    - unsigned int ioas_id;
    + struct iommu_ioas_unmap unmap_cmd = {
    + .size = sizeof(unmap_cmd),
    + .ioas_id = self->ioas_id,
    + .iova = MOCK_APERTURE_START,
    + .length = BUFFER_SIZE,
    + };
    + unsigned int new_ioas_id, ioas_id;

    /* Pin the pages in an IOAS with no domains then copy to an IOAS with domains */
    test_ioctl_ioas_alloc(&ioas_id);
    @@ -1270,11 +1276,30 @@ TEST_F(iommufd_mock_domain, user_copy)
    ASSERT_EQ(0, ioctl(self->fd, IOMMU_IOAS_COPY, &copy_cmd));
    check_mock_iova(buffer, MOCK_APERTURE_START, BUFFER_SIZE);

    + /* Now replace the ioas with a new one */
    + test_ioctl_ioas_alloc(&new_ioas_id);
    + test_ioctl_ioas_map_id(new_ioas_id, buffer, BUFFER_SIZE,
    + &copy_cmd.src_iova);
    + test_cmd_access_replace_ioas(access_cmd.id, new_ioas_id);
    +
    + /* Destroy the old ioas and cleanup copied mapping */
    + ASSERT_EQ(0, ioctl(self->fd, IOMMU_IOAS_UNMAP, &unmap_cmd));
    + test_ioctl_destroy(ioas_id);
    +
    + /* Then run the same test again with the new ioas */
    + access_cmd.access_pages.iova = copy_cmd.src_iova;
    + ASSERT_EQ(0,
    + ioctl(self->fd, _IOMMU_TEST_CMD(IOMMU_TEST_OP_ACCESS_PAGES),
    + &access_cmd));
    + copy_cmd.src_ioas_id = new_ioas_id;
    + ASSERT_EQ(0, ioctl(self->fd, IOMMU_IOAS_COPY, &copy_cmd));
    + check_mock_iova(buffer, MOCK_APERTURE_START, BUFFER_SIZE);
    +
    test_cmd_destroy_access_pages(
    access_cmd.id, access_cmd.access_pages.out_access_pages_id);
    test_cmd_destroy_access(access_cmd.id);

    - test_ioctl_destroy(ioas_id);
    + test_ioctl_destroy(new_ioas_id);
    }

    TEST_F(iommufd_mock_domain, replace)
    diff --git a/tools/testing/selftests/iommu/iommufd_utils.h b/tools/testing/selftests/iommu/iommufd_utils.h
    index 9b6dcb921750..c31e75607355 100644
    --- a/tools/testing/selftests/iommu/iommufd_utils.h
    +++ b/tools/testing/selftests/iommu/iommufd_utils.h
    @@ -117,6 +117,25 @@ static int _test_cmd_hwpt_alloc(int fd, __u32 device_id, __u32 pt_id,
    #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_access_replace_ioas(int fd, __u32 access_id,
    + unsigned int ioas_id)
    +{
    + struct iommu_test_cmd cmd = {
    + .size = sizeof(cmd),
    + .op = IOMMU_TEST_OP_ACCESS_REPLACE_IOAS,
    + .id = access_id,
    + .access_replace_ioas = { .ioas_id = ioas_id },
    + };
    + int ret;
    +
    + ret = ioctl(fd, IOMMU_TEST_CMD, &cmd);
    + if (ret)
    + return ret;
    + return 0;
    +}
    +#define test_cmd_access_replace_ioas(access_id, ioas_id) \
    + ASSERT_EQ(0, _test_cmd_access_replace_ioas(self->fd, access_id, ioas_id))
    +
    static int _test_cmd_create_access(int fd, unsigned int ioas_id,
    __u32 *access_id, unsigned int flags)
    {
    --
    2.40.0
    \
     
     \ /
      Last update: 2023-03-27 20:06    [W:3.685 / U:1.464 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site