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

Re: cleanup swiotlb initialization



On Thu, Feb 24, 2022 at 12:07:26PM -0500, Boris Ostrovsky wrote:
>>> Just to be clear: this crashes only as dom0. Boots fine as baremetal.
>> Ah.  I can gues what this might be.  On Xen the hypervisor controls the
>> IOMMU and we should never end up initializing it in Linux, right?
>
>
> Right, we shouldn't be in that code path.

Can you try the patch below on top of the series?


diff --git a/arch/x86/kernel/pci-dma.c b/arch/x86/kernel/pci-dma.c
index b849f11a756d0..f88c9a4a5ed12 100644
--- a/arch/x86/kernel/pci-dma.c
+++ b/arch/x86/kernel/pci-dma.c
@@ -47,22 +47,6 @@ static unsigned int x86_swiotlb_flags;
  */
 static void __init pci_swiotlb_detect_4gb(void)
 {
-#ifdef CONFIG_SWIOTLB_XEN
-       if (xen_pv_domain()) {
-               if (xen_initial_domain())
-                       x86_swiotlb_enable = true;
-
-               if (x86_swiotlb_enable) {
-                       dma_ops = &xen_swiotlb_dma_ops;
-#ifdef CONFIG_PCI
-                       /* Make sure ACS will be enabled */
-                       pci_request_acs();
-#endif
-               }
-               return;
-       }
-#endif /* CONFIG_SWIOTLB_XEN */
-
        /* don't initialize swiotlb if iommu=off (no_iommu=1) */
        if (!no_iommu && max_possible_pfn > MAX_DMA32_PFN)
                x86_swiotlb_enable = true;
@@ -82,16 +66,36 @@ static inline void __init pci_swiotlb_detect_4gb(void)
 }
 #endif /* CONFIG_SWIOTLB */
 
+#ifdef CONFIG_SWIOTLB_XEN
+static void __init xen_swiotlb_init(void)
+{
+       if (!xen_initial_domain() && !x86_swiotlb_enable)
+               return;
+       x86_swiotlb_enable = true;
+       dma_ops = &xen_swiotlb_dma_ops;
+#ifdef CONFIG_PCI
+       /* Make sure ACS will be enabled */
+       pci_request_acs();
+#endif
+       swiotlb_init_remap(true, x86_swiotlb_flags, xen_swiotlb_fixup);
+}
+#else
+static inline void __init xen_swiotlb_init(void)
+{
+}
+#endif /* CONFIG_SWIOTLB_XEN */
+
 void __init pci_iommu_alloc(void)
 {
+       if (xen_pv_domain()) {
+               xen_swiotlb_init();
+               return;
+       }
        pci_swiotlb_detect_4gb();
        gart_iommu_hole_init();
        amd_iommu_detect();
        detect_intel_iommu();
-#ifdef CONFIG_SWIOTLB
-       swiotlb_init_remap(x86_swiotlb_enable, x86_swiotlb_flags,
-                          xen_pv_domain() ? xen_swiotlb_fixup : NULL);
-#endif
+       swiotlb_init(x86_swiotlb_enable, x86_swiotlb_flags);
 }
 
 /*



 


Rackspace

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