[PATCH v4 02/11] PCI: liveupdate: Track outgoing preserved PCI devices

David Matlack dmatlack at google.com
Tue Apr 28 14:12:13 PDT 2026


On Tue, Apr 28, 2026 at 1:20 PM Vipin Sharma <vipinsh at google.com> wrote:
>
> On Thu, Apr 23, 2026 at 09:23:06PM +0000, David Matlack wrote:
> > +int pci_liveupdate_preserve(struct pci_dev *dev)
> > +{
> > +     struct pci_ser *ser;
> > +     int i, ret;
> > +
> > +     guard(mutex)(&pci_flb_outgoing_lock);
> > +
> > +     ret = liveupdate_flb_get_outgoing(&pci_liveupdate_flb, (void **)&ser);
> > +     if (ret)
> > +             return ret;
> > +
> > +     if (!ser)
> > +             return -ENOENT;
> > +
> > +     if (dev->is_virtfn)
> > +             return -EINVAL;
> > +
> > +     if (dev->liveupdate_outgoing)
> > +             return -EBUSY;
> > +
> > +     if (ser->nr_devices == ser->max_nr_devices)
> > +             return -ENOSPC;
> > +
> > +     for (i = 0; i < ser->max_nr_devices; i++) {
> > +             /*
> > +              * Start searching at index ser->nr_devices. This should result
> > +              * in a constant time search under expected conditions (devices
> > +              * are not getting unpreserved).
> > +              */
> > +             int index = (ser->nr_devices + i) % ser->max_nr_devices;
> > +             struct pci_dev_ser *dev_ser = &ser->devices[index];
> > +
> > +             if (dev_ser->refcount)
> > +                     continue;
> > +
> > +             pci_info(dev, "Device will be preserved across next Live Update\n");
> > +             ser->nr_devices++;
> > +
> > +             dev_ser->domain = pci_domain_nr(dev->bus);
> > +             dev_ser->bdf = pci_dev_id(dev);
> > +             dev_ser->refcount = 1;
> > +
> > +             dev->liveupdate_outgoing = dev_ser;
> > +             return 0;
> > +     }
> > +
> > +     return -ENOSPC;
>
> Since it is executing under a mutex, and we already failed
> 'if (ser->nr_devices == ser->max_nr_devices) check above, will we ever reach
> here and return -ENOSPC?

Yeah I wouldn't expect to ever reach here.

> > diff --git a/include/linux/kho/abi/pci.h b/include/linux/kho/abi/pci.h
> > index 5c0e92588c00..5b4c8d9e462c 100644
> > --- a/include/linux/kho/abi/pci.h
> > +++ b/include/linux/kho/abi/pci.h
> > @@ -23,19 +23,20 @@
> >   * incrementing the version number in the PCI_LUO_FLB_COMPATIBLE string.
> >   */
> >
> > -#define PCI_LUO_FLB_COMPATIBLE "pci-v1"
> > +#define PCI_LUO_FLB_COMPATIBLE "pci-v2"
>
> Just curious, why did we change the version here?

Because a field in struct pci_dev_ser changed.

> It's not like just
> previous patch is working enough to perform a live update. As the config
> is experimental, can't we just keep it PCI-v1 for the whole series?

What is the benefit of keeping "pci-v1"?

I think it makes sense to follow the rule we set which is to update
the compatibility string in any commit that changes the ABI.



More information about the kexec mailing list