All of lore.kernel.org
 help / color / mirror / Atom feed
From: Nicolin Chen <nicolinc@nvidia.com>
To: Yi Liu <yi.l.liu@intel.com>
Cc: <kevin.tian@intel.com>, <jgg@nvidia.com>, <joro@8bytes.org>,
	<baolu.lu@linux.intel.com>, <iommu@lists.linux.dev>
Subject: Re: [PATCH v10 18/18] iommufd/selftest: Add coverage for iommufd pasid attach/detach
Date: Thu, 20 Mar 2025 17:34:06 -0700	[thread overview]
Message-ID: <Z9yz/pVlPy6sOxP0@Asurada-Nvidia> (raw)
In-Reply-To: <20250320134744.5777-19-yi.l.liu@intel.com>

On Thu, Mar 20, 2025 at 06:47:44AM -0700, Yi Liu wrote:

> +TEST_F(iommufd_device_pasid, pasid_attach)
> +{
> +	struct iommu_hwpt_selftest data = {
> +		.iotlb =  IOMMU_TEST_IOTLB_DEFAULT,
> +	};
> +	uint32_t nested_hwpt_id[3] = {};
> +	uint32_t parent_hwpt_id = 0;
> +	uint32_t fault_id, fault_fd;
> +	uint32_t s2_hwpt_id = 0;
> +	uint32_t iopf_hwpt_id;
> +	uint32_t pasid = 100;
> +	uint32_t auto_hwpt;
> +	uint32_t viommu_id;
> +	bool result;
> +
> +	/* Allocate two nested hwpts sharing one common parent hwpt */
> +	test_cmd_hwpt_alloc(self->device_id, self->ioas_id,
> +			    IOMMU_HWPT_ALLOC_NEST_PARENT,
> +			    &parent_hwpt_id);
> +	test_cmd_hwpt_alloc_nested(self->device_id, parent_hwpt_id,
> +				   IOMMU_HWPT_ALLOC_PASID,
> +				   &nested_hwpt_id[0],
> +				   IOMMU_HWPT_DATA_SELFTEST,
> +				   &data, sizeof(data));
> +	test_cmd_hwpt_alloc_nested(self->device_id, parent_hwpt_id,
> +				   IOMMU_HWPT_ALLOC_PASID,
> +				   &nested_hwpt_id[1],
> +				   IOMMU_HWPT_DATA_SELFTEST,
> +				   &data, sizeof(data));
> +
> +	/* Faulte related preparation */

Fault

> +	/* Allocate a regular nested hwpt based on viommu */
> +	test_cmd_viommu_alloc(self->device_id, parent_hwpt_id,
> +			      IOMMU_VIOMMU_TYPE_SELFTEST,
> +			      &viommu_id);
> +	test_cmd_hwpt_alloc_nested(self->device_id, viommu_id,
> +				   IOMMU_HWPT_ALLOC_PASID,
> +				   &nested_hwpt_id[2],
> +				   IOMMU_HWPT_DATA_SELFTEST, &data,
> +				   sizeof(data));
> +
> +	test_cmd_hwpt_alloc(self->device_id, self->ioas_id,
> +			    IOMMU_HWPT_ALLOC_PASID,
> +			    &s2_hwpt_id);
> +
> +	/* Attach RID to non-pasid compat domain, */
> +	test_cmd_mock_domain_replace(self->stdev_id, parent_hwpt_id);
> +	/* then attach to pasid should fail */
> +	test_err_pasid_attach(EINVAL, pasid, s2_hwpt_id, NULL);
> +
> +	/* Attach RID to pasid compat domain, */
> +	test_cmd_mock_domain_replace(self->stdev_id, s2_hwpt_id);
> +	/* then attach to pasid should succeed, */
> +	test_cmd_pasid_attach(pasid, nested_hwpt_id[0], NULL);
> +	/* but attach RID to non-pasid compat domain should fail now. */
> +	test_err_mock_domain_replace(EINVAL, self->stdev_id, parent_hwpt_id);
> +	test_cmd_pasid_detach(pasid);
> +
> +	if (!variant->pasid_capable) {
> +		/*
> +		 * PASID-compatible domain can be used by non-PASID-capable
> +		 * device.
> +		 */
> +		test_cmd_mock_domain_replace(self->no_pasid_stdev_id, nested_hwpt_id[0]);
> +		test_cmd_mock_domain_replace(self->no_pasid_stdev_id, self->ioas_id);
> +		/*
> +		 * Attach hwpt to pasid#100 of non-PASID-capable device,
> +		 * should fail, no matter domain is pasid-comapt or not.
> +		 */
> +		EXPECT_ERRNO(EINVAL,
> +			     _test_cmd_pasid_attach(self->fd, self->no_pasid_stdev_id,
> +						    pasid, parent_hwpt_id, NULL));
> +		EXPECT_ERRNO(EINVAL,
> +			     _test_cmd_pasid_attach(self->fd, self->no_pasid_stdev_id,
> +						    pasid, s2_hwpt_id, NULL));
> +	}

It seems that we should test these anyway without a variant?

> +
> +	/*
> +	 * Attach non pasid compat hwpt to pasid-capable device, should
> +	 * fail, and have null domain.
> +	 */
> +	test_err_pasid_attach(EINVAL, pasid, parent_hwpt_id, NULL);
> +	ASSERT_EQ(0,
> +		  test_cmd_pasid_check_domain(self->fd, self->stdev_id,
> +					      pasid, 0, &result));
> +	EXPECT_EQ(1, result);
> +
> +	/*
> +	 * Attach ioas to pasid 100, should succeed, domain should
> +	 * be valid.
> +	 */
> +	test_cmd_pasid_attach(pasid, self->ioas_id, &auto_hwpt);
> +	ASSERT_EQ(0,
> +		  test_cmd_pasid_check_domain(self->fd, self->stdev_id,
> +					      pasid, auto_hwpt, &result));
> +	EXPECT_EQ(1, result);

Hmm, I thought that a non-RID PASID slot could only attach a PASID-
compatible HWPT. I think I am totally confused now... lol

Perhaps we need a detailed documentation somewhere, at least as a
reminder or so?

> +
> +	/* Attach to pasid 100 which has been attached, should fail. */
> +	test_err_pasid_attach(EBUSY, pasid, self->ioas_id, &auto_hwpt);
> +
> +	/*
> +	 * Try attach pasid 100 with another hwpt, should FAIL
> +	 * as attach does not allow overwrite, use REPLACE instead.
> +	 */
> +	test_err_pasid_attach(EBUSY, pasid, nested_hwpt_id[0], NULL);
> +
> +	/*
> +	 * Detach hwpt from pasid 100, and check if the pasid 100
> +	 * has null domain. Should be done before the next attach.
> +	 */
> +	test_cmd_pasid_detach(pasid);
> +	ASSERT_EQ(0,
> +		  test_cmd_pasid_check_domain(self->fd, self->stdev_id,
> +					      pasid, 0, &result));
> +	EXPECT_EQ(1, result);
> +
> +	/*
> +	 * Attach nested hwpt to pasid 100, should succeed, domain
> +	 * should be valid.
> +	 */
> +	test_cmd_pasid_attach(pasid, nested_hwpt_id[0], NULL);
> +	ASSERT_EQ(0,
> +		  test_cmd_pasid_check_domain(self->fd, self->stdev_id,
> +					      pasid, nested_hwpt_id[0],
> +					      &result));
> +	EXPECT_EQ(1, result);
> +
> +	/* Attach to pasid 100 which has been attached, should fail. */
> +	test_err_pasid_attach(EBUSY, pasid, nested_hwpt_id[0], NULL);
> +
> +	/*
> +	 * Detach hwpt from pasid 100, and check if the pasid 100
> +	 * has null domain
> +	 */
> +	test_cmd_pasid_detach(pasid);
> +	ASSERT_EQ(0,
> +		  test_cmd_pasid_check_domain(self->fd, self->stdev_id,
> +					      pasid, 0, &result));
> +	EXPECT_EQ(1, result);
> +
> +	/* Replace tests */
> +
> +	pasid = 200;
> +	/*
> +	 * Replace pasid 200 without attaching it first, should
> +	 * fail with -EINVAL.
> +	 */
> +	test_err_cmd_pasid_replace(EINVAL, pasid, s2_hwpt_id, NULL);
> +
> +	/*
> +	 * Attach a s2 hwpt to pasid 200, should succeed, domain should

Attach the ..

> +	 * be valid.
> +	 */
> +	test_cmd_pasid_attach(pasid, s2_hwpt_id, NULL);
> +	ASSERT_EQ(0,
> +		  test_cmd_pasid_check_domain(self->fd, self->stdev_id,
> +					      pasid, s2_hwpt_id,
> +					      &result));
> +	EXPECT_EQ(1, result);
> +
> +	/*
> +	 * Replace pasid 200 with self->ioas_id, should succeed,
> +	 * and have valid domain.
> +	 */
> +	test_cmd_pasid_replace(pasid, self->ioas_id, &auto_hwpt);
> +	ASSERT_EQ(0,
> +		  test_cmd_pasid_check_domain(self->fd, self->stdev_id,
> +					      pasid, auto_hwpt,
> +					      &result));
> +	EXPECT_EQ(1, result);
> +
> +	/*
> +	 * Replace a nested hwpt for pasid 200, should succeed,
> +	 * and have valid domain.
> +	 */
> +	test_cmd_pasid_replace(pasid, nested_hwpt_id[0], NULL);
> +	ASSERT_EQ(0,
> +		  test_cmd_pasid_check_domain(self->fd, self->stdev_id,
> +					      pasid, nested_hwpt_id[0],
> +					      &result));
> +	EXPECT_EQ(1, result);
> +
> +	/*
> +	 * Replace with another nested hwpt for pasid 200, should
> +	 * succeed, and have valid domain.
> +	 */
> +	test_cmd_pasid_replace(pasid, nested_hwpt_id[1], NULL);
> +	ASSERT_EQ(0,
> +		  test_cmd_pasid_check_domain(self->fd, self->stdev_id,
> +					      pasid, nested_hwpt_id[1],
> +					      &result));
> +	EXPECT_EQ(1, result);
> +
> +	/*
> +	 * Detach hwpt from pasid 200, and check if the pasid 200
> +	 * has null domain.
> +	 */
> +	test_cmd_pasid_detach(pasid);
> +	ASSERT_EQ(0,
> +		  test_cmd_pasid_check_domain(self->fd, self->stdev_id,
> +					      pasid, 0, &result));
> +	EXPECT_EQ(1, result);
> +
> +	/* Negative Tests for pasid replace, use pasid 1024 */
> +
> +	/*
> +	 * Attach a s2 hwpt to pasid 1024, should succeed, domain should

Attach the ...

> +	 * be valid.
> +	 */
> +	pasid = 1024;
> +	test_cmd_pasid_attach(pasid, s2_hwpt_id, NULL);
> +	ASSERT_EQ(0,
> +		  test_cmd_pasid_check_domain(self->fd, self->stdev_id,
> +					      pasid, s2_hwpt_id,
> +					      &result));
> +	EXPECT_EQ(1, result);
> +
> +	/*
> +	 * Replace pasid 1024 with self->ioas_id, should fail,
> +	 * but have the old valid domain. This is a designed
> +	 * negative case, normally replace with self->ioas_id
> +	 * could succeed.
> +	 */
> +	test_err_cmd_pasid_replace(ENOMEM, pasid, self->ioas_id, NULL);
> +	ASSERT_EQ(0,
> +		  test_cmd_pasid_check_domain(self->fd, self->stdev_id,
> +					      pasid, s2_hwpt_id,
> +					      &result));
> +	EXPECT_EQ(1, result);
> +
> +	/*
> +	 * Detach hwpt from pasid 1024, and check if the pasid 1024
> +	 * has null domain.
> +	 */
> +	test_cmd_pasid_detach(pasid);

The designed "failing" replace does "pasid_1024_attached = false",
meaning that this detach() isn't necessary?

Or perhaps the designed "failing" shouldn't set "attached = false"?

> +	/* Detach the s2_hwpt_id from RID */
> +	test_cmd_mock_domain_replace(self->stdev_id, self->ioas_id);
> +
> +	test_ioctl_destroy(nested_hwpt_id[0]);
> +	test_ioctl_destroy(nested_hwpt_id[1]);
> +	test_ioctl_destroy(nested_hwpt_id[2]);
> +	test_ioctl_destroy(viommu_id);
> +	test_ioctl_destroy(parent_hwpt_id);
> +	test_ioctl_destroy(s2_hwpt_id);

Once detached, all the destroys can be done automatically?

  reply	other threads:[~2025-03-21  0:34 UTC|newest]

Thread overview: 78+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-03-20 13:47 [PATCH v10 00/18] iommufd support pasid attach/replace Yi Liu
2025-03-20 13:47 ` [PATCH v10 01/18] iommu: Require passing new handles to APIs supporting handle Yi Liu
2025-03-20 15:23   ` Jason Gunthorpe
2025-03-20 23:51     ` Yi Liu
2025-03-21  2:35   ` Baolu Lu
2025-03-20 13:47 ` [PATCH v10 02/18] iommu: Introduce a replace API for device pasid Yi Liu
2025-03-20 17:24   ` Nicolin Chen
2025-03-20 23:58     ` Yi Liu
2025-03-21  0:14       ` Yi Liu
2025-03-21  3:21       ` Nicolin Chen
2025-03-21  4:06         ` Yi Liu
2025-03-21  3:08   ` Baolu Lu
2025-03-21  4:19     ` Yi Liu
2025-03-20 13:47 ` [PATCH v10 03/18] iommufd: Pass @pasid through the device attach/replace path Yi Liu
2025-03-21  3:13   ` Baolu Lu
2025-03-20 13:47 ` [PATCH v10 04/18] iommufd/device: Only add reserved_iova in non-pasid path Yi Liu
2025-03-21  3:14   ` Baolu Lu
2025-03-20 13:47 ` [PATCH v10 05/18] iommufd/device: Replace idev->igroup with local variable Yi Liu
2025-03-21  3:14   ` Baolu Lu
2025-03-20 13:47 ` [PATCH v10 06/18] iommufd/device: Add helper to detect the first attach of a group Yi Liu
2025-03-20 15:36   ` Jason Gunthorpe
2025-03-20 17:36   ` Nicolin Chen
2025-03-20 17:51     ` Nicolin Chen
2025-03-21  0:02       ` Yi Liu
2025-03-20 18:04     ` Jason Gunthorpe
2025-03-20 18:24       ` Nicolin Chen
2025-03-21  3:18   ` Baolu Lu
2025-03-20 13:47 ` [PATCH v10 07/18] iommufd/device: Wrap igroup->hwpt and igroup->device_list into attach struct Yi Liu
2025-03-20 15:48   ` Jason Gunthorpe
2025-03-20 18:03   ` Nicolin Chen
2025-03-21  3:22   ` Baolu Lu
2025-03-20 13:47 ` [PATCH v10 08/18] iommufd/device: Replace device_list with device_array Yi Liu
2025-03-20 17:20   ` Jason Gunthorpe
2025-03-21  0:25     ` Yi Liu
2025-03-20 18:38   ` Nicolin Chen
2025-03-21  0:30     ` Yi Liu
2025-03-21  3:25       ` Nicolin Chen
2025-03-20 13:47 ` [PATCH v10 09/18] iommufd/device: Add pasid_attach array to track per-PASID attach Yi Liu
2025-03-20 17:33   ` Jason Gunthorpe
2025-03-20 19:19   ` Nicolin Chen
2025-03-20 19:29     ` Jason Gunthorpe
2025-03-20 20:13       ` Nicolin Chen
2025-03-21  0:15     ` Yi Liu
2025-03-20 13:47 ` [PATCH v10 10/18] iommufd: Enforce PASID-compatible domain in PASID path Yi Liu
2025-03-20 13:47 ` [PATCH v10 11/18] iommufd: Support pasid attach/replace Yi Liu
2025-03-20 20:42   ` Nicolin Chen
2025-03-20 23:29     ` Jason Gunthorpe
2025-03-21  0:31     ` Yi Liu
2025-03-21  0:35       ` Nicolin Chen
2025-03-21  1:05         ` Yi Liu
2025-03-21 11:45           ` Jason Gunthorpe
2025-03-20 13:47 ` [PATCH v10 12/18] iommufd: Enforce PASID-compatible domain for RID Yi Liu
2025-03-20 17:35   ` Jason Gunthorpe
2025-03-20 22:23   ` Nicolin Chen
2025-03-20 23:31     ` Jason Gunthorpe
2025-03-21  0:45       ` Yi Liu
2025-03-21  0:41     ` Yi Liu
2025-03-20 13:47 ` [PATCH v10 13/18] iommu/vt-d: Add IOMMU_HWPT_ALLOC_PASID support Yi Liu
2025-03-20 13:47 ` [PATCH v10 14/18] iommufd: Allow allocating PASID-compatible domain Yi Liu
2025-03-20 17:51   ` Jason Gunthorpe
2025-03-21  0:52     ` Yi Liu
2025-03-20 22:36   ` Nicolin Chen
2025-03-20 13:47 ` [PATCH v10 15/18] iommufd/selftest: Add set_dev_pasid in mock iommu Yi Liu
2025-03-20 22:48   ` Nicolin Chen
2025-03-20 13:47 ` [PATCH v10 16/18] iommufd/selftest: Add a helper to get test device Yi Liu
2025-03-20 13:47 ` [PATCH v10 17/18] iommufd/selftest: Add test ops to test pasid attach/detach Yi Liu
2025-03-20 23:17   ` Nicolin Chen
2025-03-20 23:33     ` Jason Gunthorpe
2025-03-20 23:42     ` Nicolin Chen
2025-03-21  1:43     ` Yi Liu
2025-03-21 17:25       ` Nicolin Chen
2025-03-20 23:20   ` Nicolin Chen
2025-03-21  1:20     ` Yi Liu
2025-03-20 13:47 ` [PATCH v10 18/18] iommufd/selftest: Add coverage for iommufd " Yi Liu
2025-03-21  0:34   ` Nicolin Chen [this message]
2025-03-21 15:26     ` Yi Liu
2025-03-21 17:10       ` Nicolin Chen
2025-03-20 13:59 ` [PATCH v10 00/18] iommufd support pasid attach/replace Yi Liu

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=Z9yz/pVlPy6sOxP0@Asurada-Nvidia \
    --to=nicolinc@nvidia.com \
    --cc=baolu.lu@linux.intel.com \
    --cc=iommu@lists.linux.dev \
    --cc=jgg@nvidia.com \
    --cc=joro@8bytes.org \
    --cc=kevin.tian@intel.com \
    --cc=yi.l.liu@intel.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.