From: sashiko-bot@kernel.org
To: "David Jeffery" <djeffery@redhat.com>
Cc: linux-scsi@vger.kernel.org, linux-pci@vger.kernel.org
Subject: Re: [PATCH 3/9] driver core: warn should device_move try to move a need_parent_lock device
Date: Fri, 21 Aug 2026 14:34:13 +0000 [thread overview]
Message-ID: <20260821143413.AB5AF1F000E9@smtp.kernel.org> (raw)
In-Reply-To: <20260821142414.150892-4-djeffery@redhat.com>
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
Pre-existing issues:
- [Critical] Concurrent execution of device_move() and PM runtime operations causes a Use-After-Free on the parent device pointer.
- [High] device_move() corrupts PM runtime child_count accounting, potentially causing active devices to panic when their parent is prematurely suspended.
--
--- Patch [3]: [PATCH 3/9] driver core: warn should device_move try to move a need_parent_lock device ---
commit da39f0a4e63233986f7aa69f70fc28bb25510d0a
Author: David Jeffery <djeffery@redhat.com>
driver core: warn should device_move try to move a need_parent_lock device
Currently, no device has need_parent_lock set and is moved by
device_move. need_parent_lock is only set by the usb bus and very
few device types ever use device_move.
Adds a warning to device_move to catch should it ever be used on a
device with need_parent_lock set.
> diff --git a/drivers/base/core.c b/drivers/base/core.c
> index 78b90326addb6..20b37ee07b5ac 100644
> --- a/drivers/base/core.c
> +++ b/drivers/base/core.c
> @@ -4708,6 +4708,14 @@ int device_move(struct device *dev, struct device *new_parent,
> if (!dev)
> return -EINVAL;
>
> + /*
> + * device_move() should not be used on devices with need_parent_lock
> + * set. Concurrent reparenting will violate the immutable
> + * relationship needed while locking and unlocking both parent and
> + * child.
> + */
> + WARN_ON(dev->bus && dev->bus->need_parent_lock);
> +
> device_pm_lock();
> new_parent = get_device(new_parent);
> new_parent_kobj = get_device_parent(dev, new_parent);
[Severity: Critical]
This is a pre-existing issue, but does this code allow a use-after-free of
the parent pointer if rpm_resume() runs concurrently with device_move()?
In drivers/base/power/runtime.c:rpm_resume(), dev->parent is read into a
local variable while holding dev->power.lock, but the lock is released
before pm_runtime_get_noresume() takes a reference to it:
drivers/base/power/runtime.c:rpm_resume() {
...
parent = dev->parent;
if (dev->power.irq_safe)
goto skip_parent;
spin_unlock(&dev->power.lock);
pm_runtime_get_noresume(parent);
...
}
Meanwhile, device_move() modifies dev->parent and drops the reference to
old_parent without holding dev->power.lock:
drivers/base/core.c:device_move() {
...
old_parent = dev->parent;
dev->parent = new_parent;
...
put_device(old_parent);
...
}
If device_move() frees old_parent during the lockless window in rpm_resume(),
this could cause a use-after-free memory corruption.
[Severity: High]
This isn't a bug introduced by this patch, but when device_move() reparents
an active device, could it corrupt the PM runtime child_count accounting?
When reparenting an active device, device_move() does not transfer the PM
runtime child_count from the old parent to the new parent:
drivers/base/core.c:device_move() {
...
old_parent = dev->parent;
dev->parent = new_parent;
...
}
When the moved device later suspends, rpm_suspend() decrements the child_count
of the new parent:
drivers/base/power/runtime.c:rpm_suspend() {
...
if (dev->parent) {
parent = dev->parent;
atomic_add_unless(&parent->power.child_count, -1, 0);
}
...
}
If the new parent has other active children, its child_count will prematurely
reach zero. This could cause the PM core to suspend the parent while its
other children are still actively performing I/O, potentially resulting in a
kernel panic or hardware lockup.
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260821142414.150892-1-djeffery@redhat.com?part=3
next prev parent reply other threads:[~2026-08-21 14:34 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-21 14:24 [PATCH v20 0/9] shut down devices asynchronously David Jeffery
2026-08-21 14:24 ` [PATCH 1/9] driver core: rely on put_device to free dev->p David Jeffery
2026-08-21 14:32 ` sashiko-bot
2026-08-21 14:24 ` [PATCH 2/9] driver core: prevent device_add() during system shutdown David Jeffery
2026-08-21 14:43 ` sashiko-bot
2026-08-28 16:01 ` tarunsahu
2026-08-21 14:24 ` [PATCH 3/9] driver core: warn should device_move try to move a need_parent_lock device David Jeffery
2026-08-21 14:34 ` sashiko-bot [this message]
2026-08-28 15:50 ` tarunsahu
2026-08-21 14:24 ` [PATCH 4/9] driver core: separate function to shutdown one device David Jeffery
2026-08-21 14:29 ` sashiko-bot
2026-08-21 14:24 ` [PATCH 5/9] driver core: do not always lock parent in shutdown David Jeffery
2026-08-21 14:33 ` sashiko-bot
2026-08-21 14:24 ` [PATCH 6/9] driver core: async device shutdown infrastructure David Jeffery
2026-08-21 14:38 ` sashiko-bot
2026-08-21 14:24 ` [PATCH 7/9] PCI: Link a virtual function to its physical function David Jeffery
2026-08-21 14:34 ` sashiko-bot
2026-08-21 14:24 ` [PATCH 8/9] PCI: Enable async shutdown support David Jeffery
2026-08-21 14:39 ` sashiko-bot
2026-08-21 14:24 ` [PATCH 9/9] scsi: " David Jeffery
2026-08-21 14:38 ` sashiko-bot
-- strict thread matches above, loose matches on Subject: below --
2026-09-02 17:07 [PATCH v21 0/9] shut down devices asynchronously David Jeffery
2026-09-02 17:07 ` [PATCH 3/9] driver core: warn should device_move try to move a need_parent_lock device David Jeffery
2026-09-02 17:22 ` 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=20260821143413.AB5AF1F000E9@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=djeffery@redhat.com \
--cc=linux-pci@vger.kernel.org \
--cc=linux-scsi@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.