[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH v3] xen/amd/iommu: record the IOMMU and device flags for alias DeviceIDs


  • To: <xen-devel@xxxxxxxxxxxxxxxxxxxx>
  • From: Stefano Stabellini <stefano.stabellini@xxxxxxx>
  • Date: Tue, 27 Oct 2026 13:14:25 -0700
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=lists.xenproject.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0)
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=tc0VsvVfm6WuHGRWbAbKWgEuDSYq25/YDozURZfCBg8=; b=BdC/fMDnpQuMOUcIqdmn6GdwEMzBAyTszl8sepv4SdnVwHj3JHb+FxgZYJF58OYbhdLlHX1K0CxWoclnpoHyJwjUWFSHgYMM/T31X45IlJ/y6JIBzjlkwKdB4E9xSQ2JlBeFnD8zu6PJ8dWpbTtyrX9qg+FYE2VkMyC+gWCro43qVdrXnlJG//bK2l4PFlYF+QHulV3t2BGcJr/xtzVZqRp3hH7RcmoOVAsci+Gyp1mBgEZNC5nCSlkzRXCe5u+22HbFeq+NnsSpLD2/p/LIUV23Pw3r/fjr7KxHHMP09hq2CnoaYrmjFYTzcHrv2aBcQo6eMupx5fpVNdS1NTB4QQ==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=a8n0aVYRVvPprDEU6pzhAsBtH+MSQMKwl7w9ps9fLm9nCFXKDGnL0VNun9c9nkV0NDY0fzF8C9zf9kwRIffLFWrgC0uExS4LzT0kUrFkbIWs6OLC39m+6w7SUGK2RxORc4lE23NFm7l9HlQjKVpO7bvQgWCY5z4U+t1cZkI241FUnZpwPNZlnMWLi873Y1ugLDXU0BYaKx2bjbj28BrfdUVZ420fF8081OmmJokCWSVLYSjzvVUb+KcsCdU5bBrzXef96bDXzGXNxihO4xTJlYSgRmIDED9mPOLPNCbzBr/0eBk3GD/Jp1NsUg2tZO3R0wedzrjvTRl+/gDUe1oWsg==
  • Authentication-results: eu.smtp.expurgate.cloud; dkim=pass header.s=selector1 header.d=amd.com header.i="@amd.com" header.h="From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck"
  • Cc: Stefano Stabellini <stefano.stabellini@xxxxxxx>, <jbeulich@xxxxxxxx>, <andrew.cooper3@xxxxxxxxxx>, <roger@xxxxxxxxxxxxxx>, <jason.andryuk@xxxxxxx>, <teddy.astie@xxxxxxxxxx>
  • Delivery-date: Tue, 27 Oct 2026 20:14:48 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

add_ivrs_mapping_entry() marks an alias DeviceID valid and may give it
an interrupt remapping table, but records the IOMMU and the IVHD device
flags only for the device using the alias.  If no IVHD entry names the
alias DeviceID itself, amd_iommu_setup_device_table() passes a NULL
IOMMU to amd_iommu_set_intremap_table(), which dereferences it at boot,
and the alias's DTE, the one applying to requests using the alias, is
set up without the device's pass-through and SysMgt settings.

Give the alias the IOMMU and the device flags too, as was done before
the interrupt remapping rework, and as Linux does.

Fixes: a3713b97e8e1 ("AMD IOMMU: Rework of interrupt remapping")
Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxx>
---
On v2, Jan asked about:

- amd_iommu_alloc_intremap_table(): not reached for the alias, which
  already has a table when interrupt remapping is on.  When it's off,
  amd_iommu_set_intremap_table() doesn't use the IOMMU.

- find_iommu_for_device(): before, an unnamed alias crashed at boot
  with interrupt remapping on.  With it off, a device at the alias
  failed to be added (-ENODEV), or got function 0's entry copied over
  the alias's, losing its unity maps.  It now returns the alias's
  IOMMU, and an IVMD naming the alias is applied instead of ignored.

- amd_iommu_get_reserved_device_memory(): the alias is no longer
  skipped.  For XENMEM_RDM_ALL its ranges are reported once under it,
  not once per device using it.

- Earlier vs later entries: later entries still win, so an alias entry
  can now override the device flags of an earlier entry for the alias
  itself.  The alias's IOMMU is asserted to match, as suggested.

- Other fields: device_flags is now set for the alias.  The rest are
  either the alias's own or already recorded for it; block_ats is
  never set by alias entries, so using the alias's is OK.

Changes in v3:
- record the alias's IOMMU unconditionally, asserting that one recorded
  earlier matches
- also record the device flags for the alias

Changes in v2:
- describe the crash precisely, and why nothing relies on the alias
  entry's IOMMU being NULL
- add a Fixes tag
---
 xen/drivers/passthrough/amd/iommu_acpi.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/xen/drivers/passthrough/amd/iommu_acpi.c 
b/xen/drivers/passthrough/amd/iommu_acpi.c
index d118b36d80..e60dd675d7 100644
--- a/xen/drivers/passthrough/amd/iommu_acpi.c
+++ b/xen/drivers/passthrough/amd/iommu_acpi.c
@@ -104,6 +104,15 @@ static void __init add_ivrs_mapping_entry(
 
     /* Assign IOMMU hardware. */
     ivrs_mappings[bdf].iommu = iommu;
+
+    /*
+     * Requests using the alias go through the same IOMMU, and the alias's
+     * DTE is the one applying to them.
+     */
+    if ( ivrs_mappings[alias_id].iommu )
+        ASSERT(ivrs_mappings[alias_id].iommu == iommu);
+    ivrs_mappings[alias_id].iommu = iommu;
+    ivrs_mappings[alias_id].device_flags = flags;
 }
 
 static struct amd_iommu * __init find_iommu_from_bdf_cap(
-- 
2.47.3




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.