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