mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Bjorn Helgaas <helgaas@kernel.org>
To: David Matlack <dmatlack@google.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>,
	Pasha Tatashin <pasha.tatashin@soleen.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 v8 01/12] PCI: liveupdate: Set up FLB handler for the PCI core
Date: Wed, 16 Sep 2026 18:50:41 -0500	[thread overview]
Message-ID: <20260916235041.GA989143@bhelgaas> (raw)
In-Reply-To: <aqQv0jJdT4xq6VWu@google.com>

On Fri, Sep 11, 2026 at 04:44:02PM +0000, David Matlack wrote:
> On 2026-09-10 06:48 PM, Bjorn Helgaas wrote:
> > On Tue, Jul 28, 2026 at 10:09:55PM +0000, David Matlack wrote:
> > > Set up a File-Lifecycle-Bound (FLB) handler for the PCI core to enable
> > > it to participate in the preservation of PCI devices across Live Update.
> > > Essentially, this commit enables the PCI core to allocate a struct
> > > (struct pci_ser) and preserve it across a Live Update whenever at least
> > > one device is preserved.
> > 
> > I assume pci_ser is the state the PCI core needs to preserve across
> > kexec so the new kernel's enumeration doesn't interrupt the device
> > operation.  And that whatever state the endpoint drivers need to
> > adopt/inherit the device in the new kernel is managed without any help
> > from the PCI core?
> 
> Yes.
> 
> > > Preserving PCI devices across Live Update is built on top of the Live
> > > Update Orchestrator's (LUO) support for file preservation. Drivers are
> > > expected to expose a file to userspace to represent a single PCI device
> > > and support preservation of that file. This is intended primarily to
> > > support preservation of PCI devices bound to VFIO drivers.
> > 
> > Where do drivers expose this file?  sysfs?  I guess it's a file per
> > preserved device?  Thinking like a driver writer, I'm expecting a hint
> > about how to expose this file (should also be in the file doc somehere
> > if it's not already).
> 
> There is no requirement about how drivers do this from the PCI core
> perspective. For all intents and purposes, the VFIO PCI variant drivers
> are the only drivers that are going to be supported in the next 1-2
> years. They expose a misc character device for each file.

If this file isn't relevant to the PCI core, maybe we don't need to
mention it here.  It doesn't seem like it motivates this patch.

> > > This commit enables drivers to register their liveupdate_file_handler
> > > with the PCI core so that the PCI core can do its own tracking and
> > > enforcement of which devices are preserved.
> > > 
> > >   pci_liveupdate_register_flb(driver_file_handler);
> > >   pci_liveupdate_unregister_flb(driver_file_handler);
> > 
> > So a driver calls pci_liveupdate_register_flb() once, then
> > pci_liveupdate_preserve() once for each device it wants preserved?
> 
> Yes
> 
> > > When the first file (with a handler registered with the PCI core) is
> > > preserved, the PCI core will be notified to allocate its tracking struct
> > > (pci_ser).
> > 
> > The passive voice here makes the actors a bit obscure.  I guess a
> > LIVEUPDATE_SESSION_PRESERVE_FD ioctl on some per-device file kicks
> > this off?
> 
> Yes. (And I will reduce the passive voice in the next version.)
> 
> > I guess the pci_ser allocation is in
> > pci_liveupdate_flb_ops.preserve(), i.e., pci_flb_preserve()?
> 
> Yes.
> 
> > So the PCI core tracker (pci_ser) isn't actually allocated at the time
> > of pci_liveupdate_register_flb(); it's allocated on the first
> > LIVEUPDATE_SESSION_PRESERVE_FD ioctl for a driver that has called
> > pci_liveupdate_register_flb()?
> 
> Yes. The first device that gets preserved triggers the allocation of
> struct pci_ser. And the last device that gets unpreserved (preservation
> cancelled) triggers the freeing of struct pci_ser.
> 
> > IIUC the call tree for that ioctl looks something like this:
> > 
> >   <driver>
> >     pci_liveupdate_register_flb
> >       liveupdate_register_flb(fh, &pci_liveupdate_flb)
> > 
> >   luo_session_ioctl
> >     op = &luo_session_ioctl_ops[...]
> >     op->execute                               # eg luo_session_preserve_fd()
> >       luo_session_preserve_fd
> >         luo_preserve_file
> >           luo_flb_file_preserve
> >             luo_flb_file_preserve_one
> >               if (outgoing_count == 0)        # only for first FLB device
> >                 flb->ops->preserve            # eg pci_flb_preserve()
> >                   pci_flb_preserve
> >                     ser = kho_alloc_preserve  <-- alloc pci_ser
> >                 outgoing.count = 1
> >           fh->ops->preserve                   # something not included here

So IIUC this part of the path looks like this, which answers my
question below about ordering of pci_ser and
pci_liveupdate_preserve():

              fh->ops->preserve                   # eg vfio_pci_liveupdate_preserve()
                vfio_pci_liveupdate_preserve
                  pci_liveupdate_preserve
                    pci_liveupdate_preserve_device
                      dev_ser = pci_flb_alloc_dev_ser  <-- alloc per-dev PCI core serialized state
                      dev_ser->bdf = pci_dev_id(dev)

> > Seems like kind of an awkward way to allocate pci_ser.  Couldn't it be
> > allocated on the first call to pci_liveupdate_register_flb()?  That
> > would be a lot easier for driver writers to trace through.
> 
> I agree the LUO FLB API is a bit awkward, but this is how it works.
> 
> If we allocated it during pci_liveupdate_register_flb() we would then
> need to stash it in a global variable to hand-off the LUO later. Despite
> the awkwardness of FLBs, it is useful to avoid globals and have LUO
> management the lifetime.

It seems like pci_ser is a singleton by design, so a global variable
doesn't sound like it would be terrible to me.

> > > When the last file is unpreserved (i.e. preservation
> > > cancelled) the PCI core will be notified to free struct pci_ser.
> > 
> > There's a lot going on behind "PCI core will be notified".  I assume
> > these refer to the first-time behavior of luo_flb_file_preserve_one()
> > and last-time behavior of liveupdate_flb_put_outgoing(), which is
> > honestly kind of hard to suss out.

Could we say something specific and PCI-related here, to help connect
the dots?  Most of these paths are outside the PCI core.

IIUC luo_session essentially has a refcount (outgoing.count)
incremented by each LIVEUPDATE_SESSION_PRESERVE_FD ioctl, and the 0->1
transition in luo_flb_file_preserve_one() ends up calling
pci_flb_preserve(), where pci_ser is allocated.

And the refcount is decremented by luo_flb_file_unpreserve() (in a
luo_session .release() function), where the 1->0 transition in
liveupdate_flb_put_outgoing() calls pci_flb_unpreserve() where pci_ser
is deallocated.

That gets into a lot of detail, probably too much for a commit log.
Maybe mentioning the function names by which the PCI core is notified
to alloc/free pci_ser would be enough of a bread crumb.

> > This series doesn't include a caller of pci_liveupdate_preserve() (or
> > pci_liveupdate_register_flb()), so I can't figure out the ordering.
> > Obviously pci_liveupdate_register_flb() must be first.
> 
> In every version of this patch series I have sent I included a link to
> the vfio-pci driver changes that build on top of this, rebased that
> series on top of this one, uploaded it to my GitHub, and included a link
> in the cover letter. Here is the relevant section from the v8 cover
> letter:
> 
> . This series was tested in conjunction with v5 of the VFIO PCI driver
> . series:
> .
> .   https://lore.kernel.org/kvm/20260714151505.3466855-1-vipinsh@google.com/
> .
> . The full set of patches used for testing can be found on GitHub.
> .
> .   https://github.com/dmatlack/linux/tree/liveupdate/pci/base/v8-with-vfio
> 
> 
> > I first thought pci_liveupdate_preserve() would be called via the
> > fh->ops->preserve() in the luo_session_preserve_fd() ioctl path, but
> > it's not.  pci_liveupdate_preserve() is intended for the driver to
> > call it directly.  But it looks like it has to be called *after* the
> > ioctl?  Obviously I'm confused :)
> 
> It is called by the driver during it's fh->ops->preserve() callback. In
> other words, it is called during the ioctl by the driver.

I think the updated call tree above shows the connection?

> LUO just knows that a file has been preserved and what preserve()
> callback it needs to run to preserve that file. It is has no idea which
> files correspond to devices or which devices. The file could be a memfd
> for all LUO knows. That's why the driver has to call into the PCI core
> via pci_liveupdate_preserve() to let it know that a device is being
> preserved, and which.

  reply	other threads:[~2026-09-16 23:50 UTC|newest]

Thread overview: 51+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-28 22:09 [PATCH v8 00/12] PCI: liveupdate: PCI core support for Live Update David Matlack
2026-07-28 22:09 ` [PATCH v8 01/12] PCI: liveupdate: Set up FLB handler for the PCI core David Matlack
2026-08-17 21:12   ` Samiullah Khawaja
2026-09-10 23:48   ` Bjorn Helgaas
2026-09-11 16:44     ` David Matlack
2026-09-16 23:50       ` Bjorn Helgaas [this message]
2026-07-28 22:09 ` [PATCH v8 02/12] PCI: liveupdate: Track outgoing preserved PCI devices David Matlack
2026-08-24 20:14   ` Samiullah Khawaja
2026-08-27 21:47   ` Bjorn Helgaas
2026-09-16  3:10   ` Zhu Yanjun
2026-09-16 14:58     ` David Matlack
2026-07-28 22:09 ` [PATCH v8 03/12] PCI: liveupdate: Track incoming " David Matlack
2026-08-24 20:13   ` Samiullah Khawaja
2026-09-10 23:49   ` Bjorn Helgaas
2026-09-11 16:45     ` David Matlack
2026-09-16  3:31   ` Zhu Yanjun
2026-09-16 17:28     ` David Matlack
2026-09-16 18:25       ` Pratyush Yadav
2026-09-16 18:31         ` David Matlack
2026-09-16 18:58           ` Pratyush Yadav
2026-09-16 19:23             ` David Matlack
2026-07-28 22:09 ` [PATCH v8 04/12] PCI: liveupdate: Document driver binding responsibilities David Matlack
2026-09-10 23:50   ` Bjorn Helgaas
2026-07-28 22:09 ` [PATCH v8 05/12] PCI: liveupdate: Preserve bus numbers during Live Update David Matlack
2026-09-10 23:51   ` Bjorn Helgaas
2026-09-11 18:30     ` David Matlack
2026-09-12 17:31       ` David Matlack
2026-09-16 23:54         ` Bjorn Helgaas
2026-07-28 22:10 ` [PATCH v8 06/12] PCI: liveupdate: Auto-preserve upstream bridges across " David Matlack
2026-08-24 13:41   ` Pranjal Shrivastava
2026-09-10 23:51   ` Bjorn Helgaas
2026-09-11 17:00     ` David Matlack
2026-09-17  0:18       ` Bjorn Helgaas
2026-09-17  0:07   ` Bjorn Helgaas
2026-07-28 22:10 ` [PATCH v8 07/12] PCI: Refactor matching logic for pci_dev_acs_ops David Matlack
2026-07-28 22:10 ` [PATCH v8 08/12] PCI: liveupdate: Adopt ACS controls in incoming preserved devices David Matlack
2026-08-24 13:42   ` Pranjal Shrivastava
2026-09-10 23:51   ` Bjorn Helgaas
2026-09-11 18:31     ` David Matlack
2026-09-14 16:45       ` David Matlack
2026-09-17  0:23         ` Bjorn Helgaas
2026-07-28 22:10 ` [PATCH v8 09/12] PCI: liveupdate: Adopt ARI Forwarding Enable on preserved bridges David Matlack
2026-08-24 13:43   ` Pranjal Shrivastava
2026-07-28 22:10 ` [PATCH v8 10/12] PCI: liveupdate: Freeze preservation status during shutdown David Matlack
2026-08-24 20:07   ` Samiullah Khawaja
2026-07-28 22:10 ` [PATCH v8 11/12] PCI: liveupdate: Do not disable bus mastering on preserved devices during kexec David Matlack
2026-08-24 20:02   ` Samiullah Khawaja
2026-07-28 22:10 ` [PATCH v8 12/12] Documentation: PCI: Add documentation for Live Update David Matlack
2026-08-24 20:01   ` Samiullah Khawaja
2026-08-18 17:01 ` [PATCH v8 00/12] PCI: liveupdate: PCI core support " David Matlack
2026-09-10 21:37 ` 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=20260916235041.GA989143@bhelgaas \
    --to=helgaas@kernel.org \
    --cc=ajayachandra@nvidia.com \
    --cc=alex@shazbot.org \
    --cc=bhelgaas@google.com \
    --cc=chrisl@kernel.org \
    --cc=corbet@lwn.net \
    --cc=dmatlack@google.com \
    --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 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®