From: "Dey, Megha" <megha.dey@intel.com>
To: Thomas Gleixner <tglx@linutronix.de>,
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>, 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: Re: [patch 09/10] PCI/MSI: Provide pci_msix_expand_vectors[_at]()
Date: Wed, 1 Dec 2021 17:08:01 -0800 [thread overview]
Message-ID: <7ad200fa-dda3-4932-cd23-ad6e79288ea4@intel.com> (raw)
In-Reply-To: <20211127000919.004572849@linutronix.de>
Hi Thomas,
On 11/26/2021 5:25 PM, Thomas Gleixner wrote:
> 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
Not sure why some of these changes related to PCI_MSIX_EXPAND_AUTO and
num_descs did not make it to the 'msi' branch.
Is this intentional?
> + * 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);
> +
I am having trouble fully comprehending how this expansion scheme would
work..
For instance, say:
1. Driver requests for 5 vectors:
pci_enable_msix_range(dev, NULL, 5, 5)
=>num_descs = 5
2. Driver frees vectors at index 1,2:
range = {1, 2, 2};
pci_msi_teardown_msi_irqs(dev, range)
=>num_descs = 3; Current active vectors are at index: 0, 3, 4
3. Driver requests for 3 more vectors using the new API:
pci_msix_expand_vectors(dev, 3)
=>range.first = 3 => It will try to allocate index 3-5, but we already
have 3,4 active?
Ideally, we would want index 1,2 and 5 to be allocated for this request
right?
Could you please let me know what I am missing?
With the 'range' approach, the issue is that we are trying to allocate
contiguous indexes. Perhaps, we also need to check if all the indexes in
the requested range are available,
if not, find a contiguous range large enough to accommodate the request.
But there will be fragmentation issues if we choose to go with this way...
I had a version of the dynamic MSI-X patch series (which never got sent
out). For the expansion, I had the following:
pci_add_msix_irq_vector(pdev): On each invocation, add 1 MSI-X vector to
the device and return the msi-x index assigned by the kernel (using a
bitmap)
Correspondingly, pci_free_msix_irq_vector(pdev, irq) frees all the
allocated resources associated with MSI-X interrupt with Linux IRQ
number 'irq'.
I had issues when trying to dynamically allocate more than 1 interrupt
because I didn't have a clean way to communicate to the driver what
indexes were assigned in the current allocation.
-Megha
>
next prev parent reply other threads:[~2021-12-02 1:08 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 ` [patch 09/10] PCI/MSI: Provide pci_msix_expand_vectors[_at]() Thomas Gleixner
2021-11-27 1:24 ` Thomas Gleixner
2021-12-02 1:08 ` Dey, Megha [this message]
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=7ad200fa-dda3-4932-cd23-ad6e79288ea4@intel.com \
--to=megha.dey@intel.com \
--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=mpe@ellerman.id.au \
--cc=tglx@linutronix.de \
--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: link
Be 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).