From: Alex Williamson <alex@shazbot.org>
To: <mhonap@nvidia.com>
Cc: <jgg@ziepe.ca>, <ankita@nvidia.com>, <jic23@kernel.org>,
<dave.jiang@intel.com>, <alejandro.lucero-palau@amd.com>,
<smadhavan@nvidia.com>, <corbet@lwn.net>,
<skhan@linuxfoundation.org>, <dave@stgolabs.net>,
<alison.schofield@intel.com>, <vishal.l.verma@intel.com>,
<iweiny@kernel.org>, <ming.li@zohomail.com>, <yishaih@nvidia.com>,
<skolothumtho@nvidia.com>, <kevin.tian@intel.com>,
<bhelgaas@google.com>, <dmatlack@google.com>, <kees@kernel.org>,
<gustavoars@kernel.org>, <cjia@nvidia.com>, <kjaju@nvidia.com>,
<vsethi@nvidia.com>, <zhiw@nvidia.com>,
<linux-doc@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
<kvm@vger.kernel.org>, <linux-cxl@vger.kernel.org>,
<linux-pci@vger.kernel.org>, <linux-kselftest@vger.kernel.org>,
<linux-hardening@vger.kernel.org>,
alex@shazbot.org
Subject: Re: [PATCH v6 12/31] vfio/pci: Call the CXL open and close hooks around device use
Date: Fri, 6 Nov 2026 15:51:37 -0700 [thread overview]
Message-ID: <20261106155137.5fcf7259@shazbot.org> (raw)
In-Reply-To: <20261016161839.2765592-13-mhonap@nvidia.com>
On Fri, 16 Oct 2026 21:48:19 +0530
<mhonap@nvidia.com> wrote:
> From: Manish Honap <mhonap@nvidia.com>
>
> vfio-pci-core frees device regions and excluded ranges on close and on a
> failed open, so a CXL provider must set them up at each open.
>
> Add open and close to the CXL ops and call them from the common enable
> and close paths. A failed open unwinds the enable in reverse order:
> release the device regions, unmap the BARs, drop the excluded ranges,
> then free the virtual config.
>
> Factor the device region release and the BAR unmap out of
> vfio_pci_core_disable() into helpers so the enable failure path and the
> disable path share them.
>
> Assisted-by: LLM
> Signed-off-by: Manish Honap <mhonap@nvidia.com>
> ---
> drivers/vfio/pci/vfio_pci_core.c | 57 +++++++++++++++++++++++---------
> include/linux/vfio_pci_core.h | 2 ++
> 2 files changed, 44 insertions(+), 15 deletions(-)
>
> diff --git a/drivers/vfio/pci/vfio_pci_core.c b/drivers/vfio/pci/vfio_pci_core.c
> index 211fff6045e2..3d4e01eea7b1 100644
> --- a/drivers/vfio/pci/vfio_pci_core.c
> +++ b/drivers/vfio/pci/vfio_pci_core.c
> @@ -590,6 +590,31 @@ static const struct dev_pm_ops vfio_pci_core_pm_ops = {
>
> static void vfio_pci_free_excluded_ranges(struct vfio_pci_core_device *vdev);
>
> +static void vfio_pci_core_unmap_bars(struct vfio_pci_core_device *vdev)
> +{
> + struct pci_dev *pdev = vdev->pdev;
> +
> + for (int i = 0; i < PCI_STD_NUM_BARS; i++) {
> + int bar = i + PCI_STD_RESOURCES;
> +
> + if (IS_ERR_OR_NULL(vdev->barmap[bar]))
> + continue;
> + pci_iounmap(pdev, vdev->barmap[bar]);
> + pci_release_selected_regions(pdev, 1 << bar);
> + vdev->barmap[bar] = NULL;
> + }
> +}
> +
> +static void vfio_pci_core_free_dev_regions(struct vfio_pci_core_device *vdev)
> +{
> + for (int i = 0; i < vdev->num_regions; i++)
> + vdev->region[i].ops->release(vdev, &vdev->region[i]);
> +
> + vdev->num_regions = 0;
> + kfree(vdev->region);
> + vdev->region = NULL; /* don't krealloc a freed pointer */
> +}
Mechanical changes like this should be done in a separate patch.
> +
> int vfio_pci_core_enable(struct vfio_pci_core_device *vdev)
> {
> struct pci_dev *pdev = vdev->pdev;
> @@ -691,8 +716,20 @@ int vfio_pci_core_enable(struct vfio_pci_core_device *vdev)
>
> vfio_pci_core_map_bars(vdev);
>
> + if (vdev->cxl_ops) {
> + ret = vdev->cxl_ops->open_device(vdev);
> + if (ret)
> + goto out_free_config;
> + }
> +
> return 0;
>
> +out_free_config:
> + /* A failed first open never reaches vfio_pci_core_disable(). */
> + vfio_pci_core_free_dev_regions(vdev);
> + vfio_pci_core_unmap_bars(vdev);
> + vfio_pci_free_excluded_ranges(vdev);
> + vfio_config_free(vdev);
Raising again that this doesn't account for the code previously added
to this function that has its own unwind.
There also remains the question of whether excluded range setup should
be moved to init/release.
> out_free_zdev:
> vfio_pci_zdev_close_device(vdev);
> out_free_state:
> @@ -713,7 +750,6 @@ void vfio_pci_core_disable(struct vfio_pci_core_device *vdev)
> struct pci_dev *pdev = vdev->pdev;
> struct vfio_pci_dummy_resource *dummy_res, *tmp;
> struct vfio_pci_ioeventfd *ioeventfd, *ioeventfd_tmp;
> - int i, bar;
>
> /* For needs_reset */
> lockdep_assert_held(&vdev->vdev.dev_set->lock);
> @@ -759,24 +795,12 @@ void vfio_pci_core_disable(struct vfio_pci_core_device *vdev)
>
> vdev->virq_disabled = false;
>
> - for (i = 0; i < vdev->num_regions; i++)
> - vdev->region[i].ops->release(vdev, &vdev->region[i]);
> -
> - vdev->num_regions = 0;
> - kfree(vdev->region);
> - vdev->region = NULL; /* don't krealloc a freed pointer */
> + vfio_pci_core_free_dev_regions(vdev);
>
> vfio_config_free(vdev);
> vfio_pci_free_excluded_ranges(vdev);
>
> - for (i = 0; i < PCI_STD_NUM_BARS; i++) {
> - bar = i + PCI_STD_RESOURCES;
> - if (IS_ERR_OR_NULL(vdev->barmap[bar]))
> - continue;
> - pci_iounmap(pdev, vdev->barmap[bar]);
> - pci_release_selected_regions(pdev, 1 << bar);
> - vdev->barmap[bar] = NULL;
> - }
> + vfio_pci_core_unmap_bars(vdev);
>
> list_for_each_entry_safe(dummy_res, tmp,
> &vdev->dummy_resources_list, res_next) {
> @@ -859,6 +883,9 @@ void vfio_pci_core_close_device(struct vfio_device *core_vdev)
> #endif
> vfio_pci_dma_buf_cleanup(vdev);
>
> + if (vdev->cxl_ops)
> + vdev->cxl_ops->close_device(vdev);
> +
Mismatched in both naming and conventions.
vfio_pci_core_enable() -> cxl_ops->open_device()
vfio_pci_core_close_device() -> cxl_ops->close_device()
Some variant drivers unwind a failure after core_enable() with
core_disable(), so the placement in the close_device() path is not only
inconsistent, it's wrong. The hooks should also be consistently named
relative to where they're called from the core. Thanks,
Alex
> vfio_pci_core_disable(vdev);
>
> mutex_lock(&vdev->igate);
> diff --git a/include/linux/vfio_pci_core.h b/include/linux/vfio_pci_core.h
> index fd1ad0baf470..6520a2dcfd4a 100644
> --- a/include/linux/vfio_pci_core.h
> +++ b/include/linux/vfio_pci_core.h
> @@ -70,6 +70,8 @@ struct vfio_pci_device_ops {
> struct vfio_cxl_ops {
> int (*init)(struct vfio_pci_core_device *vdev);
> void (*release)(struct vfio_pci_core_device *vdev);
> + int (*open_device)(struct vfio_pci_core_device *vdev);
> + void (*close_device)(struct vfio_pci_core_device *vdev);
> /* Pinned per bound CXL device so vfio-cxl cannot unload under usage */
> struct module *owner;
> };
next prev parent reply other threads:[~2026-11-06 22:51 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-16 16:18 [PATCH v6 00/31] vfio/pci: Add CXL Type-2 device passthrough support mhonap
2026-10-16 16:18 ` [PATCH v6 01/31] cxl/regs: Split the BAR block request and ioremap helpers mhonap
2026-10-16 16:18 ` [PATCH v6 02/31] cxl/regs: Let a BAR-owning driver own the component register block mhonap
2026-10-16 16:18 ` [PATCH v6 03/31] cxl: Move component register defines to uapi/cxl/cxl_regs.h mhonap
2026-11-04 23:52 ` Alex Williamson
2026-10-16 16:18 ` [PATCH v6 04/31] PCI/CXL: Let the driver that owns the HDM range run CXL Reset mhonap
2026-11-04 23:54 ` Alex Williamson
2026-10-16 16:18 ` [PATCH v6 05/31] PCI: Refuse bus and slot reset below a CXL port with SBR masked mhonap
2026-11-04 23:53 ` Alex Williamson
2026-10-16 16:18 ` [PATCH v6 06/31] vfio/pci: Add the CXL provider ops registration interface mhonap
2026-11-04 23:53 ` Alex Williamson
2026-10-16 16:18 ` [PATCH v6 07/31] vfio/pci: Detect CXL devices and load the CXL provider on demand mhonap
2026-11-04 23:53 ` Alex Williamson
2026-10-16 16:18 ` [PATCH v6 08/31] vfio/pci: Add a generic excluded-range list mhonap
2026-11-06 15:59 ` Alex Williamson
2026-10-16 16:18 ` [PATCH v6 09/31] vfio/pci: Advertise the mmap areas around excluded ranges mhonap
2026-11-06 20:39 ` Alex Williamson
2026-10-16 16:18 ` [PATCH v6 10/31] vfio/pci: Refuse ioeventfds and dma-buf exports over " mhonap
2026-11-06 20:52 ` Alex Williamson
2026-10-16 16:18 ` [PATCH v6 11/31] vfio/pci: Virtualize the CXL DVSEC in vfio_pci_config.c mhonap
2026-11-06 22:10 ` Alex Williamson
2026-10-16 16:18 ` [PATCH v6 12/31] vfio/pci: Call the CXL open and close hooks around device use mhonap
2026-11-06 22:51 ` Alex Williamson [this message]
2026-10-16 16:18 ` [PATCH v6 13/31] vfio/pci: Bracket PCI resets with the CXL reset hooks mhonap
2026-11-06 23:44 ` Alex Williamson
2026-10-16 16:18 ` [PATCH v6 14/31] vfio/pci: Provide an opt-out for the CXL Type-2 extensions mhonap
2026-10-16 16:18 ` [PATCH v6 15/31] vfio/pci: Route every reset point through a try-reset helper mhonap
2026-11-04 23:52 ` Alex Williamson
2026-10-16 16:18 ` [PATCH v6 16/31] vfio/pci: Revoke and re-arm one device-specific region mhonap
2026-10-16 16:18 ` [PATCH v6 17/31] vfio/pci: Call the device provider across low-power transitions mhonap
2026-10-16 16:18 ` [PATCH v6 18/31] vfio/cxl: Add the vfio-cxl provider module skeleton mhonap
2026-10-16 16:18 ` [PATCH v6 19/31] vfio/cxl: Create the CXL memdev and set media ready at bind mhonap
2026-10-16 16:18 ` [PATCH v6 20/31] vfio/cxl: Own the whole component register BAR mhonap
2026-10-16 16:18 ` [PATCH v6 21/31] vfio/cxl: Expose the HDM memory region to the guest mhonap
2026-10-16 16:18 ` [PATCH v6 22/31] vfio/cxl: Allow mmap of the HDM memory region mhonap
2026-10-16 16:18 ` [PATCH v6 23/31] vfio/cxl: Contain HDM memory errors with memory_failure() mhonap
2026-10-16 16:18 ` [PATCH v6 24/31] vfio/cxl: Expose the HDM decoder registers read-only to the guest mhonap
2026-10-16 16:18 ` [PATCH v6 25/31] vfio/cxl: Exclude the HDM decoder registers from direct BAR access mhonap
2026-10-16 16:18 ` [PATCH v6 26/31] vfio/cxl: Restore the HDM decoder after a hot reset mhonap
2026-10-16 16:18 ` [PATCH v6 27/31] vfio/cxl: Describe the CXL device and decoder geometry to userspace mhonap
2026-10-16 16:18 ` [PATCH v6 28/31] vfio/cxl: Export the HDM memory region as a dma-buf mhonap
2026-10-16 16:18 ` [PATCH v6 29/31] vfio/cxl: Run the CXL reset at the vfio reset points mhonap
2026-10-16 16:18 ` [PATCH v6 30/31] Documentation: vfio-pci: Document CXL Type-2 device passthrough mhonap
2026-10-16 16:18 ` [PATCH v6 31/31] selftests/vfio: Add CXL Type-2 passthrough tests mhonap
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=20261106155137.5fcf7259@shazbot.org \
--to=alex@shazbot.org \
--cc=alejandro.lucero-palau@amd.com \
--cc=alison.schofield@intel.com \
--cc=ankita@nvidia.com \
--cc=bhelgaas@google.com \
--cc=cjia@nvidia.com \
--cc=corbet@lwn.net \
--cc=dave.jiang@intel.com \
--cc=dave@stgolabs.net \
--cc=dmatlack@google.com \
--cc=gustavoars@kernel.org \
--cc=iweiny@kernel.org \
--cc=jgg@ziepe.ca \
--cc=jic23@kernel.org \
--cc=kees@kernel.org \
--cc=kevin.tian@intel.com \
--cc=kjaju@nvidia.com \
--cc=kvm@vger.kernel.org \
--cc=linux-cxl@vger.kernel.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-hardening@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=mhonap@nvidia.com \
--cc=ming.li@zohomail.com \
--cc=skhan@linuxfoundation.org \
--cc=skolothumtho@nvidia.com \
--cc=smadhavan@nvidia.com \
--cc=vishal.l.verma@intel.com \
--cc=vsethi@nvidia.com \
--cc=yishaih@nvidia.com \
--cc=zhiw@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
all inboxes | Powered by JetHome®