From: Reinette Chatre <reinette.chatre@intel.com>
To: jgg@nvidia.com, yishaih@nvidia.com,
shameerali.kolothum.thodi@huawei.com, kevin.tian@intel.com,
alex.williamson@redhat.com
Cc: tglx@linutronix.de, darwi@linutronix.de, kvm@vger.kernel.org,
dave.jiang@intel.com, jing2.liu@intel.com, ashok.raj@intel.com,
fenghua.yu@intel.com, tom.zanussi@linux.intel.com,
reinette.chatre@intel.com, linux-kernel@vger.kernel.org
Subject: [PATCH V5 00/11] vfio/pci: Support dynamic allocation of MSI-X interrupts
Date: Thu, 11 May 2023 08:44:27 -0700 [thread overview]
Message-ID: <cover.1683740667.git.reinette.chatre@intel.com> (raw)
Changes since V4:
- V4: https://lore.kernel.org/lkml/cover.1682615447.git.reinette.chatre@intel.com/
- Add Kevin's Reviewed-by tag as applicable.
- Treat non-existing INTx interrupt context as kernel bug with WARN. This
exposed an issue in the scenario where INTx mask/unmask may occur without
INTx enabled. This is fixed by obtaining the interrupt context later
(right before use) within impacted functions: vfio_pci_intx_mask() and
vfio_pci_intx_unmask_handler(). (Kevin)
- Treat pci_irq_vector() returning '0' for a MSI/MSI-X interrupt as a kernel
bug via a WARN instead of ignoring this value. (Kevin)
- Improve accuracy of comments. (Kevin)
- Please refer to individual patches for local changes.
Changes since V3:
- V3: https://lore.kernel.org/lkml/cover.1681837892.git.reinette.chatre@intel.com/
- Be considerate about layout and size with changes to
struct vfio_pci_core_device. Keep flags together and transition all to
use bitfields. (Alex and Jason)
- Do not free dynamically allocated interrupts on error path. (Alex)
- Please refer to individual patches for localized changes.
Changes since V2:
- V2: https://lore.kernel.org/lkml/cover.1680038771.git.reinette.chatre@intel.com/
- During testing of V2 "kernel test robot" reported issues resulting from
include/linux/pci.h missing a stub for pci_msix_can_alloc_dyn() when
CONFIG_PCI_MSI=n. A separate fix was sent to address this. The fix can
be found in the kernel (since v6.3-rc7) as
commit 195d8e5da3ac ("PCI/MSI: Provide missing stub for pci_msix_can_alloc_dyn()")
- Biggest change is the transition to "active contexts" for both MSI and MSI-X.
Interrupt contexts have always been allocated when the interrupts are
allocated while they are only used while interrupts are
enabled. In this series interrupt contexts are made dynamic, while doing
so their allocation is moved to match how they are used: allocated when
interrupts are enabled. Whether a Linux interrupt number exists determines
whether an interrupt can be enabled.
Previous policy (up to V2) that an allocated interrupt has an interrupt
context no longer applies. Instead, an interrupt context has a
handler/trigger, aka "active contexts". (Alex)
- Re-ordered patches in support of "active contexts".
- Only free interrupts on MSI-X teardown and otherwise use the
allocated interrupts as a cache. (Alex)
- Using unsigned int for the vector broke the unwind loop within
vfio_msi_set_block(). (Alex)
- Introduce new "has_dyn_msix" property of virtual device instead of
querying support every time. (Alex)
- Some smaller changes, please refer to individual patches.
Changes since RFC V1:
- RFC V1: https://lore.kernel.org/lkml/cover.1678911529.git.reinette.chatre@intel.com/
- Improved changelogs.
- Simplify interface so that vfio_irq_ctx_alloc_single() returns pointer to
allocated context. (Alex)
- Remove vfio_irq_ctx_range_allocated() and associated attempts to maintain
invalid error path behavior. (Alex and Kevin)
- Add pointer to interrupt context as function parameter to
vfio_irq_ctx_free(). (Alex)
- Ensure variables are initialized. (Dan Carpenter)
- Only support dynamic allocation if device supports it. (Alex)
Qemu allocates interrupts incrementally at the time the guest unmasks an
interrupt, for example each time a Linux guest runs request_irq().
Dynamic allocation of MSI-X interrupts was not possible until v6.2 [1].
This prompted Qemu to, when allocating a new interrupt, first release all
previously allocated interrupts (including disable of MSI-X) followed
by re-allocation of all interrupts that includes the new interrupt.
Please see [2] for a detailed discussion about this issue.
Releasing and re-allocating interrupts may be acceptable if all
interrupts are unmasked during device initialization. If unmasking of
interrupts occur during runtime this may result in lost interrupts.
For example, consider an accelerator device with multiple work queues,
each work queue having a dedicated interrupt. A work queue can be
enabled at any time with its associated interrupt unmasked while other
work queues are already active. Having all interrupts released and MSI-X
disabled to enable the new work queue will impact active work queues.
This series builds on the recent interrupt sub-system core changes
that added support for dynamic MSI-X allocation after initial MSI-X
enabling.
Add support for dynamic MSI-X allocation to vfio-pci. A flag
indicating lack of support for dynamic allocation already exist:
VFIO_IRQ_INFO_NORESIZE and has always been set for MSI and MSI-X. With
support for dynamic MSI-X the flag is cleared for MSI-X when supported,
enabling Qemu to modify its behavior.
Any feedback is appreciated
Reinette
[1] commit 34026364df8e ("PCI/MSI: Provide post-enable dynamic allocation interfaces for MSI-X")
[2] https://lore.kernel.org/kvm/MWHPR11MB188603D0D809C1079F5817DC8C099@MWHPR11MB1886.namprd11.prod.outlook.com/#t
Reinette Chatre (11):
vfio/pci: Consolidate irq cleanup on MSI/MSI-X disable
vfio/pci: Remove negative check on unsigned vector
vfio/pci: Prepare for dynamic interrupt context storage
vfio/pci: Move to single error path
vfio/pci: Use xarray for interrupt context storage
vfio/pci: Remove interrupt context counter
vfio/pci: Update stale comment
vfio/pci: Use bitfield for struct vfio_pci_core_device flags
vfio/pci: Probe and store ability to support dynamic MSI-X
vfio/pci: Support dynamic MSI-X
vfio/pci: Clear VFIO_IRQ_INFO_NORESIZE for MSI-X
drivers/vfio/pci/vfio_pci_core.c | 8 +-
drivers/vfio/pci/vfio_pci_intrs.c | 305 ++++++++++++++++++++----------
include/linux/vfio_pci_core.h | 26 +--
include/uapi/linux/vfio.h | 3 +
4 files changed, 229 insertions(+), 113 deletions(-)
base-commit: 457391b0380335d5e9a5babdec90ac53928b23b4
--
2.34.1
next reply other threads:[~2023-05-11 15:44 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-05-11 15:44 Reinette Chatre [this message]
2023-05-11 15:44 ` [PATCH V5 01/11] vfio/pci: Consolidate irq cleanup on MSI/MSI-X disable Reinette Chatre
2023-05-11 15:44 ` [PATCH V5 02/11] vfio/pci: Remove negative check on unsigned vector Reinette Chatre
2023-05-11 15:44 ` [PATCH V5 03/11] vfio/pci: Prepare for dynamic interrupt context storage Reinette Chatre
2023-05-17 2:12 ` Tian, Kevin
2023-05-11 15:44 ` [PATCH V5 04/11] vfio/pci: Move to single error path Reinette Chatre
2023-05-11 15:44 ` [PATCH V5 05/11] vfio/pci: Use xarray for interrupt context storage Reinette Chatre
2023-05-11 15:44 ` [PATCH V5 06/11] vfio/pci: Remove interrupt context counter Reinette Chatre
2023-05-11 15:44 ` [PATCH V5 07/11] vfio/pci: Update stale comment Reinette Chatre
2023-05-17 2:12 ` Tian, Kevin
2023-05-11 15:44 ` [PATCH V5 08/11] vfio/pci: Use bitfield for struct vfio_pci_core_device flags Reinette Chatre
2023-05-11 15:44 ` [PATCH V5 09/11] vfio/pci: Probe and store ability to support dynamic MSI-X Reinette Chatre
2023-05-11 15:44 ` [PATCH V5 10/11] vfio/pci: Support " Reinette Chatre
2023-05-17 2:13 ` Tian, Kevin
2023-05-11 15:44 ` [PATCH V5 11/11] vfio/pci: Clear VFIO_IRQ_INFO_NORESIZE for MSI-X Reinette Chatre
2023-05-16 22:53 ` [PATCH V5 00/11] vfio/pci: Support dynamic allocation of MSI-X interrupts Alex Williamson
2023-05-17 2:14 ` Tian, Kevin
2023-05-17 15:46 ` Reinette Chatre
2023-05-17 14:25 ` Jason Gunthorpe
2023-05-17 15:47 ` Reinette Chatre
2023-05-22 22:25 ` Thomas Gleixner
2023-05-22 22:52 ` Reinette Chatre
2023-05-23 22:43 ` Alex Williamson
2023-05-24 2:43 ` YangHang Liu
2023-05-24 14:38 ` Reinette Chatre
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=cover.1683740667.git.reinette.chatre@intel.com \
--to=reinette.chatre@intel.com \
--cc=alex.williamson@redhat.com \
--cc=ashok.raj@intel.com \
--cc=darwi@linutronix.de \
--cc=dave.jiang@intel.com \
--cc=fenghua.yu@intel.com \
--cc=jgg@nvidia.com \
--cc=jing2.liu@intel.com \
--cc=kevin.tian@intel.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=shameerali.kolothum.thodi@huawei.com \
--cc=tglx@linutronix.de \
--cc=tom.zanussi@linux.intel.com \
--cc=yishaih@nvidia.com \
/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