[PATCH v4 05/11] PCI: liveupdate: Inherit bus numbers during Live Update

David Matlack dmatlack at google.com
Mon Apr 27 13:40:58 PDT 2026


On 2026-04-27 11:47 AM, Jacob Pan wrote:
> On Thu, 23 Apr 2026 21:23:09 +0000
> David Matlack <dmatlack at google.com> wrote:

> > To keep things simple, inherit the secondary and subordinate bus
> > numbers on all bridges if any PCI devices were preserved (i.e. even
> > bridges without any downstream endpoints that were preserved). This
> > avoids accidentally assigning a bridge a new window that overlaps
> > with a preserved device that is downstream of a different bridge.
> > 
> > If a bridge is enumerated with a broken topology or has no bus numbers
> > set during a Live Update, refuse to assign it new bus numbers and
> > refuse to enumerate devices below it. This is a safety measure to
> > prevent topology conflicts.
> > 
> > Require that CONFIG_CARDBUS is not enabled to enable
> > CONFIG_PCI_LIVEUPDATE since inheriting bus numbers on PCI-to-CardBus
> > bridges requires additional work but is not a priority at the moment.
> > 
> > Signed-off-by: David Matlack <dmatlack at google.com>

> > +	/*
> > +	 * During a Live Update, preserved devices are allowed to
> > continue
> > +	 * performing memory transactions. The kernel must not
> > change the fabric
> > +	 * topology, including bus numbers, since that would require
> > disabling
> > +	 * and flushing any memory transactions first.
> > +	 *
> > +	 * To keep things simple, inherit the secondary and
> > subordinate bus
> > +	 * numbers on _all_ bridges if _any_ PCI devices were
> > preserved (i.e.
> > +	 * even bridges without any downstream endpoints that were
> > preserved).
> > +	 * This avoids accidentally assigning a bridge a new window
> > that
> > +	 * overlaps with a preserved device that is downstream of a
> > different
> > +	 * bridge.
> > +	 */
> > +	dev->liveupdate_inherit_buses = true;
> > +
> This flag never gets cleared after the incoming kernel boot up, what if
> the user does a manual rescan via sysfs? i.e.
> # echo 1 > /sys/bus/pci/rescan
> pcibios_assign_all_busses() will never gets called for this device, and
> may hit this
> 	if (dev->liveupdate_inherit_buses) {
> 		pci_err(dev, "Cannot reconfigure bridge during
> 		Live Update!\n");
> 
> So, maybe clear it in pci_liveupdate_finish()?

I think we can allo wa rescan to assign new bus numbers once all devices
go through pci_liveupdate_finish() by clearing
dev->liveupdate_inherit_buses on all devices in pci_flb_finish(). We
would need to hold pci_rescan_remove_lock to avoid this racing with such
a rescan.

Now that you bring up /sys/bus/pci/rescan... I think we also need to
set dev->liveupdate_inherit_buses in the outgoing kernel, to avoid bus
numbers changing on outgoing preserved devices. pci_flb_preserve()
should take pci_rescan_remove_lock and set dev->liveupdate_inherit_buses
on all devices, and pci_flb_unpreserve() should do the opposite.

If we did all then then /sys/bus/pci/rescan can work like normal as long
as no devices are preserved (incoming or outgoing). If any devices are
preserved then dev->liveupdate_inherit_buses gets set to prevent bus
numbers from changing during a possible rescan.



More information about the kexec mailing list