Discussion:
[Xen-changelog] [xen staging] IOMMU/x86: remove indirection from certain IOMMU hook accesses
p***@xen.org
2018-11-15 12:44:14 UTC
Permalink
commit 32a5ea00ec75ef53e1f5e095786a34f98fd2e22b
Author: Jan Beulich <***@suse.com>
AuthorDate: Thu Nov 15 13:34:21 2018 +0100
Commit: Jan Beulich <***@suse.com>
CommitDate: Thu Nov 15 13:34:21 2018 +0100

IOMMU/x86: remove indirection from certain IOMMU hook accesses

There's no need to go through an extra level of indirection. In order to
limit code churn, call sites using struct domain_iommu's platform_ops
don't get touched here, however.

Signed-off-by: Jan Beulich <***@suse.com>
Reviewed-by: Kevin Tian <***@intel.com>
Acked-by: Brian Woods <***@amd.com>
---
xen/drivers/passthrough/amd/pci_amd_iommu.c | 6 +++++-
xen/drivers/passthrough/vtd/extern.h | 1 +
xen/drivers/passthrough/vtd/intremap.c | 2 ++
xen/drivers/passthrough/vtd/iommu.c | 4 +++-
xen/drivers/passthrough/x86/iommu.c | 2 ++
xen/include/asm-x86/iommu.h | 17 ++++-------------
6 files changed, 17 insertions(+), 15 deletions(-)

diff --git a/xen/drivers/passthrough/amd/pci_amd_iommu.c b/xen/drivers/passthrough/amd/pci_amd_iommu.c
index d3909daa8d..900136390d 100644
--- a/xen/drivers/passthrough/amd/pci_amd_iommu.c
+++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c
@@ -29,6 +29,8 @@

static bool_t __read_mostly init_done;

+static const struct iommu_ops amd_iommu_ops;
+
struct amd_iommu *find_iommu_for_device(int seg, int bdf)
{
struct ivrs_mappings *ivrs_mappings = get_ivrs_mappings(seg);
@@ -182,6 +184,8 @@ int __init amd_iov_detect(void)
return -ENODEV;
}

+ iommu_ops = amd_iommu_ops;
+
if ( amd_iommu_init() != 0 )
{
printk("AMD-Vi: Error initialization\n");
@@ -566,7 +570,7 @@ static void amd_dump_p2m_table(struct domain *d)
amd_dump_p2m_table_level(hd->arch.root_table, hd->arch.paging_mode, 0, 0);
}

-const struct iommu_ops amd_iommu_ops = {
+static const struct iommu_ops __initconstrel amd_iommu_ops = {
.init = amd_iommu_domain_init,
.hwdom_init = amd_iommu_hwdom_init,
.add_device = amd_iommu_add_device,
diff --git a/xen/drivers/passthrough/vtd/extern.h b/xen/drivers/passthrough/vtd/extern.h
index 91cadc602e..16eada9fa2 100644
--- a/xen/drivers/passthrough/vtd/extern.h
+++ b/xen/drivers/passthrough/vtd/extern.h
@@ -27,6 +27,7 @@

struct pci_ats_dev;
extern bool_t rwbf_quirk;
+extern const struct iommu_ops intel_iommu_ops;

void print_iommu_regs(struct acpi_drhd_unit *drhd);
void print_vtd_entries(struct iommu *iommu, int bus, int devfn, u64 gmfn);
diff --git a/xen/drivers/passthrough/vtd/intremap.c b/xen/drivers/passthrough/vtd/intremap.c
index 1e0317c47a..a0663ecd22 100644
--- a/xen/drivers/passthrough/vtd/intremap.c
+++ b/xen/drivers/passthrough/vtd/intremap.c
@@ -897,6 +897,8 @@ int iommu_enable_x2apic_IR(void)
else if ( !x2apic_enabled )
return -EOPNOTSUPP;

+ iommu_ops = intel_iommu_ops;
+
for_each_drhd_unit ( drhd )
{
iommu = drhd->iommu;
diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c
index 4d1ff10817..1601278b07 100644
--- a/xen/drivers/passthrough/vtd/iommu.c
+++ b/xen/drivers/passthrough/vtd/iommu.c
@@ -2299,6 +2299,8 @@ int __init intel_vtd_setup(void)
goto error;
}

+ iommu_ops = intel_iommu_ops;
+
/* We enable the following features only if they are supported by all VT-d
* engines: Snoop Control, DMA passthrough, Queued Invalidation, Interrupt
* Remapping, and Posted Interrupt
@@ -2698,7 +2700,7 @@ static void vtd_dump_p2m_table(struct domain *d)
vtd_dump_p2m_table_level(hd->arch.pgd_maddr, agaw_to_level(hd->arch.agaw), 0, 0);
}

-const struct iommu_ops intel_iommu_ops = {
+const struct iommu_ops __initconstrel intel_iommu_ops = {
.init = intel_iommu_domain_init,
.hwdom_init = intel_iommu_hwdom_init,
.add_device = intel_iommu_add_device,
diff --git a/xen/drivers/passthrough/x86/iommu.c b/xen/drivers/passthrough/x86/iommu.c
index b20bad17de..e488889071 100644
--- a/xen/drivers/passthrough/x86/iommu.c
+++ b/xen/drivers/passthrough/x86/iommu.c
@@ -23,6 +23,8 @@
#include <asm/hvm/io.h>
#include <asm/setup.h>

+struct iommu_ops iommu_ops;
+
void iommu_update_ire_from_apic(
unsigned int apic, unsigned int reg, unsigned int value)
{
diff --git a/xen/include/asm-x86/iommu.h b/xen/include/asm-x86/iommu.h
index fa37b0539b..8dc392473d 100644
--- a/xen/include/asm-x86/iommu.h
+++ b/xen/include/asm-x86/iommu.h
@@ -56,24 +56,15 @@ struct arch_iommu
struct guest_iommu *g_iommu;
};

-extern const struct iommu_ops intel_iommu_ops;
-extern const struct iommu_ops amd_iommu_ops;
int intel_vtd_setup(void);
int amd_iov_detect(void);

+extern struct iommu_ops iommu_ops;
+
static inline const struct iommu_ops *iommu_get_ops(void)
{
- switch ( boot_cpu_data.x86_vendor )
- {
- case X86_VENDOR_INTEL:
- return &intel_iommu_ops;
- case X86_VENDOR_AMD:
- return &amd_iommu_ops;
- }
-
- BUG();
-
- return NULL;
+ BUG_ON(!iommu_ops.init);
+ return &iommu_ops;
}

static inline int iommu_hardware_setup(void)
--
generated by git-patchbot for /home/xen/git/xen.git#staging

Loading...