|
[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
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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |