From: Thomas Gleixner <tglx@linutronix.de> To: LKML <linux-kernel@vger.kernel.org> Cc: Bjorn Helgaas <helgaas@kernel.org>, Marc Zygnier <maz@kernel.org>, Alex Williamson <alex.williamson@redhat.com>, Kevin Tian <kevin.tian@intel.com>, Jason Gunthorpe <jgg@nvidia.com>, Megha Dey <megha.dey@intel.com>, Ashok Raj <ashok.raj@intel.com>, Michael Ellerman <mpe@ellerman.id.au>, Andrew Cooper <amc96@cam.ac.uk>, Juergen Gross <jgross@suse.com>, linux-pci@vger.kernel.org, xen-devel@lists.xenproject.org Subject: [patch 09/10] PCI/MSI: Provide pci_msix_expand_vectors[_at]() Date: Sat, 27 Nov 2021 02:25:11 +0100 (CET) [thread overview] Message-ID: <20211127000919.004572849@linutronix.de> (raw) In-Reply-To: 20211126233124.618283684@linutronix.de Provide a new interface which allows to expand the MSI-X vector space if the underlying irq domain implementation supports it. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> --- drivers/pci/msi/msi.c | 41 +++++++++++++++++++++++++++++++++++++++++ include/linux/pci.h | 13 +++++++++++++ 2 files changed, 54 insertions(+) --- a/drivers/pci/msi/msi.c +++ b/drivers/pci/msi/msi.c @@ -1025,6 +1025,47 @@ int pci_alloc_irq_vectors_affinity(struc EXPORT_SYMBOL(pci_alloc_irq_vectors_affinity); /** + * pci_msix_expand_vectors_at - Expand MSI-X interrupts for a device + * + * @dev: PCI device to operate on + * @at: Allocate at MSI-X index. If @at == PCI_MSI_EXPAND_AUTO + * the function expands automatically after the last + * active index. + * @nvec: Number of vectors to allocate + * + * Expand the MSI-X vectors of a device after an initial enablement and + * allocation. + * + * Return: 0 if the allocation was successful, an error code otherwise. + */ +int pci_msix_expand_vectors_at(struct pci_dev *dev, unsigned int at, unsigned int nvec) +{ + struct msi_device_data *md = dev->dev.msi.data; + struct msi_range range = { .ndesc = nvec, }; + unsigned int max_vecs; + int ret; + + if (!pci_msi_enable || !dev || !dev->msix_enabled || !md) + return -ENOTSUPP; + + if (!pci_msi_domain_supports_expand(dev)) + return -ENOTSUPP; + + max_vecs = pci_msix_vec_count(dev); + if (!nvec || nvec > max_vecs) + return -EINVAL; + + range.first = at == PCI_MSIX_EXPAND_AUTO ? md->num_descs : at; + + if (range.first >= max_vecs || nvec > max_vecs - range.first) + return -ENOSPC; + + ret = msix_setup_interrupts(dev, dev->msix_base, &range, NULL, NULL, true); + return ret <= 0 ? ret : -ENOSPC;; +} +EXPORT_SYMBOL_GPL(pci_msix_expand_vectors_at); + +/** * pci_free_irq_vectors - free previously allocated IRQs for a device * @dev: PCI device to operate on * --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -1534,6 +1534,7 @@ static inline int pci_enable_msix_exact( int pci_alloc_irq_vectors_affinity(struct pci_dev *dev, unsigned int min_vecs, unsigned int max_vecs, unsigned int flags, struct irq_affinity *affd); +int pci_msix_expand_vectors_at(struct pci_dev *dev, unsigned int at, unsigned int nvec); void pci_free_irq_vectors(struct pci_dev *dev); int pci_irq_vector(struct pci_dev *dev, unsigned int nr); @@ -1565,6 +1566,11 @@ pci_alloc_irq_vectors_affinity(struct pc return -ENOSPC; } +static inline int pci_msix_expand_vectors_at(struct pci_dev *dev, unsigned int at, unsigned int nvec) +{ + return -ENOTSUPP; +} + static inline void pci_free_irq_vectors(struct pci_dev *dev) { } @@ -1582,6 +1588,13 @@ static inline const struct cpumask *pci_ } #endif +#define PCI_MSIX_EXPAND_AUTO (UINT_MAX) + +static inline int pci_msix_expand_vectors(struct pci_dev *dev, unsigned int nvec) +{ + return pci_msix_expand_vectors_at(dev, PCI_MSIX_EXPAND_AUTO, nvec); +} + /** * pci_irqd_intx_xlate() - Translate PCI INTx value to an IRQ domain hwirq * @d: the INTx IRQ domain
WARNING: multiple messages have this Message-ID (diff)
From: Thomas Gleixner <tglx@linutronix.de> To: LKML <linux-kernel@vger.kernel.org> Cc: Bjorn Helgaas <helgaas@kernel.org>, Marc Zygnier <maz@kernel.org>, Alex Williamson <alex.williamson@redhat.com>, Kevin Tian <kevin.tian@intel.com>, Jason Gunthorpe <jgg@nvidia.com>, Megha Dey <megha.dey@intel.com>, Ashok Raj <ashok.raj@intel.com>, Michael Ellerman <mpe@ellerman.id.au>, Andrew Cooper <amc96@cam.ac.uk>, Juergen Gross <jgross@suse.com>, linux-pci@vger.kernel.org, xen-devel@lists.xenproject.org Subject: [patch 09/10] PCI/MSI: Provide pci_msix_expand_vectors[_at]() Date: Sat, 27 Nov 2021 02:24:44 +0100 (CET) [thread overview] Message-ID: <20211127000919.004572849@linutronix.de> (raw) Message-ID: <20211127012444.JT4ua-aI6V6PRfSBesFr-V9fEE1kZy2k17ocd_BI1F8@z> (raw) In-Reply-To: 20211126233124.618283684@linutronix.de Provide a new interface which allows to expand the MSI-X vector space if the underlying irq domain implementation supports it. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> --- drivers/pci/msi/msi.c | 41 +++++++++++++++++++++++++++++++++++++++++ include/linux/pci.h | 13 +++++++++++++ 2 files changed, 54 insertions(+) --- a/drivers/pci/msi/msi.c +++ b/drivers/pci/msi/msi.c @@ -1025,6 +1025,47 @@ int pci_alloc_irq_vectors_affinity(struc EXPORT_SYMBOL(pci_alloc_irq_vectors_affinity); /** + * pci_msix_expand_vectors_at - Expand MSI-X interrupts for a device + * + * @dev: PCI device to operate on + * @at: Allocate at MSI-X index. If @at == PCI_MSI_EXPAND_AUTO + * the function expands automatically after the last + * active index. + * @nvec: Number of vectors to allocate + * + * Expand the MSI-X vectors of a device after an initial enablement and + * allocation. + * + * Return: 0 if the allocation was successful, an error code otherwise. + */ +int pci_msix_expand_vectors_at(struct pci_dev *dev, unsigned int at, unsigned int nvec) +{ + struct msi_device_data *md = dev->dev.msi.data; + struct msi_range range = { .ndesc = nvec, }; + unsigned int max_vecs; + int ret; + + if (!pci_msi_enable || !dev || !dev->msix_enabled || !md) + return -ENOTSUPP; + + if (!pci_msi_domain_supports_expand(dev)) + return -ENOTSUPP; + + max_vecs = pci_msix_vec_count(dev); + if (!nvec || nvec > max_vecs) + return -EINVAL; + + range.first = at == PCI_MSIX_EXPAND_AUTO ? md->num_descs : at; + + if (range.first >= max_vecs || nvec > max_vecs - range.first) + return -ENOSPC; + + ret = msix_setup_interrupts(dev, dev->msix_base, &range, NULL, NULL, true); + return ret <= 0 ? ret : -ENOSPC;; +} +EXPORT_SYMBOL_GPL(pci_msix_expand_vectors_at); + +/** * pci_free_irq_vectors - free previously allocated IRQs for a device * @dev: PCI device to operate on * --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -1534,6 +1534,7 @@ static inline int pci_enable_msix_exact( int pci_alloc_irq_vectors_affinity(struct pci_dev *dev, unsigned int min_vecs, unsigned int max_vecs, unsigned int flags, struct irq_affinity *affd); +int pci_msix_expand_vectors_at(struct pci_dev *dev, unsigned int at, unsigned int nvec); void pci_free_irq_vectors(struct pci_dev *dev); int pci_irq_vector(struct pci_dev *dev, unsigned int nr); @@ -1565,6 +1566,11 @@ pci_alloc_irq_vectors_affinity(struct pc return -ENOSPC; } +static inline int pci_msix_expand_vectors_at(struct pci_dev *dev, unsigned int at, unsigned int nvec) +{ + return -ENOTSUPP; +} + static inline void pci_free_irq_vectors(struct pci_dev *dev) { } @@ -1582,6 +1588,13 @@ static inline const struct cpumask *pci_ } #endif +#define PCI_MSIX_EXPAND_AUTO (UINT_MAX) + +static inline int pci_msix_expand_vectors(struct pci_dev *dev, unsigned int nvec) +{ + return pci_msix_expand_vectors_at(dev, PCI_MSIX_EXPAND_AUTO, nvec); +} + /** * pci_irqd_intx_xlate() - Translate PCI INTx value to an IRQ domain hwirq * @d: the INTx IRQ domain
next prev parent reply other threads:[~2021-11-27 1:34 UTC|newest] Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-11-27 1:24 [patch 00/10] genirq/msi, PCI/MSI: Support for dynamic MSI-X vector expansion - Part 4 Thomas Gleixner 2021-11-27 1:24 ` [patch 01/10] genirq/msi: Add range argument to alloc/free MSI domain ops Thomas Gleixner 2021-11-27 1:24 ` Thomas Gleixner 2021-11-27 1:24 ` [patch 02/10] genirq/msi: Add range argument to msi_domain_alloc/free_descs_locked() Thomas Gleixner 2021-11-27 1:25 ` Thomas Gleixner 2021-11-27 1:24 ` [patch 03/10] genirq/msi: Make MSI descriptor alloc/free ready for range allocations Thomas Gleixner 2021-11-27 1:25 ` Thomas Gleixner 2021-11-28 15:57 ` Marc Zyngier 2021-11-28 19:17 ` Thomas Gleixner 2021-11-29 17:28 ` Thomas Gleixner 2021-11-27 1:24 ` [patch 05/10] genirq/msi: Add domain info flag MSI_FLAG_CAN_EXPAND Thomas Gleixner 2021-11-27 1:25 ` Thomas Gleixner 2021-11-27 1:24 ` [patch 06/10] PCI/MSI: Use range in allocation path Thomas Gleixner 2021-11-27 1:25 ` Thomas Gleixner 2021-11-27 1:24 ` [patch 08/10] PCI/MSI: Provide pci_msi_domain_supports_expand() Thomas Gleixner 2021-11-27 1:25 ` Thomas Gleixner 2021-11-27 1:24 ` [patch 10/10] x86/apic/msi: Support MSI-X vector expansion Thomas Gleixner 2021-11-27 1:25 ` Thomas Gleixner 2021-11-27 1:24 ` [patch 00/10] genirq/msi, PCI/MSI: Support for dynamic MSI-X vector expansion - Part 4 Thomas Gleixner 2021-11-27 1:25 ` [patch 04/10] genirq/msi: Prepare MSI domain alloc/free for range irq allocation Thomas Gleixner 2021-11-27 1:24 ` Thomas Gleixner 2021-11-27 1:25 ` [patch 07/10] PCI/MSI: Make free related functions range based Thomas Gleixner 2021-11-27 1:24 ` Thomas Gleixner 2021-11-27 1:25 ` Thomas Gleixner [this message] 2021-11-27 1:24 ` [patch 09/10] PCI/MSI: Provide pci_msix_expand_vectors[_at]() Thomas Gleixner 2021-12-02 1:08 ` Dey, Megha 2021-12-02 10:16 ` Thomas Gleixner 2021-12-02 19:21 ` Raj, Ashok 2021-12-02 20:40 ` Thomas Gleixner 2021-12-03 0:45 ` Raj, Ashok 2021-12-03 12:29 ` Thomas Gleixner
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20211127000919.004572849@linutronix.de \ --to=tglx@linutronix.de \ --cc=alex.williamson@redhat.com \ --cc=amc96@cam.ac.uk \ --cc=ashok.raj@intel.com \ --cc=helgaas@kernel.org \ --cc=jgg@nvidia.com \ --cc=jgross@suse.com \ --cc=kevin.tian@intel.com \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-pci@vger.kernel.org \ --cc=maz@kernel.org \ --cc=megha.dey@intel.com \ --cc=mpe@ellerman.id.au \ --cc=xen-devel@lists.xenproject.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).