|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v4] vpci/msix: fix PBA accesses
On 07.03.2022 17:37, Roger Pau Monne wrote:
> Map the PBA in order to access it from the MSI-X read and write
> handlers. Note that previously the handlers would pass the physical
> host address into the {read,write}{l,q} handlers, which is wrong as
> those expect a linear address.
>
> Map the PBA using ioremap when the first access is performed. Note
> that 32bit arches might want to abstract the call to ioremap into a
> vPCI arch handler, so they can use a fixmap range to map the PBA.
>
> Reported-by: Jan Beulich <jbeulich@xxxxxxxx>
> Signed-off-by: Roger Pau Monné <roger.pau@xxxxxxxxxx>
Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
> Cc: Alex Olson <this.is.a0lson@xxxxxxxxx>
I'll wait a little with committing, in the hope for Alex to re-provide
a Tested-by.
> --- a/xen/drivers/vpci/msix.c
> +++ b/xen/drivers/vpci/msix.c
> @@ -182,6 +182,38 @@ static struct vpci_msix_entry *get_entry(struct
> vpci_msix *msix,
> return &msix->entries[(addr - start) / PCI_MSIX_ENTRY_SIZE];
> }
>
> +static void __iomem *get_pba(struct vpci *vpci)
> +{
> + struct vpci_msix *msix = vpci->msix;
> + /*
> + * PBA will only be unmapped when the device is deassigned, so access it
> + * without holding the vpci lock.
> + */
> + void __iomem *pba = read_atomic(&msix->pba);
> +
> + if ( likely(pba) )
> + return pba;
> +
> + pba = ioremap(vmsix_table_addr(vpci, VPCI_MSIX_PBA),
> + vmsix_table_size(vpci, VPCI_MSIX_PBA));
> + if ( !pba )
> + return read_atomic(&msix->pba);
> +
> + spin_lock(&vpci->lock);
> + if ( !msix->pba )
> + {
> + write_atomic(&msix->pba, pba);
> + spin_unlock(&vpci->lock);
> + }
> + else
> + {
> + spin_unlock(&vpci->lock);
> + iounmap(pba);
> + }
TBH I had been hoping for just a single spin_unlock(), but you're
the maintainer of this code ...
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |