From: Pranjal Shrivastava <praan@google.com>
To: Nicolin Chen <nicolinc@nvidia.com>
Cc: jgg@nvidia.com, kevin.tian@intel.com, corbet@lwn.net,
bagasdotme@gmail.com, will@kernel.org, robin.murphy@arm.com,
joro@8bytes.org, thierry.reding@gmail.com, vdumpa@nvidia.com,
jonathanh@nvidia.com, shuah@kernel.org, jsnitsel@redhat.com,
nathan@kernel.org, peterz@infradead.org, yi.l.liu@intel.com,
mshavit@google.com, zhangzekun11@huawei.com,
iommu@lists.linux.dev, linux-doc@vger.kernel.org,
linux-kernel@vger.kernel.org,
linux-arm-kernel@lists.infradead.org,
linux-tegra@vger.kernel.org, linux-kselftest@vger.kernel.org,
patches@lists.linux.dev, mochs@nvidia.com,
alok.a.tiwari@oracle.com, vasant.hegde@amd.com,
dwmw2@infradead.org, baolu.lu@linux.intel.com
Subject: Re: [PATCH v9 18/29] iommufd/selftest: Add coverage for the new mmap interface
Date: Thu, 10 Jul 2025 11:14:25 +0000 [thread overview]
Message-ID: <aG-gkXOZExtzUGxe@google.com> (raw)
In-Reply-To: <b02b1220c955c3cf9ea5dd9fe9349ab1b4f8e20b.1752126748.git.nicolinc@nvidia.com>
On Wed, Jul 09, 2025 at 10:59:10PM -0700, Nicolin Chen wrote:
> Extend the loopback test to a new mmap page.
>
> Signed-off-by: Nicolin Chen <nicolinc@nvidia.com>
Reviewed-by: Pranjal Shrivastava <praan@google.com>
> ---
> drivers/iommu/iommufd/iommufd_test.h | 4 +++
> tools/testing/selftests/iommu/iommufd_utils.h | 4 +++
> drivers/iommu/iommufd/selftest.c | 33 ++++++++++++++++++-
> tools/testing/selftests/iommu/iommufd.c | 19 +++++++++++
> 4 files changed, 59 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/iommu/iommufd/iommufd_test.h b/drivers/iommu/iommufd/iommufd_test.h
> index 51cd744a354f..8fc618b2bcf9 100644
> --- a/drivers/iommu/iommufd/iommufd_test.h
> +++ b/drivers/iommu/iommufd/iommufd_test.h
> @@ -232,12 +232,16 @@ struct iommu_hwpt_invalidate_selftest {
> * (IOMMU_VIOMMU_TYPE_SELFTEST)
> * @in_data: Input random data from user space
> * @out_data: Output data (matching @in_data) to user space
> + * @out_mmap_offset: The offset argument for mmap syscall
> + * @out_mmap_length: The length argument for mmap syscall
> *
> * Simply set @out_data=@in_data for a loopback test
> */
> struct iommu_viommu_selftest {
> __u32 in_data;
> __u32 out_data;
> + __aligned_u64 out_mmap_offset;
> + __aligned_u64 out_mmap_length;
> };
>
> /* Should not be equal to any defined value in enum iommu_viommu_invalidate_data_type */
> diff --git a/tools/testing/selftests/iommu/iommufd_utils.h b/tools/testing/selftests/iommu/iommufd_utils.h
> index 9a556f99d992..4a1b2bade018 100644
> --- a/tools/testing/selftests/iommu/iommufd_utils.h
> +++ b/tools/testing/selftests/iommu/iommufd_utils.h
> @@ -56,6 +56,10 @@ static unsigned long PAGE_SIZE;
> #define offsetofend(TYPE, MEMBER) \
> (offsetof(TYPE, MEMBER) + sizeof_field(TYPE, MEMBER))
>
> +#define test_err_mmap(_errno, length, offset) \
> + EXPECT_ERRNO(_errno, (long)mmap(NULL, length, PROT_READ | PROT_WRITE, \
> + MAP_SHARED, self->fd, offset))
> +
> static inline void *memfd_mmap(size_t length, int prot, int flags, int *mfd_p)
> {
> int mfd_flags = (flags & MAP_HUGETLB) ? MFD_HUGETLB : 0;
> diff --git a/drivers/iommu/iommufd/selftest.c b/drivers/iommu/iommufd/selftest.c
> index 2189e9b119ee..8b2c44b32530 100644
> --- a/drivers/iommu/iommufd/selftest.c
> +++ b/drivers/iommu/iommufd/selftest.c
> @@ -152,6 +152,9 @@ struct mock_viommu {
> struct mock_iommu_domain *s2_parent;
> struct mock_hw_queue *hw_queue[IOMMU_TEST_HW_QUEUE_MAX];
> struct mutex queue_mutex;
> +
> + unsigned long mmap_offset;
> + u32 *page; /* Mmap page to test u32 type of in_data */
> };
>
> static inline struct mock_viommu *to_mock_viommu(struct iommufd_viommu *viommu)
> @@ -689,6 +692,10 @@ static void mock_viommu_destroy(struct iommufd_viommu *viommu)
>
> if (refcount_dec_and_test(&mock_iommu->users))
> complete(&mock_iommu->complete);
> + if (mock_viommu->mmap_offset)
> + iommufd_viommu_destroy_mmap(&mock_viommu->core,
> + mock_viommu->mmap_offset);
> + free_page((unsigned long)mock_viommu->page);
> mutex_destroy(&mock_viommu->queue_mutex);
>
> /* iommufd core frees mock_viommu and viommu */
> @@ -887,11 +894,28 @@ static int mock_viommu_init(struct iommufd_viommu *viommu,
> if (rc)
> return rc;
>
> + /* Allocate two pages */
> + mock_viommu->page =
> + (u32 *)__get_free_pages(GFP_KERNEL | __GFP_ZERO, 1);
> + if (!mock_viommu->page)
> + return -ENOMEM;
> +
> + rc = iommufd_viommu_alloc_mmap(&mock_viommu->core,
> + __pa(mock_viommu->page),
> + PAGE_SIZE * 2,
> + &mock_viommu->mmap_offset);
> + if (rc)
> + goto err_free_page;
> +
> + /* For loopback tests on both the page and out_data */
> + *mock_viommu->page = data.in_data;
> data.out_data = data.in_data;
> + data.out_mmap_length = PAGE_SIZE * 2;
> + data.out_mmap_offset = mock_viommu->mmap_offset;
> rc = iommu_copy_struct_to_user(
> user_data, &data, IOMMU_VIOMMU_TYPE_SELFTEST, out_data);
> if (rc)
> - return rc;
> + goto err_destroy_mmap;
> }
>
> refcount_inc(&mock_iommu->users);
> @@ -900,6 +924,13 @@ static int mock_viommu_init(struct iommufd_viommu *viommu,
>
> viommu->ops = &mock_viommu_ops;
> return 0;
> +
> +err_destroy_mmap:
> + iommufd_viommu_destroy_mmap(&mock_viommu->core,
> + mock_viommu->mmap_offset);
> +err_free_page:
> + free_page((unsigned long)mock_viommu->page);
> + return rc;
> }
>
> static const struct iommu_ops mock_ops = {
> diff --git a/tools/testing/selftests/iommu/iommufd.c b/tools/testing/selftests/iommu/iommufd.c
> index 73426de77675..0b21c095ca5e 100644
> --- a/tools/testing/selftests/iommu/iommufd.c
> +++ b/tools/testing/selftests/iommu/iommufd.c
> @@ -2799,6 +2799,7 @@ TEST_F(iommufd_viommu, viommu_alloc_with_data)
> struct iommu_viommu_selftest data = {
> .in_data = 0xbeef,
> };
> + uint32_t *test;
>
> if (!self->device_id)
> SKIP(return, "Skipping test for variant no_viommu");
> @@ -2807,6 +2808,24 @@ TEST_F(iommufd_viommu, viommu_alloc_with_data)
> IOMMU_VIOMMU_TYPE_SELFTEST, &data, sizeof(data),
> &self->viommu_id);
> ASSERT_EQ(data.out_data, data.in_data);
> +
> + /* Negative mmap tests -- offset and length cannot be changed */
> + test_err_mmap(ENXIO, data.out_mmap_length,
> + data.out_mmap_offset + PAGE_SIZE);
> + test_err_mmap(ENXIO, data.out_mmap_length,
> + data.out_mmap_offset + PAGE_SIZE * 2);
> + test_err_mmap(ENXIO, data.out_mmap_length / 2, data.out_mmap_offset);
> + test_err_mmap(ENXIO, data.out_mmap_length * 2, data.out_mmap_offset);
> +
> + /* Now do a correct mmap for a loopback test */
> + test = mmap(NULL, data.out_mmap_length, PROT_READ | PROT_WRITE,
> + MAP_SHARED, self->fd, data.out_mmap_offset);
> + ASSERT_NE(MAP_FAILED, test);
> + ASSERT_EQ(data.in_data, *test);
> +
> + /* The owner of the mmap region should be blocked */
> + EXPECT_ERRNO(EBUSY, _test_ioctl_destroy(self->fd, self->viommu_id));
> + munmap(test, data.out_mmap_length);
> }
>
> TEST_F(iommufd_viommu, vdevice_alloc)
> --
> 2.43.0
>
next prev parent reply other threads:[~2025-07-10 12:45 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-07-10 5:58 [PATCH v9 00/29] iommufd: Add vIOMMU infrastructure (Part-4 HW QUEUE) Nicolin Chen
2025-07-10 5:58 ` [PATCH v9 01/29] iommufd: Report unmapped bytes in the error path of iopt_unmap_iova_range Nicolin Chen
2025-07-10 5:58 ` [PATCH v9 02/29] iommufd: Correct virt_id kdoc at struct iommu_vdevice_alloc Nicolin Chen
2025-07-10 5:58 ` [PATCH v9 03/29] iommufd/viommu: Explicitly define vdev->virt_id Nicolin Chen
2025-07-10 5:58 ` [PATCH v9 04/29] iommu: Use enum iommu_hw_info_type for type in hw_info op Nicolin Chen
2025-07-10 5:58 ` [PATCH v9 05/29] iommu: Add iommu_copy_struct_to_user helper Nicolin Chen
2025-07-10 5:58 ` [PATCH v9 06/29] iommu: Pass in a driver-level user data structure to viommu_init op Nicolin Chen
2025-07-10 5:58 ` [PATCH v9 07/29] iommufd/viommu: Allow driver-specific user data for a vIOMMU object Nicolin Chen
2025-07-10 5:59 ` [PATCH v9 08/29] iommufd/selftest: Support user_data in mock_viommu_alloc Nicolin Chen
2025-07-10 5:59 ` [PATCH v9 09/29] iommufd/selftest: Add coverage for viommu data Nicolin Chen
2025-07-10 5:59 ` [PATCH v9 10/29] iommufd/access: Add internal APIs for HW queue to use Nicolin Chen
2025-07-10 5:59 ` [PATCH v9 11/29] iommufd/access: Bypass access->ops->unmap for internal use Nicolin Chen
2025-07-10 5:59 ` [PATCH v9 12/29] iommufd/viommu: Add driver-defined vDEVICE support Nicolin Chen
2025-07-10 5:59 ` [PATCH v9 13/29] iommufd/viommu: Introduce IOMMUFD_OBJ_HW_QUEUE and its related struct Nicolin Chen
2025-07-10 5:59 ` [PATCH v9 14/29] iommufd/viommu: Add IOMMUFD_CMD_HW_QUEUE_ALLOC ioctl Nicolin Chen
2025-07-10 5:59 ` [PATCH v9 15/29] iommufd/driver: Add iommufd_hw_queue_depend/undepend() helpers Nicolin Chen
2025-07-10 5:59 ` [PATCH v9 16/29] iommufd/selftest: Add coverage for IOMMUFD_CMD_HW_QUEUE_ALLOC Nicolin Chen
2025-07-10 11:36 ` Pranjal Shrivastava
2025-07-10 5:59 ` [PATCH v9 17/29] iommufd: Add mmap interface Nicolin Chen
2025-07-14 6:08 ` Arnd Bergmann
2025-07-14 12:03 ` Jason Gunthorpe
2025-07-10 5:59 ` [PATCH v9 18/29] iommufd/selftest: Add coverage for the new " Nicolin Chen
2025-07-10 11:14 ` Pranjal Shrivastava [this message]
2025-07-10 5:59 ` [PATCH v9 19/29] Documentation: userspace-api: iommufd: Update HW QUEUE Nicolin Chen
2025-07-10 5:59 ` [PATCH v9 20/29] iommu: Allow an input type in hw_info op Nicolin Chen
2025-07-10 5:59 ` [PATCH v9 21/29] iommufd: Allow an input data_type via iommu_hw_info Nicolin Chen
2025-07-10 5:59 ` [PATCH v9 22/29] iommufd/selftest: Update hw_info coverage for an input data_type Nicolin Chen
2025-07-10 11:09 ` Pranjal Shrivastava
2025-07-10 15:32 ` Jason Gunthorpe
2025-07-10 16:43 ` Pranjal Shrivastava
2025-07-10 17:12 ` Jason Gunthorpe
2025-07-11 9:56 ` Pranjal Shrivastava
2025-07-10 5:59 ` [PATCH v9 23/29] iommu/arm-smmu-v3-iommufd: Add vsmmu_size/type and vsmmu_init impl ops Nicolin Chen
2025-07-11 16:14 ` Will Deacon
2025-07-15 18:42 ` Nicolin Chen
2025-07-17 8:49 ` Will Deacon
2025-07-10 5:59 ` [PATCH v9 24/29] iommu/arm-smmu-v3-iommufd: Add hw_info to impl_ops Nicolin Chen
2025-07-10 5:59 ` [PATCH v9 25/29] iommu/tegra241-cmdqv: Use request_threaded_irq Nicolin Chen
2025-07-10 5:59 ` [PATCH v9 26/29] iommu/tegra241-cmdqv: Simplify deinit flow in tegra241_cmdqv_remove_vintf() Nicolin Chen
2025-07-10 5:59 ` [PATCH v9 27/29] iommu/tegra241-cmdqv: Do not statically map LVCMDQs Nicolin Chen
2025-07-10 5:59 ` [PATCH v9 28/29] iommu/tegra241-cmdqv: Add user-space use support Nicolin Chen
2025-07-10 5:59 ` [PATCH v9 29/29] iommu/tegra241-cmdqv: Add IOMMU_VEVENTQ_TYPE_TEGRA241_CMDQV support Nicolin Chen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=aG-gkXOZExtzUGxe@google.com \
--to=praan@google.com \
--cc=alok.a.tiwari@oracle.com \
--cc=bagasdotme@gmail.com \
--cc=baolu.lu@linux.intel.com \
--cc=corbet@lwn.net \
--cc=dwmw2@infradead.org \
--cc=iommu@lists.linux.dev \
--cc=jgg@nvidia.com \
--cc=jonathanh@nvidia.com \
--cc=joro@8bytes.org \
--cc=jsnitsel@redhat.com \
--cc=kevin.tian@intel.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=linux-tegra@vger.kernel.org \
--cc=mochs@nvidia.com \
--cc=mshavit@google.com \
--cc=nathan@kernel.org \
--cc=nicolinc@nvidia.com \
--cc=patches@lists.linux.dev \
--cc=peterz@infradead.org \
--cc=robin.murphy@arm.com \
--cc=shuah@kernel.org \
--cc=thierry.reding@gmail.com \
--cc=vasant.hegde@amd.com \
--cc=vdumpa@nvidia.com \
--cc=will@kernel.org \
--cc=yi.l.liu@intel.com \
--cc=zhangzekun11@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.