|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH] vpci/msix: conditionally invoke vpci_make_msix_hole
On Tue, Aug 12, 2025 at 11:17:42AM -0400, Stewart Hildebrand wrote:
> A hotplugged PCI device may be added uninitialized. In particular,
> memory decoding may be disabled and the BARs may be zeroed. In this
> case, the BARs will not be mapped in p2m. However, currently
> vpci_make_msix_hole is called unconditionally in init_msix, and the
> initialization fails in this case:
>
> (XEN) d0v0 0000:01:00.0: existing mapping (mfn: 1c1880 type: 0) at 0 clobbers
> MSIX MMIO area
> (XEN) d0 0000:01:00.0: init legacy cap 17 fail rc=-17, mask it
>
> vpci_make_msix_hole should only be called if the BARs containing the
> MSI-X/PBA tables are mapped in p2m.
>
> Take the opportunity to fix a typo in the preceding comment.
>
> Fixes: ee2eb6849d50 ("vpci: Refactor REGISTER_VPCI_INIT")
> Signed-off-by: Stewart Hildebrand <stewart.hildebrand@xxxxxxx>
> ---
> xen/drivers/vpci/msix.c | 10 ++++++++--
> 1 file changed, 8 insertions(+), 2 deletions(-)
>
> diff --git a/xen/drivers/vpci/msix.c b/xen/drivers/vpci/msix.c
> index 54a5070733aa..39d1c45bd296 100644
> --- a/xen/drivers/vpci/msix.c
> +++ b/xen/drivers/vpci/msix.c
> @@ -705,10 +705,16 @@ static int cf_check init_msix(struct pci_dev *pdev)
>
> /*
> * vPCI header initialization will have mapped the whole BAR into the
> - * p2m, as MSI-X capability was not yet initialized. Crave a hole for
> + * p2m, as MSI-X capability was not yet initialized. Carve a hole for
> * the MSI-X table here, so that Xen can trap accesses.
> */
> - return vpci_make_msix_hole(pdev);
> + if ( pdev->vpci->header.bars[
> + msix->tables[VPCI_MSIX_TABLE] & PCI_MSIX_BIRMASK].enabled ||
> + pdev->vpci->header.bars[
> + msix->tables[VPCI_MSIX_PBA] & PCI_MSIX_BIRMASK].enabled )
> + return vpci_make_msix_hole(pdev);
I think it might be better to place this checks inside of
vpci_make_msix_hole() itself, so that in case the guest moves the BAR
to an invalid position vpci_make_msix_hole() doesn't return error
either.
At the same time, you might want to introduce some helper to make this
less cumbersome, for example:
bool vmsix_table_bar_valid(const struct vpci *vpci, unsigned int nr)
{
return vpci->header.bars[vpci->msix->tables[nr] &
PCI_MSIX_BIRMASK].enabled;
}
Note that if you adjust vpci_make_msix_hole() this way you will also
need to move the call in modify_decoding() so it happens strictly
after bar->enabled is set.
Thanks, Roger.
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |