Linux PCI subsystem development
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "David Matlack" <dmatlack@google.com>
Cc: linux-pci@vger.kernel.org
Subject: Re: [PATCH v7 02/12] PCI: liveupdate: Track outgoing preserved PCI devices
Date: Fri, 10 Jul 2026 21:39:01 +0000	[thread overview]
Message-ID: <20260710213902.56C6C1F000E9@smtp.kernel.org> (raw)
In-Reply-To: <20260710212616.1351130-3-dmatlack@google.com>

Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [High] Missing lock acquisition in FLB destruction callbacks allows concurrent operations to trigger a Use-After-Free.
- [High] A dangling dev->liveupdate.outgoing pointer after an aborted Live Update leads to a Use-After-Free if a subsequent Live Update is attempted.
--

--- Patch [2]: [PATCH v7 02/12] PCI: liveupdate: Track outgoing preserved PCI devices ---
commit 9a74c06de23d913aa84d2cbcc2aa3409bb1d2eb3
Author: David Matlack <dmatlack@google.com>

PCI: liveupdate: Track outgoing preserved PCI devices

This patch adds tracking for outgoing preserved PCI devices across Kexec
Handover (Live Update). It introduces APIs for drivers to notify the core
when devices are preserved or unpreserved, updating the PCI core's FLB data.

> diff --git a/drivers/pci/liveupdate.c b/drivers/pci/liveupdate.c
> index 899758883dd5d..03075ce06ac98 100644
> --- a/drivers/pci/liveupdate.c
> +++ b/drivers/pci/liveupdate.c

[ ... ]

> +static void pci_liveupdate_unpreserve_device(struct pci_flb_outgoing *outgoing, struct pci_dev *dev)
> +{
> +	struct pci_dev_ser *dev_ser = dev->liveupdate.outgoing;

[Severity: High]
If a previous Live Update was aborted without explicitly unpreserving all
devices, will dev->liveupdate.outgoing point to freed memory here?

During an abort, pci_flb_unpreserve() executes:

    WARN_ON(outgoing->ser->nr_devices);
    kho_block_set_destroy(&outgoing->block_set);

This destroys the block set backing the dev_ser allocations, but the
dev->liveupdate.outgoing pointers on the actual pci_dev structs are never
cleared.

If a subsequent Live Update is started and pci_liveupdate_unpreserve() is
called on one of those devices, could we dereference that dangling dev_ser
pointer and corrupt memory when clearing it below?

> +
> +	if (!dev_ser) {
> +		pci_warn(dev, "Cannot unpreserve device that is not preserved\n");
> +		return;
> +	}
> +
> +	pci_info(dev, "Device will no longer be preserved across next Live Update\n");
> +	outgoing->ser->nr_devices--;
> +	memset(dev_ser, 0, sizeof(*dev_ser));
> +	dev->liveupdate.outgoing = NULL;
> +}

[ ... ]

> +void pci_liveupdate_unpreserve(struct pci_dev *dev)
> +{
> +	struct pci_flb_outgoing *outgoing = NULL;
> +
> +	guard(rwsem_write)(&pci_liveupdate.rwsem);
> +
> +	outgoing = pci_liveupdate_flb_get_outgoing();

[Severity: High]
Does the destruction path in pci_flb_unpreserve() also need to acquire
pci_liveupdate.rwsem?

If a PCI device is hot-removed concurrently with a Live Update abort:

Thread 1 (driver remove):
pci_liveupdate_unpreserve()
    guard(rwsem_write)(&pci_liveupdate.rwsem);
    outgoing = pci_liveupdate_flb_get_outgoing();
    ... begins modifying outgoing and dev_ser

Thread 2 (Live Update core abort):
pci_flb_unpreserve()
    kho_block_set_destroy(&outgoing->block_set);
    kho_unpreserve_free(outgoing->ser);
    kfree(outgoing);

If pci_flb_unpreserve() destroys the outgoing FLB without acquiring the
semaphore, could Thread 1 end up writing to freed memory?

> +	if (IS_ERR(outgoing)) {
> +		pci_warn(dev, "Cannot unpreserve device without outgoing Live Update state\n");
> +		return;
> +	}
> +
> +	pci_liveupdate_unpreserve_device(outgoing, dev);
> +}
> +EXPORT_SYMBOL_GPL(pci_liveupdate_unpreserve);

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260710212616.1351130-1-dmatlack@google.com?part=2

  reply	other threads:[~2026-07-10 21:39 UTC|newest]

Thread overview: 28+ 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-10 21:26 ` [PATCH v7 02/12] PCI: liveupdate: Track outgoing preserved PCI devices David Matlack
2026-07-10 21:39   ` sashiko-bot [this message]
2026-07-10 22:20     ` David Matlack
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-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-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-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-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-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-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-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-10 21:26 ` [PATCH v7 12/12] Documentation: PCI: Add documentation for Live Update David Matlack
2026-07-10 21:37   ` sashiko-bot

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=20260710213902.56C6C1F000E9@smtp.kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=dmatlack@google.com \
    --cc=linux-pci@vger.kernel.org \
    --cc=sashiko-reviews@lists.linux.dev \
    /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