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

Re: [RFC] xen/x86: allow overlaps with non-RAM regions



On Thu, Apr 24, 2025 at 02:38:29PM -0700, Lira, Victor M wrote:
> Hello all,
> 
> Here is the output from Roger's patch.
> This is the section of interest:
> 
> > (XEN) [ 7.547326] d0 has maximum 3328PIRQs
> > (XEN) [ 7.555644] *** Building a PVH Dom0 ***
> > (XEN) [ 7.567780] d0: identity mappings for IOMMU:
> > (XEN) [ 7.577312]  [00000000a0, 00000000ff] RW
> > (XEN) [ 7.586153]  [0000009bff, 0000009fff] RW
> > (XEN) [ 7.594992]  [00000cabc9, 00000cc14c] RW
> > (XEN) [ 7.603866]  [00000cc389, 00000cc389] RW
> > (XEN) [ 7.612707]  [00000cc70a, 00000cd1fe] RW
> > (XEN) [ 7.621896]  [00000ce000, 00000cffff] RW
> > (XEN) [ 7.630731]  [00000fd000, 00000fd2ff] RW
> > (XEN) [ 7.639573]  [00000fd304, 00000febff] RW
> > (XEN) [ 7.648414] gfn 0xfe800mfn 0xfe800type 5order 9
> > (XEN) [ 7.658985] Xen WARNat arch/x86/mm/p2m-pt.c:599
> > (XEN) [ 7.669215] ----[ Xen-4.21-unstable x86_64  debug=y  Tainted:   C
> >    ]----
> > ...
> > (XEN) [ 8.227521] Xen call trace:
> > (XEN) [ 8.234107]    [<ffff82d040309bd6>] R
> > arch/x86/mm/p2m-pt.c#p2m_pt_set_entry+0xc1/0x961
> > (XEN) [ 8.250925]    [<ffff82d0402fbf0d>] F p2m_set_entry+0xb5/0x13c
> > (XEN) [ 8.263579]    [<ffff82d0402fc091>] F
> > arch/x86/mm/p2m.c#set_typed_p2m_entry+0xfd/0x6f0
> > (XEN) [ 8.280388]    [<ffff82d0402fdcd4>] F set_mmio_p2m_entry+0x62/0x6b
> > (XEN) [ 8.293735]    [<ffff82d0402ff9cf>] F map_mmio_regions+0x77/0xcf
> > (XEN) [ 8.306734]    [<ffff82d04042fc1b>] F
> > drivers/passthrough/x86/iommu.c#identity_map+0x7e/0x196
> > (XEN) [ 8.324761]    [<ffff82d040232935>] F
> > rangeset_report_ranges+0x10a/0x159
> > (XEN) [ 8.339149]    [<ffff82d0404301e6>] F
> > arch_iommu_hwdom_init+0x27f/0x316
> > (XEN) [ 8.353361]    [<ffff82d04042cffa>] F
> > drivers/passthrough/amd/pci_amd_iommu.c#amd_iommu_hwdom_init+0xa9/0xc1
> > (XEN) [ 8.373988]    [<ffff82d040430846>] F iommu_hwdom_init+0x26/0x2e
> > (XEN) [ 8.386989]    [<ffff82d040441a30>] F
> > dom0_construct_pvh+0x265/0x1141
> > (XEN) [ 8.400860]    [<ffff82d040457f7c>] F construct_dom0+0x47/0x93
> > (XEN) [ 8.413511]    [<ffff82d0404504e0>] F __start_xen+0x21fc/0x2425
> > (XEN) [ 8.426340]    [<ffff82d0402043be>] F __high_start+0x8e/0x90
> > (XEN) [ 8.438646]
> > (XEN) [ 8.442632]  [00000fec02, 00000fedff] RW
> > (XEN) [ 8.451599]  [00000fee01, 00000fffff] RW
> > (XEN) [ 8.460571]  [000080f340, 00008501ff] RW
> > (XEN) [ 8.470205] 0000:02:00.0: not mapping BAR [fea00, fea03] invalid
> > position
> > (XEN) [ 8.484769] 0000:03:00.0: not mapping BAR [fe900, fe90f] invalid
> > position
> > (XEN) [ 8.499330] 0000:03:00.0: not mapping BAR [fe910, fe913] invalid
> > position
> > (XEN) [ 8.513890] gfn 0xfe910mfn 0xfffffffffffffffftype 1order 0
> > (XEN) [ 8.526370] Xen WARNat arch/x86/mm/p2m-pt.c:599
> > ...
> > (XEN) [ 9.094902] Xen call trace:
> > (XEN) [ 9.101491]    [<ffff82d040309bd6>] R
> > arch/x86/mm/p2m-pt.c#p2m_pt_set_entry+0xc1/0x961
> > (XEN) [ 9.118306]    [<ffff82d0402fbf0d>] F p2m_set_entry+0xb5/0x13c
> > (XEN) [ 9.130957]    [<ffff82d0402fe1fb>] F
> > p2m_remove_identity_entry+0x26f/0x2ca
> > (XEN) [ 9.145865]    [<ffff82d040268a4a>] F
> > vpci_make_msix_hole+0x11a/0x27a
> > (XEN) [ 9.159734]    [<ffff82d0402654c4>] F
> > drivers/vpci/header.c#modify_decoding+0x4e/0x1b3
> > (XEN) [ 9.176547]    [<ffff82d040265c89>] F
> > drivers/vpci/header.c#modify_bars+0x660/0x6c4
> > (XEN) [ 9.192838]    [<ffff82d040266427>] F
> > drivers/vpci/header.c#init_header+0x5e7/0x86f
> > (XEN) [ 9.209129]    [<ffff82d04026449c>] F vpci_assign_device+0xd3/0x115
> > (XEN) [ 9.222648]    [<ffff82d040430de4>] F
> > drivers/passthrough/pci.c#setup_one_hwdom_device+0x92/0x15b
> > (XEN) [ 9.241368]    [<ffff82d04043112a>] F
> > drivers/passthrough/pci.c#_setup_hwdom_pci_devices+0x158/0x241
> > (XEN) [ 9.260612]    [<ffff82d04027aad7>] F
> > drivers/passthrough/pci.c#pci_segments_iterate+0x43/0x69
> > (XEN) [ 9.278814]    [<ffff82d040431513>] F
> > setup_hwdom_pci_devices+0x28/0x2f
> > (XEN) [ 9.293026]    [<ffff82d04042d009>] F
> > drivers/passthrough/amd/pci_amd_iommu.c#amd_iommu_hwdom_init+0xb8/0xc1
> > (XEN) [ 9.313649]    [<ffff82d040430846>] F iommu_hwdom_init+0x26/0x2e
> > (XEN) [ 9.326652]    [<ffff82d040441a30>] F
> > dom0_construct_pvh+0x265/0x1141
> > (XEN) [ 9.340516]    [<ffff82d040457f7c>] F construct_dom0+0x47/0x93
> > (XEN) [ 9.353172]    [<ffff82d0404504e0>] F __start_xen+0x21fc/0x2425
> > (XEN) [ 9.365999]    [<ffff82d0402043be>] F __high_start+0x8e/0x90
> > (XEN) [ 9.378305]
> > (XEN) [ 9.382289] 0000:04:00.0: not mapping BAR [fe700, fe77f] invalid
> > position
> > (XEN) [ 9.396850] 0000:04:00.3: not mapping BAR [fe500, fe5ff] invalid
> > position
> > (XEN) [ 9.411412] 0000:04:00.4: not mapping BAR [fe400, fe4ff] invalid
> > position
> > (XEN) [ 9.425972] 0000:05:00.0: not mapping BAR [fe801, fe801] invalid
> > position
> > (XEN) [ 9.440531] 0000:05:00.1: not mapping BAR [fe800, fe800] invalid
> > position
> 
> So vpci_make_msix_hole is where it's getting removed.

Oh, the output is very mangled when displaying the email on my MUA,
but I see.  I think I now get what's happening.

Since the BAR falls into a reserved region, the `enabled` bit for it is
never set, and thus the handling in msix_accept() never triggers,
leaving those accesses unhandled and terminated by the null handler.

I think the patch below should fix it, let me know how it goes.

There's also a further known issue with vpci_make_msix_hole(): if the
BARs are repositioned the holes are not restored to their previous
values, but I don't think you are hitting that issue (yet).

Thanks, Roger.
---
diff --git a/xen/drivers/vpci/msix.c b/xen/drivers/vpci/msix.c
index f3804ce047a3..bcdeffc16a95 100644
--- a/xen/drivers/vpci/msix.c
+++ b/xen/drivers/vpci/msix.c
@@ -158,12 +158,10 @@ static struct vpci_msix *msix_find(const struct domain 
*d, unsigned long addr)
 
     list_for_each_entry ( msix, &d->arch.hvm.msix_tables, next )
     {
-        const struct vpci_bar *bars = msix->pdev->vpci->header.bars;
         unsigned int i;
 
         for ( i = 0; i < ARRAY_SIZE(msix->tables); i++ )
-            if ( bars[msix->tables[i] & PCI_MSIX_BIRMASK].enabled &&
-                 VMSIX_ADDR_SAME_PAGE(addr, msix->pdev->vpci, i) )
+            if ( VMSIX_ADDR_SAME_PAGE(addr, msix->pdev->vpci, i) )
                 return msix;
     }
 
@@ -392,7 +390,7 @@ static int cf_check msix_read(
         return rc;
     }
 
-    if ( !access_allowed(msix->pdev, addr, len) )
+    if ( !msix->enabled || !access_allowed(msix->pdev, addr, len) )
     {
         read_unlock(&d->pci_lock);
         return X86EMUL_OKAY;
@@ -539,7 +537,7 @@ static int cf_check msix_write(
         return rc;
     }
 
-    if ( !access_allowed(msix->pdev, addr, len) )
+    if ( !msix->enabled || !access_allowed(msix->pdev, addr, len) )
     {
         read_unlock(&d->pci_lock);
         return X86EMUL_OKAY;




 


Rackspace

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