From: David Matlack <dmatlack@google.com>
To: Pasha Tatashin <pasha.tatashin@soleen.com>
Cc: kexec@lists.infradead.org, linux-doc@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-mm@kvack.org,
linux-pci@vger.kernel.org,
Adithya Jayachandran <ajayachandra@nvidia.com>,
Alexander Graf <graf@amazon.com>,
Alex Williamson <alex@shazbot.org>,
Bjorn Helgaas <bhelgaas@google.com>, Chris Li <chrisl@kernel.org>,
David Rientjes <rientjes@google.com>,
Jacob Pan <jacob.pan@linux.microsoft.com>,
Jason Gunthorpe <jgg@nvidia.com>,
Jonathan Corbet <corbet@lwn.net>, Josh Hilke <jrhilke@google.com>,
Leon Romanovsky <leonro@nvidia.com>,
Lukas Wunner <lukas@wunner.de>, Mike Rapoport <rppt@kernel.org>,
Parav Pandit <parav@nvidia.com>,
Pranjal Shrivastava <praan@google.com>,
Pratyush Yadav <pratyush@kernel.org>,
Saeed Mahameed <saeedm@nvidia.com>,
Samiullah Khawaja <skhawaja@google.com>,
Shuah Khan <skhan@linuxfoundation.org>,
Vipin Sharma <vipinsh@google.com>, William Tu <witu@nvidia.com>,
Yi Liu <yi.l.liu@intel.com>
Subject: Re: [PATCH v7 03/12] PCI: liveupdate: Track incoming preserved PCI devices
Date: Tue, 21 Jul 2026 20:25:18 +0000 [thread overview]
Message-ID: <al_VrpvPE-RLCF5X@google.com> (raw)
In-Reply-To: <178465652971.412167.17838319728990505256.b4-reply@b4>
On 2026-07-21 05:55 PM, Pasha Tatashin wrote:
> On 2026-07-20 16:07:47-07:00, David Matlack wrote:
> > On Mon, Jul 20, 2026 at 3:44 PM Pasha Tatashin
> > <pasha.tatashin@soleen.com> wrote:
> >
> > > On 2026-07-20 14:54:51-07:00, David Matlack wrote:
> > >
> > > Thanks for the explanation. As I understand, the most straightforward
> > > way to avoid holding the permanent reference is indeed to delete
> > > dev->liveupdate.incoming entirely and perform an xarray lookup on every
> > > access, like this:
> > >
> > > bool pci_liveupdate_is_incoming(struct pci_dev *dev)
> > > {
> > > ...
> > > incoming = pci_liveupdate_flb_get_incoming();
> > > ...
> > > dev_ser = xa_load(&incoming->xa, key);
> > > ...
> > > pci_liveupdate_flb_put_incoming();
> > > return dev_ser && dev_ser->refcount > 0;
> > > }
> > >
> > > However, as you note, this is inefficient because it affects every
> > > single device and adds lookup overhead to every access (not sure about
> > > the actual cost though, xarray access is pretty fast!).
> > >
> > > We can, however, still avoid tinkering with the lifecycle of the FLB,
> > > and instead treat dev->liveupdate.incoming as a "hint" that we validate
> > > on access with a fast, liveness check:
> >
> > Can you tell me more about your concern about FLB lifetime?
> >
> > The lifetime of the FLB will not be affected by this reference unless
> > there is a bug in the driver where it fails to call
> > pci_liveupdate_finish() during it's file handler finish callback.
>
> From a design perspective, liveupdate_flb_get/put_incoming() is a
> logical read-lock/unlock pair on the FLB data. We use a refcount for
> optimization and sharing, but holding a get over a long asynchronous gap
> (from boot-time device setup to driver probe) is essentially holding an
> unbound lock.
>
> Unbound locks make it difficult to trace refcount leaks or debug
> lifecycle issues.
It's very standard for refcounts to be held for a long time, e.g. file
refcounts and device refcounts. LUO FLBs themselves already have
long-lived refcounts taken by each file that depends on themm, which
aren't released until that file handler's finish callback runs. The PCI
core is just doing the same thing.
>
> >
> > > 1. At Setup: In pci_liveupdate_setup_device(), we do the xarray lookup
> > > once, cache the pointer in dev->liveupdate.incoming, and immediately
> > > call pci_liveupdate_flb_put_incoming(). We do not hold a permanent
> > > reference.
> > >
> > > 2. On Access: When an accessor runs, instead of doing a full xarray
> > > lookup, it just validates the cached pointer's liveness by temporarily
> > > securing the FLB:
> > >
> > > static struct pci_flb_incoming *pci_liveupdate_get_incoming(struct pci_dev *dev)
> > > {
> > > struct pci_flb_incoming *incoming;
> > >
> > > incoming = pci_liveupdate_flb_get_incoming();
> > > if (!incoming)
> > > return NULL;
> > >
> > > if (dev->liveupdate.incoming)
> > > return incoming;
> > >
> > > pci_liveupdate_flb_put_incoming();
> > > return NULL;
> > > }
> > >
> > > * If get_incoming() returns NULL (the FLB has already finished/freed),
> > > the hint is invalid and the device is no longer incoming.
> >
> > This avoids the xarray lookup but still requires taking the incoming
> > FLB mutex twice (once for get and once for put) on every access. And
> > if there's no incoming PCI FLB, the LUO will iterate over all incoming
> > FLBs under the mutex to find it.
>
> Can we do a fast-path check first?
>
> static struct pci_flb_incoming *pci_liveupdate_get_incoming(struct pci_dev *dev)
> {
> struct pci_flb_incoming *incoming;
>
> /* Fast-path to avoid unnecessary FLB querying */
> if (!dev->liveupdate.incoming)
> return NULL;
>
> incoming = pci_liveupdate_flb_get_incoming();
> if (!incoming)
> return NULL;
>
> /* Check again, now that FLB is acquired */
> if (dev->liveupdate.incoming)
> return incoming;
>
> pci_liveupdate_flb_put_incoming();
> return NULL;
> }
>
> This seems to gives us the best of both worlds: robust refcount hygiene
> and a sane fast path.
>
> What do you think?
It still seems like an overall worse approach to me.
* From a performance perspective, the PCI core would still have to
acquire the FLB mutex twice every time it needs to use the device's
serialized state (once to acquire a new reference and once to release
it).
* From a locking perspective, the refcount doesn't actually protect
against the device itself going through finish. So we still need the
pci_liveupdate.rwsem.
* From a hygiene perspective, each reference is held for less time yes,
but there will more places in the code that need to acquire and
release a refcount. That is more room for bugs to leak a refcount.
So I'm not sure taking more small refcounts is an improvement.
With the current approach there is just one refcount with a very clear
lifetime (that aligns with the device file's refcount) and no extra LUO
mutexes required to use the device's serialized state during device
enumeration & setup.
next prev parent reply other threads:[~2026-07-21 20:25 UTC|newest]
Thread overview: 57+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-10 21:26 [PATCH v7 00/12] PCI: liveupdate: PCI core support for Live Update David Matlack
2026-07-10 21:26 ` [PATCH v7 01/12] PCI: liveupdate: Set up FLB handler for the PCI core David Matlack
2026-07-10 21:36 ` sashiko-bot
2026-07-17 19:28 ` Pasha Tatashin
2026-07-17 19:30 ` Jason Gunthorpe
2026-07-17 19:40 ` Pasha Tatashin
2026-07-17 19:42 ` Pasha Tatashin
2026-07-10 21:26 ` [PATCH v7 02/12] PCI: liveupdate: Track outgoing preserved PCI devices David Matlack
2026-07-10 21:39 ` sashiko-bot
2026-07-10 22:20 ` David Matlack
2026-07-17 19:38 ` Pasha Tatashin
2026-07-10 21:26 ` [PATCH v7 03/12] PCI: liveupdate: Track incoming " David Matlack
2026-07-10 21:39 ` sashiko-bot
2026-07-10 22:31 ` David Matlack
2026-07-17 21:46 ` Pasha Tatashin
2026-07-20 21:54 ` David Matlack
2026-07-20 22:44 ` Pasha Tatashin
2026-07-20 23:07 ` David Matlack
2026-07-21 17:55 ` Pasha Tatashin
2026-07-21 20:25 ` David Matlack [this message]
2026-07-21 21:35 ` Pasha Tatashin
2026-07-21 23:02 ` Samiullah Khawaja
2026-07-21 23:16 ` David Matlack
2026-07-21 23:18 ` David Matlack
2026-07-21 23:46 ` Pasha Tatashin
2026-07-17 22:38 ` Alex Williamson
2026-07-20 22:00 ` David Matlack
2026-07-10 21:26 ` [PATCH v7 04/12] PCI: liveupdate: Document driver binding responsibilities David Matlack
2026-07-10 21:28 ` sashiko-bot
2026-07-10 21:26 ` [PATCH v7 05/12] PCI: liveupdate: Keep bus numbers constant during Live Update David Matlack
2026-07-10 21:32 ` sashiko-bot
2026-07-17 21:48 ` Pasha Tatashin
2026-07-10 21:26 ` [PATCH v7 06/12] PCI: liveupdate: Auto-preserve upstream bridges across " David Matlack
2026-07-10 21:33 ` sashiko-bot
2026-07-17 22:00 ` Pasha Tatashin
2026-07-10 21:26 ` [PATCH v7 07/12] PCI: Refactor matching logic for pci_dev_acs_ops David Matlack
2026-07-10 21:34 ` sashiko-bot
2026-07-17 22:02 ` Pasha Tatashin
2026-07-10 21:26 ` [PATCH v7 08/12] PCI: liveupdate: Inherit ACS flags in incoming preserved devices David Matlack
2026-07-10 21:34 ` sashiko-bot
2026-07-17 22:08 ` Pasha Tatashin
2026-07-10 21:26 ` [PATCH v7 09/12] PCI: liveupdate: Inherit ARI Forwarding Enable on preserved bridges David Matlack
2026-07-10 21:37 ` sashiko-bot
2026-07-10 22:07 ` David Matlack
2026-07-17 23:29 ` Pasha Tatashin
2026-07-20 23:19 ` David Matlack
2026-07-21 18:17 ` Pasha Tatashin
2026-07-21 20:26 ` David Matlack
2026-07-10 21:26 ` [PATCH v7 10/12] PCI: liveupdate: Freeze preservation status during shutdown David Matlack
2026-07-10 21:35 ` sashiko-bot
2026-07-17 23:30 ` Pasha Tatashin
2026-07-10 21:26 ` [PATCH v7 11/12] PCI: liveupdate: Do not disable bus mastering on preserved devices during kexec David Matlack
2026-07-10 21:38 ` sashiko-bot
2026-07-17 23:32 ` Pasha Tatashin
2026-07-10 21:26 ` [PATCH v7 12/12] Documentation: PCI: Add documentation for Live Update David Matlack
2026-07-10 21:37 ` sashiko-bot
2026-07-17 23:38 ` Pasha Tatashin
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=al_VrpvPE-RLCF5X@google.com \
--to=dmatlack@google.com \
--cc=ajayachandra@nvidia.com \
--cc=alex@shazbot.org \
--cc=bhelgaas@google.com \
--cc=chrisl@kernel.org \
--cc=corbet@lwn.net \
--cc=graf@amazon.com \
--cc=jacob.pan@linux.microsoft.com \
--cc=jgg@nvidia.com \
--cc=jrhilke@google.com \
--cc=kexec@lists.infradead.org \
--cc=leonro@nvidia.com \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-pci@vger.kernel.org \
--cc=lukas@wunner.de \
--cc=parav@nvidia.com \
--cc=pasha.tatashin@soleen.com \
--cc=praan@google.com \
--cc=pratyush@kernel.org \
--cc=rientjes@google.com \
--cc=rppt@kernel.org \
--cc=saeedm@nvidia.com \
--cc=skhan@linuxfoundation.org \
--cc=skhawaja@google.com \
--cc=vipinsh@google.com \
--cc=witu@nvidia.com \
--cc=yi.l.liu@intel.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.