Re: [PATCH v6 08/12] PCI: liveupdate: Inherit ACS flags in incoming preserved devices
From: Pranjal Shrivastava
Date: Tue Jun 09 2026 - 13:22:48 EST
On Mon, Jun 08, 2026 at 09:56:41PM +0000, David Matlack wrote:
> On 2026-06-07 08:37 PM, Pranjal Shrivastava wrote:
> > On Fri, May 22, 2026 at 08:24:06PM +0000, David Matlack wrote:
> > > Inherit Access Control Services (ACS) flags on all incoming preserved
> > > devices (endpoints and upstream bridges) during a Live Update.
> > >
> > > Inheriting ACS flags avoids changing routing rules while memory
> > > transactions are in flight from preserved devices. This is also strictly
> > > necessary to ensure that IOMMU group assignments do not change across
> > > a Live Update for preserved devices, as changing ACS configurations can
> > > split or merge IOMMU groups.
> > >
> > > Cache the inherited ACS controls established by the previous kernel in
> > > struct pci_dev so that ACS controls do not change after a reset
> > > (pci_restore_state() calls pci_enable_acs()).
> > >
> > > To simplify ACS inheritance, reject preserving any devices that require
> > > quirks to enable ACS as those quirks would also have to take Live Update
> > > into account.
> > >
> > > Signed-off-by: David Matlack <dmatlack@xxxxxxxxxx>
> > > ---
> > > drivers/pci/liveupdate.c | 68 ++++++++++++++++++++++++++++++++++
> > > drivers/pci/liveupdate.h | 11 ++++++
> > > drivers/pci/pci.c | 5 +++
> > > drivers/pci/pci.h | 5 +++
> > > drivers/pci/quirks.c | 7 ++++
> > > include/linux/pci_liveupdate.h | 6 +++
> > > 6 files changed, 102 insertions(+)
> > >
> >
> > [...]
> >
> > >
> > > +void pci_liveupdate_init_acs(struct pci_dev *dev)
> > > +{
> > > + guard(rwsem_read)(&pci_liveupdate.rwsem);
> > > +
> > > + if (!dev->acs_cap || !dev->liveupdate.incoming)
> > > + return;
> > > +
> > > + pci_read_config_word(dev, dev->acs_cap + PCI_ACS_CTRL, &dev->liveupdate.acs_ctrl);
> >
> > I might be thinking out loud here, but as an attacker, this motivates me
> > to somehow hack the EP FW to mis-report the PCI_ACS_CTRL register across
> > a liveupdate to fool the incoming kernel. If the FW feeds a 0, it silently
> > strips ACS protections.
> >
> > Should we also serialize ACS state in ser somehow to ensure we aren't
> > fooled by something like this?
>
> What does "EP FW" mean?
I was referring to the Endpoint Firmware (basically any SW running on
a downstream device)
>
> Does such an attacker even need Live Update to attack the system? It
> seems like such an attacker could route TLPs in whatever malicious way
> they want regardless of Live Update.
>
I agree that compromised PCIe devices are a menace anyway. But I was
talking about the potential window opened up by Live Update here,
suppose we have Device A & B assigned to 2 different VMs (implying they
are in separate IOMMU groups because the switch set ACS_RR = 1).
Now, the attacker has an opportunity with Liveupdate, since the devices
are already assigned, if *somehow* it flips a bit like ACS_RR, the
incoming kernel might see both the devices in the same IOMMU group.
Who detects this case and what happens if this happens if the devices
are kept assigned to these VMs?
Thanks,
Praan