|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v6 3/8] x86/PCI: read maximum MSI vector count early
> -----Original Message-----
> From: Xen-devel <xen-devel-bounces@xxxxxxxxxxxxxxxxxxxx> On Behalf Of Jan
> Beulich
> Sent: 19 September 2019 14:23
> To: xen-devel@xxxxxxxxxxxxxxxxxxxx
> Cc: Andrew Cooper <Andrew.Cooper3@xxxxxxxxxx>; Wei Liu <wl@xxxxxxx>; Suravee
> Suthikulpanit
> <suravee.suthikulpanit@xxxxxxx>; Roger Pau Monne <roger.pau@xxxxxxxxxx>
> Subject: [Xen-devel] [PATCH v6 3/8] x86/PCI: read maximum MSI vector count
> early
>
> Rather than doing this every time we set up interrupts for a device
> anew (and then in several places) fill this invariant field right after
> allocating struct pci_dev.
>
> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
Reviewed-by: Paul Durrant <paul.durrant@xxxxxxxxxx>
...with one nit...
> ---
> v6: New.
>
> ---
> xen/arch/x86/msi.c | 13 +++++--------
> xen/drivers/passthrough/pci.c | 10 ++++++++++
> xen/drivers/vpci/msi.c | 9 ++++-----
> xen/include/xen/pci.h | 3 ++-
> xen/include/xen/vpci.h | 6 ++----
> 5 files changed, 23 insertions(+), 18 deletions(-)
>
> --- a/xen/arch/x86/msi.c
> +++ b/xen/arch/x86/msi.c
> @@ -664,7 +664,7 @@ static int msi_capability_init(struct pc
> {
> struct msi_desc *entry;
> int pos;
> - unsigned int i, maxvec, mpos;
> + unsigned int i, mpos;
> u16 control, seg = dev->seg;
> u8 bus = dev->bus;
> u8 slot = PCI_SLOT(dev->devfn);
> @@ -675,9 +675,8 @@ static int msi_capability_init(struct pc
> if ( !pos )
> return -ENODEV;
> control = pci_conf_read16(dev->sbdf, msi_control_reg(pos));
> - maxvec = multi_msi_capable(control);
> - if ( nvec > maxvec )
> - return maxvec;
> + if ( nvec > dev->msi_maxvec )
> + return dev->msi_maxvec;
> control &= ~PCI_MSI_FLAGS_QSIZE;
> multi_msi_enable(control, nvec);
>
> @@ -711,7 +710,7 @@ static int msi_capability_init(struct pc
>
> /* All MSIs are unmasked by default, Mask them all */
> maskbits = pci_conf_read32(dev->sbdf, mpos);
> - maskbits |= ~(u32)0 >> (32 - maxvec);
> + maskbits |= ~(u32)0 >> (32 - dev->msi_maxvec);
> pci_conf_write32(dev->sbdf, mpos, maskbits);
> }
> list_add_tail(&entry->list, &dev->msi_list);
> @@ -1284,7 +1283,6 @@ int pci_msi_conf_write_intercept(struct
> entry = find_msi_entry(pdev, -1, PCI_CAP_ID_MSI);
> if ( entry && entry->msi_attrib.maskbit )
> {
> - uint16_t cntl;
> uint32_t unused;
> unsigned int nvec = entry->msi.nvec;
>
> @@ -1297,8 +1295,7 @@ int pci_msi_conf_write_intercept(struct
> if ( reg < entry->msi.mpos || reg >= entry->msi.mpos + 4 || size !=
> 4 )
> return -EACCES;
>
> - cntl = pci_conf_read16(pdev->sbdf, msi_control_reg(pos));
> - unused = ~(uint32_t)0 >> (32 - multi_msi_capable(cntl));
> + unused = ~(uint32_t)0 >> (32 - pdev->msi_maxvec);
> for ( pos = 0; pos < nvec; ++pos, ++entry )
> {
> entry->msi_attrib.guest_masked =
> --- a/xen/drivers/passthrough/pci.c
> +++ b/xen/drivers/passthrough/pci.c
> @@ -340,6 +340,16 @@ static struct pci_dev *alloc_pdev(struct
> pdev->domain = NULL;
> INIT_LIST_HEAD(&pdev->msi_list);
>
> +
Stray blank line here by the looks of it.
> + pos = pci_find_cap_offset(pseg->nr, bus, PCI_SLOT(devfn),
> PCI_FUNC(devfn),
> + PCI_CAP_ID_MSI);
> + if ( pos )
> + {
> + uint16_t ctrl = pci_conf_read16(pdev->sbdf, msi_control_reg(pos));
> +
> + pdev->msi_maxvec = multi_msi_capable(ctrl);
> + }
> +
> pos = pci_find_cap_offset(pseg->nr, bus, PCI_SLOT(devfn),
> PCI_FUNC(devfn),
> PCI_CAP_ID_MSIX);
> if ( pos )
> --- a/xen/drivers/vpci/msi.c
> +++ b/xen/drivers/vpci/msi.c
> @@ -27,7 +27,7 @@ static uint32_t control_read(const struc
> {
> const struct vpci_msi *msi = data;
>
> - return MASK_INSR(fls(msi->max_vectors) - 1, PCI_MSI_FLAGS_QMASK) |
> + return MASK_INSR(fls(pdev->msi_maxvec) - 1, PCI_MSI_FLAGS_QMASK) |
> MASK_INSR(fls(msi->vectors) - 1, PCI_MSI_FLAGS_QSIZE) |
> (msi->enabled ? PCI_MSI_FLAGS_ENABLE : 0) |
> (msi->masking ? PCI_MSI_FLAGS_MASKBIT : 0) |
> @@ -40,7 +40,7 @@ static void control_write(const struct p
> struct vpci_msi *msi = data;
> unsigned int vectors = min_t(uint8_t,
> 1u << MASK_EXTR(val, PCI_MSI_FLAGS_QSIZE),
> - msi->max_vectors);
> + pdev->msi_maxvec);
> bool new_enabled = val & PCI_MSI_FLAGS_ENABLE;
>
> /*
> @@ -215,8 +215,7 @@ static int init_msi(struct pci_dev *pdev
> * FIXME: I've only been able to test this code with devices using a
> single
> * MSI interrupt and no mask register.
> */
> - pdev->vpci->msi->max_vectors = multi_msi_capable(control);
> - ASSERT(pdev->vpci->msi->max_vectors <= 32);
> + ASSERT(pdev->msi_maxvec <= 32);
>
> /* The multiple message enable is 0 after reset (1 message enabled). */
> pdev->vpci->msi->vectors = 1;
> @@ -298,7 +297,7 @@ void vpci_dump_msi(void)
> if ( msi->masking )
> printk(" mask=%08x", msi->mask);
> printk(" vectors max: %u enabled: %u\n",
> - msi->max_vectors, msi->vectors);
> + pdev->msi_maxvec, msi->vectors);
>
> vpci_msi_arch_print(msi);
> }
> --- a/xen/include/xen/pci.h
> +++ b/xen/include/xen/pci.h
> @@ -94,7 +94,8 @@ struct pci_dev {
> pci_sbdf_t sbdf;
> };
>
> - u8 phantom_stride;
> + uint8_t msi_maxvec;
> + uint8_t phantom_stride;
>
> nodeid_t node; /* NUMA node */
>
> --- a/xen/include/xen/vpci.h
> +++ b/xen/include/xen/vpci.h
> @@ -99,14 +99,12 @@ struct vpci {
> uint32_t mask;
> /* Data. */
> uint16_t data;
> - /* Maximum number of vectors supported by the device. */
> - uint8_t max_vectors : 6;
> + /* Number of vectors configured. */
> + uint8_t vectors : 6;
> /* Supports per-vector masking? */
> bool masking : 1;
> /* 64-bit address capable? */
> bool address64 : 1;
> - /* Number of vectors configured. */
> - uint8_t vectors : 6;
> /* Enabled? */
> bool enabled : 1;
> /* Arch-specific data. */
>
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxxxxxxxxx
> https://lists.xenproject.org/mailman/listinfo/xen-devel
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |