|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] RE: [PATCH 1/2] VT-d: install sync_cache hook on demand
> From: Jan Beulich <jbeulich@xxxxxxxx>
> Sent: Wednesday, July 15, 2020 6:04 PM
>
> Instead of checking inside the hook whether any non-coherent IOMMUs are
> present, simply install the hook only when this is the case.
>
> To prove that there are no other references to the now dynamically
> updated ops structure (and hence that its updating happens early
> enough), make it static and rename it at the same time.
>
> Note that this change implies that sync_cache() shouldn't be called
> directly unless there are unusual circumstances, like is the case in
> alloc_pgtable_maddr(), which gets invoked too early for iommu_ops to
> be set already (and therefore we also need to be careful there to
> avoid accessing vtd_ops later on, as it lives in .init).
>
> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
Reviewed-by: Kevin Tian <kevin.tian@xxxxxxxxx>
>
> --- a/xen/drivers/passthrough/vtd/extern.h
> +++ b/xen/drivers/passthrough/vtd/extern.h
> @@ -28,7 +28,6 @@
> struct pci_ats_dev;
> extern bool_t rwbf_quirk;
> extern const struct iommu_init_ops intel_iommu_init_ops;
> -extern const struct iommu_ops intel_iommu_ops;
>
> void print_iommu_regs(struct acpi_drhd_unit *drhd);
> void print_vtd_entries(struct vtd_iommu *iommu, int bus, int devfn, u64
> gmfn);
> --- a/xen/drivers/passthrough/vtd/iommu.c
> +++ b/xen/drivers/passthrough/vtd/iommu.c
> @@ -59,6 +59,7 @@ bool __read_mostly iommu_snoop = true;
>
> int nr_iommus;
>
> +static struct iommu_ops vtd_ops;
> static struct tasklet vtd_fault_tasklet;
>
> static int setup_hwdom_device(u8 devfn, struct pci_dev *);
> @@ -146,16 +147,11 @@ static int context_get_domain_id(struct
> return domid;
> }
>
> -static int iommus_incoherent;
> -
> static void sync_cache(const void *addr, unsigned int size)
> {
> static unsigned long clflush_size = 0;
> const void *end = addr + size;
>
> - if ( !iommus_incoherent )
> - return;
> -
> if ( clflush_size == 0 )
> clflush_size = get_cache_line_size();
>
> @@ -217,7 +213,8 @@ uint64_t alloc_pgtable_maddr(unsigned lo
> vaddr = __map_domain_page(cur_pg);
> memset(vaddr, 0, PAGE_SIZE);
>
> - sync_cache(vaddr, PAGE_SIZE);
> + if ( (iommu_ops.init ? &iommu_ops : &vtd_ops)->sync_cache )
> + sync_cache(vaddr, PAGE_SIZE);
> unmap_domain_page(vaddr);
> cur_pg++;
> }
> @@ -1227,7 +1224,7 @@ int __init iommu_alloc(struct acpi_drhd_
> iommu->nr_pt_levels = agaw_to_level(agaw);
>
> if ( !ecap_coherent(iommu->ecap) )
> - iommus_incoherent = 1;
> + vtd_ops.sync_cache = sync_cache;
>
> /* allocate domain id bitmap */
> nr_dom = cap_ndoms(iommu->cap);
> @@ -2737,7 +2734,7 @@ static int __init intel_iommu_quarantine
> return level ? -ENOMEM : rc;
> }
>
> -const struct iommu_ops __initconstrel intel_iommu_ops = {
> +static struct iommu_ops __initdata vtd_ops = {
> .init = intel_iommu_domain_init,
> .hwdom_init = intel_iommu_hwdom_init,
> .quarantine_init = intel_iommu_quarantine_init,
> @@ -2768,11 +2765,10 @@ const struct iommu_ops __initconstrel in
> .iotlb_flush_all = iommu_flush_iotlb_all,
> .get_reserved_device_memory =
> intel_iommu_get_reserved_device_memory,
> .dump_p2m_table = vtd_dump_p2m_table,
> - .sync_cache = sync_cache,
> };
>
> const struct iommu_init_ops __initconstrel intel_iommu_init_ops = {
> - .ops = &intel_iommu_ops,
> + .ops = &vtd_ops,
> .setup = vtd_setup,
> .supports_x2apic = intel_iommu_supports_eim,
> };
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |