From: sashiko-bot@kernel.org
To: "Heiko Carstens" <hca@linux.ibm.com>
Cc: "Alexander Gordeev" <agordeev@linux.ibm.com>,
"Vasily Gorbik" <gor@linux.ibm.com>,
linux-s390@vger.kernel.org, "Heiko Carstens" <hca@linux.ibm.com>
Subject: Re: [PATCH v3 2/3] s390/pci: Rework __zpci_event_availability() to remove conditional locking
Date: Wed, 05 Aug 2026 14:23:29 +0000 [thread overview]
Message-ID: <20260805142329.D93451F000E9@smtp.kernel.org> (raw)
In-Reply-To: <20260805133627.1216607-3-hca@linux.ibm.com>
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
Pre-existing issues:
- [Critical] zpci_remove_reserved_devices() leaves zdev linked to a stack-allocated list, leading to Use-After-Scope stack memory corruption.
- [High] zpci_remove_reserved_devices() modifies device state without holding state_lock, causing data races and lockdep panics.
--
--- Patch [2]: [PATCH v3 2/3] s390/pci: Rework __zpci_event_availability() to remove conditional locking ---
commit 75e2f03936eebee8914ba9e93f94ec0e2bac2ac9
Author: Heiko Carstens <hca@linux.ibm.com>
s390/pci: Rework __zpci_event_availability() to remove conditional locking
This patch reworks __zpci_event_availability() to avoid taking locks
conditionally, resolving a compiler warning from static context analysis.
The event handling is split into smaller, dedicated functions.
> diff --git a/arch/s390/pci/pci_event.c b/arch/s390/pci/pci_event.c
> index bead4ed5d4abe..0a9eecb62bd1a 100644
> --- a/arch/s390/pci/pci_event.c
> +++ b/arch/s390/pci/pci_event.c
[ ... ]
> -static void __zpci_event_availability(struct zpci_ccdf_avail *ccdf)
> +static bool zpci_event_avail_any_device(struct zpci_ccdf_avail *ccdf)
> {
> - struct zpci_dev *zdev = get_zdev_by_fid(ccdf->fid);
> - bool existing_zdev = !!zdev;
> - enum zpci_state state;
> -
> - zpci_dbg(3, "avl fid:%x, fh:%x, pec:%x\n",
> - ccdf->fid, ccdf->fh, ccdf->pec);
> + /* 0x0306 - No handle or fid stored */
> + if (ccdf->pec != 0x0306)
> + return false;
> + /* 0x308 or 0x302 for multiple devices */
> + zpci_remove_reserved_devices();
[Severity: High]
This is a pre-existing issue, but does zpci_remove_reserved_devices() call
zpci_device_reserved() without holding the state_lock?
Looking at zpci_remove_reserved_devices() in arch/s390/pci/pci.c:
void zpci_remove_reserved_devices(void)
{
...
list_for_each_entry_safe(zdev, tmp, &remove, entry)
zpci_device_reserved(zdev);
}
And zpci_device_reserved() asserts this lock:
void zpci_device_reserved(struct zpci_dev *zdev)
{
lockdep_assert_held(&zdev->state_lock);
...
Will this result in a lockdep warning and potential data races on the
device state during a 0x0306 PCI event?
[Severity: Critical]
This is also a pre-existing issue, but can this lead to memory corruption
if the device reference count doesn't drop to zero?
In arch/s390/pci/pci.c:zpci_remove_reserved_devices():
void zpci_remove_reserved_devices(void)
{
...
LIST_HEAD(remove);
spin_lock(&zpci_list_lock);
list_for_each_entry_safe(zdev, tmp, &zpci_list, entry) {
if (...)
list_move_tail(&zdev->entry, &remove);
}
...
}
The devices are moved to a local stack-allocated list (remove).
When zpci_device_reserved(zdev) is called, it drops one reference. If
another thread currently holds a reference (for example, via
get_zdev_by_fid()), the device is not freed immediately. When
zpci_remove_reserved_devices() returns, the stack frame is destroyed, but
the device's entry remains linked to this destroyed stack memory.
Later, when the final reference is dropped, zpci_release_device() will call
list_del(&zdev->entry), writing to the invalid stack memory. Is there a
safe way to handle this list manipulation?
> + zpci_scan_devices();
> + return true;
> +}
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260805133627.1216607-1-hca@linux.ibm.com?part=2
next prev parent reply other threads:[~2026-08-05 14:23 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-05 13:36 [PATCH v3 0/3] s390/pci: Enable CONTEXT_ANALYSIS Heiko Carstens
2026-08-05 13:36 ` [PATCH v3 1/3] s390/pci: Rework __zpci_event_error() to remove conditional locking Heiko Carstens
2026-08-05 14:09 ` sashiko-bot
2026-08-05 13:36 ` [PATCH v3 2/3] s390/pci: Rework __zpci_event_availability() " Heiko Carstens
2026-08-05 14:01 ` Niklas Schnelle
2026-08-05 14:23 ` sashiko-bot [this message]
2026-08-05 13:36 ` [PATCH v3 3/3] s390/pci: Enable CONTEXT_ANALYSIS Heiko Carstens
2026-08-05 14:12 ` sashiko-bot
2026-08-07 10:48 ` [PATCH v3 0/3] " Heiko Carstens
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=20260805142329.D93451F000E9@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=agordeev@linux.ibm.com \
--cc=gor@linux.ibm.com \
--cc=hca@linux.ibm.com \
--cc=linux-s390@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.