All of lore.kernel.org
 help / color / mirror / Atom feed
From: "guanghuifeng@linux.alibaba.com" <guanghuifeng@linux.alibaba.com>
To: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>,
	linux-kernel@vger.kernel.org, iommu@lists.linux.dev,
	joro@8bytes.org, jgg@nvidia.com
Cc: yi.l.liu@intel.com, kevin.tian@intel.com, nicolinc@nvidia.com,
	vasant.hegde@amd.com, jon.grimm@amd.com, santosh.shukla@amd.com,
	Sairaj.K@amd.com, jay.chen@amd.com, wvw@google.com,
	wnliu@google.com, dantuluris@google.com, chriscli@google.com,
	kpsingh@google.com, alejandro.j.jimenez@oracle.com,
	joao.m.martins@oracle.com
Subject: Re: [PATCH 16/24] iommu/amd: Introduce IOMMUFD vDevice support for AMD
Date: Wed, 19 Aug 2026 21:34:09 +0800	[thread overview]
Message-ID: <916adcd5-63fd-49b2-b175-c7b509991e37@linux.alibaba.com> (raw)
In-Reply-To: <20260727132913.22475-17-suravee.suthikulpanit@amd.com>


在 2026/7/27 21:29, Suravee Suthikulpanit 写道:
> Initialize vDevice for AMD vIOMMU by setting up the Device ID Mapping
> table using the guest device ID.
>
> Signed-off-by: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
> ---
>   drivers/iommu/amd/amd_iommu_types.h | 10 ++++++++++
>   drivers/iommu/amd/iommufd.c         | 31 +++++++++++++++++++++++++++++
>   drivers/iommu/amd/nested.c          | 27 ++++++++++++++++++++++---
>   3 files changed, 65 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/iommu/amd/amd_iommu_types.h b/drivers/iommu/amd/amd_iommu_types.h
> index 03346258e2dc..39aa872c2741 100644
> --- a/drivers/iommu/amd/amd_iommu_types.h
> +++ b/drivers/iommu/amd/amd_iommu_types.h
> @@ -388,6 +388,11 @@
>   #define DTE_GPT_LEVEL_SHIFT	54
>   #define DTE_GPT_LEVEL_MASK	GENMASK_ULL(55, 54)
>   
> +/* vIOMMU bit fields */
> +#define DTE_VIOMMU_EN_SHIFT		15
> +#define DTE_VIOMMU_GDEVICEID_MASK	GENMASK_ULL(31, 16)
> +#define DTE_VIOMMU_GUESTID_MASK		GENMASK_ULL(47, 32)
> +
>   #define GCR3_VALID		0x01ULL
>   
>   /* DTE[128:179] | DTE[184:191] */
> @@ -895,6 +900,7 @@ struct iommu_dev_data {
>   	bool defer_attach;
>   
>   	struct ratelimit_state rs;        /* Ratelimit IOPF messages */
> +
>   };
>   
>   /* Map HPET and IOAPIC ids to the devid used by the IOMMU */
> @@ -1122,6 +1128,10 @@ struct amd_irte_ops {
>   	void (*clear_allocated)(struct irq_remap_table *, int);
>   };
>   
> +struct amd_iommu_vdevice {
> +	struct iommufd_vdevice core;
> +};
> +
>   #ifdef CONFIG_IRQ_REMAP
>   extern struct amd_irte_ops irte_32_ops;
>   extern struct amd_irte_ops irte_128_ops;
> diff --git a/drivers/iommu/amd/iommufd.c b/drivers/iommu/amd/iommufd.c
> index bfc4b0ec22a9..1975b2932107 100644
> --- a/drivers/iommu/amd/iommufd.c
> +++ b/drivers/iommu/amd/iommufd.c
> @@ -9,6 +9,7 @@
>   #include "amd_iommu.h"
>   #include "amd_viommu.h"
>   #include "amd_iommu_types.h"
> +#include "../iommufd/iommufd_private.h"
>   
>   static const struct iommufd_viommu_ops amd_viommu_ops;
>   
> @@ -126,6 +127,34 @@ static void amd_iommufd_viommu_destroy(struct iommufd_viommu *viommu)
>   	amd_iommu_gid_free(iommu, aviommu->gid);
>   }
>   
> +/*
> + * Called from drivers/iommu/iommufd/viommu.c: iommufd_vdevice_alloc_ioctl()
> + */
> +static int _amd_viommu_vdevice_init(struct iommufd_vdevice *vdev)
> +{
> +	struct iommu_dev_data *dev_data;
> +	struct pci_dev *pdev = to_pci_dev(vdev->idev->dev);
> +	struct iommufd_viommu *viommu = vdev->viommu;
> +	struct amd_iommu_viommu *aviommu = container_of(viommu, struct amd_iommu_viommu, core);
> +
> +	if (!pdev) {
> +		pr_err("%s: not a PCI device\n", __func__);
> +		return -EINVAL;
> +	}
> +

to_pci_dev() is a container_of(), so it can never return NULL and the
!pdev check is dead code. Worse, for a non-PCI device it yields a bogus
pointer which is then dereferenced through dev_iommu_priv_get() below.

> +	dev_data = dev_iommu_priv_get(&pdev->dev);
> +	if (!dev_data) {
> +		pr_err("%s: Device not found (devid=%#x)\n",
> +		       __func__, pci_dev_id(pdev));
> +		return -EINVAL;
> +	}
> +
> +	pr_debug("%s: gid=%#x, hdev_id=%#x, gdev_id=%#llx\n", __func__,
> +		 aviommu->gid, pci_dev_id(pdev), vdev->virt_id);
> +
> +	return 0;
> +}
> +
>   /*
>    * See include/linux/iommufd.h
>    * struct iommufd_viommu_ops - vIOMMU specific operations
> @@ -133,4 +162,6 @@ static void amd_iommufd_viommu_destroy(struct iommufd_viommu *viommu)
>   static const struct iommufd_viommu_ops amd_viommu_ops = {
>   	.alloc_domain_nested = amd_iommu_alloc_domain_nested,
>   	.destroy = amd_iommufd_viommu_destroy,
> +	.vdevice_size = VDEVICE_STRUCT_SIZE(struct amd_iommu_vdevice, core),
> +	.vdevice_init = _amd_viommu_vdevice_init,
>   };
> diff --git a/drivers/iommu/amd/nested.c b/drivers/iommu/amd/nested.c
> index 81a5ae00225e..6f3ae2496160 100644
> --- a/drivers/iommu/amd/nested.c
> +++ b/drivers/iommu/amd/nested.c
> @@ -10,6 +10,7 @@
>   #include <uapi/linux/iommufd.h>
>   
>   #include "amd_iommu.h"
> +#include "amd_viommu.h"
>   
>   static const struct iommu_domain_ops nested_domain_ops;
>   
> @@ -183,13 +184,16 @@ amd_iommu_alloc_domain_nested(struct iommufd_viommu *viommu, u32 flags,
>   	return ERR_PTR(ret);
>   }
>   
> -static void set_dte_nested(struct amd_iommu *iommu, struct iommu_domain *dom,
> -			   struct iommu_dev_data *dev_data, struct dev_table_entry *new)
> +static int set_dte_nested(struct amd_iommu *iommu, struct iommu_domain *dom,
> +			  struct iommu_dev_data *dev_data, struct dev_table_entry *new)
>   {
> +	int ret;
> +	u16 gid;
>   	struct protection_domain *parent;
>   	struct nested_domain *ndom = to_ndomain(dom);
>   	struct iommu_hwpt_amd_guest *gdte = &ndom->gdte;
>   	struct pt_iommu_amdv1_hw_info pt_info;
> +	unsigned long gDevId;
>   
>   	/*
>   	 * The nest parent domain is attached during the call to the
> @@ -197,9 +201,15 @@ static void set_dte_nested(struct amd_iommu *iommu, struct iommu_domain *dom,
>   	 * of the struct amd_iommu_viommu.parent.
>   	 */
>   	if (WARN_ON(!ndom->viommu || !ndom->viommu->parent))
> -		return;
> +		return -EINVAL;
>   
> +	gid = ndom->viommu->gid;
>   	parent = ndom->viommu->parent;
> +
> +	ret = iommufd_viommu_get_vdev_id(&ndom->viommu->core, dev_data->dev, &gDevId);
> +	if (ret)
> +		return ret;
> +
>   	amd_iommu_make_clear_dte(iommu, dev_data->devid, new);
>   
>   	/* Retrieve the current pagetable info via the IOMMU PT API. */
> @@ -227,6 +237,17 @@ static void set_dte_nested(struct amd_iommu *iommu, struct iommu_domain *dom,
>   
>   	/* Guest paging mode */
>   	new->data[2] |= gdte->dte[2] & DTE_GPT_LEVEL_MASK;
> +
> +	/* vImuEn */
> +	new->data[3] |= 1ULL << DTE_VIOMMU_EN_SHIFT;
> +
> +	/* GDeviceID */
> +	new->data[3] |= FIELD_PREP(DTE_VIOMMU_GDEVICEID_MASK, (u16)gDevId);
> +
> +	/* GuestID */
> +	new->data[3] |= FIELD_PREP(DTE_VIOMMU_GUESTID_MASK, gid);
> +
> +	return 0;
>   }
>   
>   static int nested_attach_device(struct iommu_domain *dom, struct device *dev,

  reply	other threads:[~2026-08-19 13:34 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-27 13:28 [PATCH v4 00/24] iommu/amd: Introduce AMD Hardware-accelerated Virtualized IOMMU (vIOMMU) Support Suravee Suthikulpanit
2026-07-27 13:28 ` [PATCH 01/24] iommu/amd: Make amd_iommu_completion_wait() non-static Suravee Suthikulpanit
2026-08-05 17:01   ` Vasant Hegde
2026-07-27 13:28 ` [PATCH 02/24] iommu/amd: Introduce vIOMMU-specific events and event Suravee Suthikulpanit
2026-08-10  7:12   ` Vasant Hegde
2026-08-19  8:17   ` guanghuifeng
2026-07-27 13:28 ` [PATCH 03/24] iommu/amd: Detect and initialize AMD vIOMMU feature Suravee Suthikulpanit
2026-08-10  8:13   ` Vasant Hegde
2026-07-27 13:28 ` [PATCH 04/24] iommu/amd: Introduce IOMMUFD vIOMMU support for AMD Suravee Suthikulpanit
2026-07-27 13:28 ` [PATCH 05/24] iommu/amd: Allocate Guest IDs for IOMMUFD vIOMMU instances Suravee Suthikulpanit
2026-08-10  9:21   ` Vasant Hegde
2026-07-27 13:28 ` [PATCH 06/24] iommu/amd: Map vIOMMU VF and VF Control MMIO BARs Suravee Suthikulpanit
2026-08-10 10:00   ` Vasant Hegde
2026-08-19 13:18   ` guanghuifeng
2026-07-27 13:28 ` [PATCH 07/24] iommu/amd: Add support for AMD vIOMMU VF MMIO region Suravee Suthikulpanit
2026-08-10 10:49   ` Vasant Hegde
2026-07-27 13:28 ` [PATCH 08/24] iommu/amd: Introduce Reset vMMIO Command Suravee Suthikulpanit
2026-08-19  8:34   ` guanghuifeng
2026-07-27 13:28 ` [PATCH 09/24] iommu/amd: Introduce and map vIOMMU private IPA region Suravee Suthikulpanit
2026-07-27 13:28 ` [PATCH 10/24] iommu/amd: Pass iommu to device_flush_dte() Suravee Suthikulpanit
2026-08-10 11:07   ` Vasant Hegde
2026-07-27 13:29 ` [PATCH 11/24] iommu/amd: Export amd_iommu_alloc_dev_data() helper Suravee Suthikulpanit
2026-07-27 13:29 ` [PATCH 12/24] iommu/amd: Pass iommu and devid to amd_iommu_make_clear_dte() Suravee Suthikulpanit
2026-07-27 13:29 ` [PATCH 13/24] iommu/amd: Assign IOMMU Private Address domain to IOMMU Suravee Suthikulpanit
2026-07-27 13:29 ` [PATCH 14/24] iommu/amd: Add per-VM private IPA alloc/map helpers Suravee Suthikulpanit
2026-07-27 13:29 ` [PATCH 15/24] iommu/amd: Add helper functions to manage DevID / DomID mapping tables Suravee Suthikulpanit
2026-08-19 13:30   ` guanghuifeng
2026-07-27 13:29 ` [PATCH 16/24] iommu/amd: Introduce IOMMUFD vDevice support for AMD Suravee Suthikulpanit
2026-08-19 13:34   ` guanghuifeng [this message]
2026-07-27 13:29 ` [PATCH 17/24] iommu/amd: Introduce helper function for updating domain ID mapping table Suravee Suthikulpanit
2026-08-19 10:45   ` guanghuifeng
2026-07-27 13:29 ` [PATCH 18/24] iommu/amd: Introduce helper function for updating device " Suravee Suthikulpanit
2026-08-10 15:17   ` Vasant Hegde
2026-08-19 10:26   ` guanghuifeng
2026-07-27 13:29 ` [PATCH 19/24] iommu/amd: Add per-segment translate device ID pool Suravee Suthikulpanit
2026-07-27 13:29 ` [PATCH 20/24] iommu/amd: Reserve translate-device-id for PCI requestor aliases Suravee Suthikulpanit
2026-07-27 13:29 ` [PATCH 21/24] iommu/amd: Add translation DTE and VFctrl TransDevID helpers Suravee Suthikulpanit
2026-07-27 13:29 ` [PATCH 22/24] iommu/amd: Add translate-device-id alloc/free with vIOMMU owner Suravee Suthikulpanit
2026-07-27 13:29 ` [PATCH 23/24] iommu/amd: Assign per-vIOMMU translate device ID Suravee Suthikulpanit
2026-08-19 10:18   ` guanghuifeng
2026-07-27 13:29 ` [PATCH 24/24] iommu/amd: Relocate vIOMMU translate-device-id on PCI reserve Suravee Suthikulpanit
2026-08-19  9:42   ` guanghuifeng
2026-08-11  7:18 ` [PATCH v4 00/24] iommu/amd: Introduce AMD Hardware-accelerated Virtualized IOMMU (vIOMMU) Support Tian, Kevin

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=916adcd5-63fd-49b2-b175-c7b509991e37@linux.alibaba.com \
    --to=guanghuifeng@linux.alibaba.com \
    --cc=Sairaj.K@amd.com \
    --cc=alejandro.j.jimenez@oracle.com \
    --cc=chriscli@google.com \
    --cc=dantuluris@google.com \
    --cc=iommu@lists.linux.dev \
    --cc=jay.chen@amd.com \
    --cc=jgg@nvidia.com \
    --cc=joao.m.martins@oracle.com \
    --cc=jon.grimm@amd.com \
    --cc=joro@8bytes.org \
    --cc=kevin.tian@intel.com \
    --cc=kpsingh@google.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=nicolinc@nvidia.com \
    --cc=santosh.shukla@amd.com \
    --cc=suravee.suthikulpanit@amd.com \
    --cc=vasant.hegde@amd.com \
    --cc=wnliu@google.com \
    --cc=wvw@google.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.