From: Nicolin Chen <nicolinc@nvidia.com>
To: Xu Yilun <yilun.xu@linux.intel.com>
Cc: <jgg@nvidia.com>, <jgg@ziepe.ca>, <kevin.tian@intel.com>,
<will@kernel.org>, <aneesh.kumar@kernel.org>,
<iommu@lists.linux.dev>, <linux-kernel@vger.kernel.org>,
<joro@8bytes.org>, <robin.murphy@arm.com>, <shuah@kernel.org>,
<aik@amd.com>, <dan.j.williams@intel.com>,
<baolu.lu@linux.intel.com>, <yilun.xu@intel.com>
Subject: Re: [PATCH v5 5/8] iommufd/vdevice: Remove struct device reference from struct vdevice
Date: Tue, 15 Jul 2025 11:56:31 -0700 [thread overview]
Message-ID: <aHakX0SzQ9/EX3AT@Asurada-Nvidia> (raw)
In-Reply-To: <20250715063245.1799534-6-yilun.xu@linux.intel.com>
On Tue, Jul 15, 2025 at 02:32:42PM +0800, Xu Yilun wrote:
> diff --git a/drivers/iommu/arm/arm-smmu-v3/tegra241-cmdqv.c b/drivers/iommu/arm/arm-smmu-v3/tegra241-cmdqv.c
> index eb90af5093d8..8a515987b948 100644
> --- a/drivers/iommu/arm/arm-smmu-v3/tegra241-cmdqv.c
> +++ b/drivers/iommu/arm/arm-smmu-v3/tegra241-cmdqv.c
> @@ -1218,7 +1218,7 @@ static void tegra241_vintf_destroy_vsid(struct iommufd_vdevice *vdev)
>
> static int tegra241_vintf_init_vsid(struct iommufd_vdevice *vdev)
> {
> - struct arm_smmu_master *master = dev_iommu_priv_get(vdev->dev);
> + struct arm_smmu_master *master = dev_iommu_priv_get(vdev->idev->dev);
Hmm, this breaks :(
drivers/iommu/arm/arm-smmu-v3/tegra241-cmdqv.c: In function 'tegra241_vintf_init_vsid':
drivers/iommu/arm/arm-smmu-v3/tegra241-cmdqv.c:1230:71: error: invalid use of undefined type 'struct iommufd_device'
1230 | struct arm_smmu_master *master = dev_iommu_priv_get(vdev->idev->dev);
Unfortunately the iommufd_device structure is defined in the
private header that's not shared with any IOMMU driver.
So, we need in the driver.c a new helper that converts a vdev
pointer to dev. Something like:
diff --git a/drivers/iommu/arm/arm-smmu-v3/tegra241-cmdqv.c b/drivers/iommu/arm/arm-smmu-v3/tegra241-cmdqv.c
index ff6bbd2137146..fd6b083535271 100644
--- a/drivers/iommu/arm/arm-smmu-v3/tegra241-cmdqv.c
+++ b/drivers/iommu/arm/arm-smmu-v3/tegra241-cmdqv.c
@@ -1227,7 +1227,8 @@ static void tegra241_vintf_destroy_vsid(struct iommufd_vdevice *vdev)
static int tegra241_vintf_init_vsid(struct iommufd_vdevice *vdev)
{
- struct arm_smmu_master *master = dev_iommu_priv_get(vdev->idev->dev);
+ struct device *dev = iommufd_vdevice_to_device(vdev);
+ struct arm_smmu_master *master = dev_iommu_priv_get(dev);
struct tegra241_vintf *vintf = viommu_to_vintf(vdev->viommu);
struct tegra241_vintf_sid *vsid = vdev_to_vsid(vdev);
struct arm_smmu_stream *stream = &master->streams[0];
diff --git a/drivers/iommu/iommufd/driver.c b/drivers/iommu/iommufd/driver.c
index df25db6d2eafc..6f1010da221c9 100644
--- a/drivers/iommu/iommufd/driver.c
+++ b/drivers/iommu/iommufd/driver.c
@@ -83,6 +83,12 @@ void _iommufd_destroy_mmap(struct iommufd_ctx *ictx,
}
EXPORT_SYMBOL_NS_GPL(_iommufd_destroy_mmap, "IOMMUFD");
+struct device *iommufd_vdevice_to_device(struct iommufd_vdevice *vdev)
+{
+ return vdev->idev->dev;
+}
+EXPORT_SYMBOL_NS_GPL(iommufd_vdevice_to_device, "IOMMUFD");
+
/* Caller should xa_lock(&viommu->vdevs) to protect the return value */
struct device *iommufd_viommu_find_dev(struct iommufd_viommu *viommu,
unsigned long vdev_id)
@@ -92,7 +98,7 @@ struct device *iommufd_viommu_find_dev(struct iommufd_viommu *viommu,
lockdep_assert_held(&viommu->vdevs.xa_lock);
vdev = xa_load(&viommu->vdevs, vdev_id);
- return vdev ? vdev->idev->dev : NULL;
+ return vdev ? iommufd_vdevice_to_device(vdev) : NULL;
}
EXPORT_SYMBOL_NS_GPL(iommufd_viommu_find_dev, "IOMMUFD");
@@ -109,7 +115,7 @@ int iommufd_viommu_get_vdev_id(struct iommufd_viommu *viommu,
xa_lock(&viommu->vdevs);
xa_for_each(&viommu->vdevs, index, vdev) {
- if (vdev->idev->dev == dev) {
+ if (iommufd_vdevice_to_device(vdev) == dev) {
*vdev_id = vdev->virt_id;
rc = 0;
break;
diff --git a/include/linux/iommufd.h b/include/linux/iommufd.h
index 61410a78cbce7..ee88e90021870 100644
--- a/include/linux/iommufd.h
+++ b/include/linux/iommufd.h
@@ -266,6 +266,7 @@ int _iommufd_alloc_mmap(struct iommufd_ctx *ictx, struct iommufd_object *owner,
unsigned long *offset);
void _iommufd_destroy_mmap(struct iommufd_ctx *ictx,
struct iommufd_object *owner, unsigned long offset);
+struct device *iommufd_vdevice_to_device(struct iommufd_vdevice *vdev);
struct device *iommufd_viommu_find_dev(struct iommufd_viommu *viommu,
unsigned long vdev_id);
int iommufd_viommu_get_vdev_id(struct iommufd_viommu *viommu,
@@ -300,6 +301,12 @@ static inline void _iommufd_destroy_mmap(struct iommufd_ctx *ictx,
{
}
+static inline struct device *
+iommufd_vdevice_to_device(struct iommufd_vdevice *vdev)
+{
+ return ERR_PTR(-ENODEV);
+}
+
static inline struct device *
iommufd_viommu_find_dev(struct iommufd_viommu *viommu, unsigned long vdev_id)
{
next prev parent reply other threads:[~2025-07-15 18:57 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-07-15 6:32 [PATCH v5 0/8] iommufd: Destroy vdevice on device unbind Xu Yilun
2025-07-15 6:32 ` [PATCH v5 1/8] iommufd/viommu: Roll back to use iommufd_object_alloc() for vdevice Xu Yilun
2025-07-15 6:32 ` [PATCH v5 2/8] iommufd: Add iommufd_object_tombstone_user() helper Xu Yilun
2025-07-15 6:32 ` [PATCH v5 3/8] iommufd: Add a pre_destroy() op for objects Xu Yilun
2025-07-15 13:19 ` Jason Gunthorpe
2025-07-15 6:32 ` [PATCH v5 4/8] iommufd: Destroy vdevice on idevice destroy Xu Yilun
2025-07-15 13:37 ` Jason Gunthorpe
2025-07-15 6:32 ` [PATCH v5 5/8] iommufd/vdevice: Remove struct device reference from struct vdevice Xu Yilun
2025-07-15 13:38 ` Jason Gunthorpe
2025-07-15 18:56 ` Nicolin Chen [this message]
2025-07-16 6:09 ` Xu Yilun
2025-07-15 20:44 ` kernel test robot
2025-07-15 6:32 ` [PATCH v5 6/8] iommufd/selftest: Explicitly skip tests for inapplicable variant Xu Yilun
2025-07-15 19:13 ` Nicolin Chen
2025-07-16 6:23 ` Xu Yilun
2025-07-15 6:32 ` [PATCH v5 7/8] iommufd/selftest: Add coverage for vdevice tombstone Xu Yilun
2025-07-15 19:03 ` Nicolin Chen
2025-07-15 6:32 ` [PATCH v5 8/8] iommufd: Rename some shortterm-related identifiers Xu Yilun
2025-07-15 13:39 ` Jason Gunthorpe
2025-07-15 19:13 ` Nicolin Chen
2025-07-15 19:33 ` [PATCH v5 0/8] iommufd: Destroy vdevice on device unbind 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=aHakX0SzQ9/EX3AT@Asurada-Nvidia \
--to=nicolinc@nvidia.com \
--cc=aik@amd.com \
--cc=aneesh.kumar@kernel.org \
--cc=baolu.lu@linux.intel.com \
--cc=dan.j.williams@intel.com \
--cc=iommu@lists.linux.dev \
--cc=jgg@nvidia.com \
--cc=jgg@ziepe.ca \
--cc=joro@8bytes.org \
--cc=kevin.tian@intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=robin.murphy@arm.com \
--cc=shuah@kernel.org \
--cc=will@kernel.org \
--cc=yilun.xu@intel.com \
--cc=yilun.xu@linux.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.