From: Lukas Wunner <lukas@wunner.de>
To: "Rafael J. Wysocki" <rjw@rjwysocki.net>
Cc: Linux PM list <linux-pm@vger.kernel.org>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Alan Stern <stern@rowland.harvard.edu>,
Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
Tomeu Vizoso <tomeu.vizoso@collabora.com>,
Mark Brown <broonie@kernel.org>,
Marek Szyprowski <m.szyprowski@samsung.com>,
Kevin Hilman <khilman@kernel.org>,
Ulf Hansson <ulf.hansson@linaro.org>,
"Luis R. Rodriguez" <mcgrof@suse.com>
Subject: Re: [Update][RFC/RFT][PATCH v3 2/5] driver core: Functional dependencies tracking support
Date: Mon, 26 Sep 2016 18:51:21 +0200 [thread overview]
Message-ID: <20160926165121.GA5353@wunner.de> (raw)
In-Reply-To: <2576815.LnbrnvuK3u@vostro.rjw.lan>
On Fri, Sep 23, 2016 at 03:42:31PM +0200, Rafael J. Wysocki wrote:
> On Tuesday, September 20, 2016 12:46:30 AM Lukas Wunner wrote:
> > On Fri, Sep 16, 2016 at 02:33:55PM +0200, Rafael J. Wysocki wrote:
> > > +void device_links_no_driver(struct device *dev)
> > > +{
> > > + struct device_link *link, *ln;
> > > +
> > > + mutex_lock(&device_links_lock);
> > > +
> > > + list_for_each_entry_safe_reverse(link, ln, &dev->links_to_suppliers, c_node) {
> > > + if (link->flags & DEVICE_LINK_STATELESS)
> > > + continue;
> > > +
> > > + if (link->flags & DEVICE_LINK_AUTOREMOVE) {
> > > + __device_link_del(link);
> >
> > The link will be autoremoved not only when the consumer unbinds,
> > but also when probing the consumer fails.
> >
> > Looks like a bug.
>
> It really was intentional, because the use case I see for AUTOREMOVE (and
> the only one to be honest) is when the link is created by the consumer
> probe in which case it wants to avoid worrying about the cleanup part.
>
> Which also is applicable to the cleanup when the probe fails IMO.
You're right, makes sense.
> > > +void device_links_unbind_consumers(struct device *dev)
> > > +{
> > > + struct device_link *link;
> > > + int idx;
> > > +
> > > + start:
> > > + idx = device_links_read_lock();
> > > +
> > > + list_for_each_entry_rcu(link, &dev->links_to_consumers, s_node) {
> > > + enum device_link_status status;
> > > +
> > > + if (link->flags & DEVICE_LINK_STATELESS)
> > > + continue;
> > > +
> > > + spin_lock(&link->lock);
> > > + status = link->status;
> > > + if (status == DEVICE_LINK_CONSUMER_PROBE) {
> > > + spin_unlock(&link->lock);
> > > +
> > > + device_links_read_unlock(idx);
> > > +
> > > + wait_for_device_probe();
> > > + goto start;
> > > + }
> > > + link->status = DEVICE_LINK_SUPPLIER_UNBIND;
> > > + if (status == DEVICE_LINK_ACTIVE) {
> > > + struct device *consumer = link->consumer;
> > > +
> > > + get_device(consumer);
> > > + spin_unlock(&link->lock);
> >
> > The lock is released both at the beginning of this if-block and
> > immediately after the if-block (in case the if-condition is false).
> > Why not simply release the lock *before* the if-block?
>
> Because the get_device() needs to be done under the lock.
According to the commit message, the spinlock only protects the status
field and the consumer device is prevented from disappearing with the RCU.
So the spin lock could be released before the if-block AFAICS.
(But perhaps there are style/readability reasons to have the unlock both
in the if-block and afterwards.)
> > > @@ -1233,6 +1680,7 @@ void device_del(struct device *dev)
> > > {
> > > struct device *parent = dev->parent;
> > > struct class_interface *class_intf;
> > > + struct device_link *link, *ln;
> > >
> > > /* Notify clients of device removal. This call must come
> > > * before dpm_sysfs_remove().
> > > @@ -1240,6 +1688,30 @@ void device_del(struct device *dev)
> > > if (dev->bus)
> > > blocking_notifier_call_chain(&dev->bus->p->bus_notifier,
> > > BUS_NOTIFY_DEL_DEVICE, dev);
> > > +
> > > + /*
> > > + * Delete all of the remaining links from this device to any other
> > > + * devices (either consumers or suppliers).
> > > + *
> > > + * This requires that all links be dormant, so warn if that's no the
> > > + * case.
> > > + */
> > > + mutex_lock(&device_links_lock);
> > > +
> > > + list_for_each_entry_safe_reverse(link, ln, &dev->links_to_suppliers, c_node) {
> > > + WARN_ON(link->status != DEVICE_LINK_DORMANT &&
> > > + !(link->flags & DEVICE_LINK_STATELESS));
> > > + __device_link_del(link);
> > > + }
> >
> > Shouldn't it also be legal for the supplier links to be in
> > DEVICE_LINK_AVAILABLE state upon removal of a consumer device?
> >
> > (And perhaps also DEVICE_LINK_SUPPLIER_UNBIND?)
> >
> > Looks like a bug.
>
> But this is done after removing the supplier driver, so the state should be
> DORMANT (unless the link is stateless), shouldn't it?
The scenario I have in mind is that the supplier device is bound to a
driver and the consumer device has no driver and is being removed.
In that case the status will be DEVICE_LINK_AVAILABLE and the user
will get a WARN splat, which seems gratuitous because it should be legal.
And the other scenario is when the supplier is unbinding. It iterates
over the links to consumers and puts them in DEVICE_LINK_SUPPLIER_UNBIND.
Let's say the link to consumer A was put into that state, but there's
a consumer B remaining which is bound. The RCU and spinlock are unlocked
before device_release_driver_internal() is called for that consumer.
If at that point consumer device A is removed for whatever reason,
the link will also be removed and the user will again get a gratuitous
WARN splat.
Thanks,
Lukas
next prev parent reply other threads:[~2016-09-26 16:51 UTC|newest]
Thread overview: 138+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-09-08 21:25 [RFC/RFT][PATCH v2 0/7] Functional dependencies between devices Rafael J. Wysocki
2016-09-08 21:26 ` [RFC/RFT][PATCH v2 1/7] driver core: Add a wrapper around __device_release_driver() Rafael J. Wysocki
2016-09-08 21:27 ` [RFC/RFT][PATCH v2 2/7] driver core: Functional dependencies tracking support Rafael J. Wysocki
2016-09-09 8:25 ` Ulf Hansson
2016-09-09 12:06 ` Mark Brown
2016-09-09 14:13 ` Ulf Hansson
2016-09-15 1:11 ` Rafael J. Wysocki
2016-09-11 13:40 ` Lukas Wunner
2016-09-11 20:43 ` Lukas Wunner
2016-09-14 1:21 ` Rafael J. Wysocki
2016-09-14 8:28 ` Lukas Wunner
2016-09-14 13:17 ` Rafael J. Wysocki
2016-09-08 21:28 ` [RFC/RFT][PATCH v2 3/7] PM / sleep: Make async suspend/resume of devices use device links Rafael J. Wysocki
2016-09-10 13:31 ` Lukas Wunner
2016-09-10 22:12 ` Rafael J. Wysocki
2016-09-08 21:29 ` [RFC/RFT][PATCH v2 4/7] PM / runtime: Pass flags argument to __pm_runtime_disable() Rafael J. Wysocki
2016-09-08 21:29 ` [RFC/RFT][PATCH v2 5/7] PM / runtime: Flag to indicate PM sleep transitions in progress Rafael J. Wysocki
2016-09-12 14:07 ` Lukas Wunner
2016-09-12 21:25 ` Rafael J. Wysocki
2016-09-12 22:52 ` Lukas Wunner
2016-09-13 7:21 ` Marek Szyprowski
2016-09-13 23:59 ` Rafael J. Wysocki
2016-09-08 21:30 ` [RFC/RFT][PATCH v2 6/7] PM / runtime: Use device links Rafael J. Wysocki
2016-09-12 9:47 ` Lukas Wunner
2016-09-12 13:57 ` Rafael J. Wysocki
2016-09-14 1:19 ` Rafael J. Wysocki
2016-09-08 21:31 ` [RFC/RFT][PATCH v2 7/7] PM / runtime: Optimize the use of " Rafael J. Wysocki
2016-09-08 21:35 ` [RFC/RFT][PATCH v2 0/7] Functional dependencies between devices Rafael J. Wysocki
2016-09-10 11:39 ` Lukas Wunner
2016-09-10 22:04 ` Rafael J. Wysocki
2016-09-13 17:57 ` Lukas Wunner
2016-09-13 23:18 ` Rafael J. Wysocki
2016-09-18 12:39 ` Lukas Wunner
[not found] ` <CGME20160913095858eucas1p267ec2397c9e4577f94557e4a38498164@eucas1p2.samsung.com>
2016-09-13 9:58 ` Marek Szyprowski
2016-09-13 22:41 ` Rafael J. Wysocki
2016-09-18 11:23 ` Lukas Wunner
2016-09-15 22:03 ` [RFC/RFT][PATCH v3 0/5] " Rafael J. Wysocki
2016-09-15 22:04 ` [Resend][RFC/RFT][PATCH v3 1/5] driver core: Add a wrapper around __device_release_driver() Rafael J. Wysocki
2016-09-15 22:06 ` [RFC/RFT][PATCH v3 2/5] driver core: Functional dependencies tracking support Rafael J. Wysocki
2016-09-16 7:53 ` Marek Szyprowski
2016-09-16 12:06 ` Rafael J. Wysocki
2016-09-16 12:33 ` [Update][RFC/RFT][PATCH " Rafael J. Wysocki
2016-09-19 22:46 ` Lukas Wunner
2016-09-23 13:03 ` Lukas Wunner
2016-09-23 13:42 ` Rafael J. Wysocki
2016-09-26 16:51 ` Lukas Wunner [this message]
2016-09-27 12:16 ` Rafael J. Wysocki
2016-09-27 8:54 ` Lukas Wunner
2016-09-27 11:52 ` Rafael J. Wysocki
2016-09-28 10:43 ` Lukas Wunner
2016-09-28 11:31 ` Rafael J. Wysocki
2016-09-29 10:36 ` Lukas Wunner
2016-09-15 22:06 ` [RFC/RFT][PATCH v3 3/5] PM / sleep: Make async suspend/resume of devices use device links Rafael J. Wysocki
2016-09-15 22:07 ` [RFC/RFT][PATCH v3 4/5] PM / runtime: Use " Rafael J. Wysocki
2016-09-15 22:07 ` [RFC/RFT][PATCH v3 5/5] PM / runtime: Optimize the use of " Rafael J. Wysocki
2016-09-16 7:25 ` [RFC/RFT][PATCH v3 0/5] Functional dependencies between devices Marek Szyprowski
2016-09-16 7:57 ` Marek Szyprowski
2016-09-16 12:04 ` Rafael J. Wysocki
2016-09-27 12:34 ` Lukas Wunner
2016-09-28 0:33 ` Rafael J. Wysocki
2016-09-28 11:42 ` Lukas Wunner
2016-09-29 0:51 ` Rafael J. Wysocki
2016-11-15 18:50 ` Lukas Wunner
2016-09-29 0:24 ` [PATCH v4 " Rafael J. Wysocki
2016-09-29 0:25 ` [Resend][PATCH v4 1/5] driver core: Add a wrapper around __device_release_driver() Rafael J. Wysocki
2016-09-29 0:38 ` [PATCH v4 2/5] driver core: Functional dependencies tracking support Rafael J. Wysocki
2016-10-01 7:43 ` Lukas Wunner
2016-10-01 23:32 ` Rafael J. Wysocki
2016-09-29 0:38 ` [Resend][PATCH v4 3/5] PM / sleep: Make async suspend/resume of devices use device links Rafael J. Wysocki
2016-09-29 0:40 ` [PATCH v4 4/5] PM / runtime: Use " Rafael J. Wysocki
2016-09-29 0:41 ` [Rebase][PATCH v4 5/5] PM / runtime: Optimize the use of " Rafael J. Wysocki
2016-09-29 6:58 ` [PATCH v4 0/5] Functional dependencies between devices Marek Szyprowski
2016-09-29 12:27 ` Rafael J. Wysocki
2016-10-02 23:13 ` Lukas Wunner
2016-10-10 12:36 ` [PATCH v5 " Rafael J. Wysocki
2016-10-10 12:37 ` [Resend][PATCH v5 1/5] driver core: Add a wrapper around __device_release_driver() Rafael J. Wysocki
2016-10-10 12:51 ` [PATCH v5 2/5] driver core: Functional dependencies tracking support Rafael J. Wysocki
2016-10-26 11:19 ` Lukas Wunner
2016-10-27 15:25 ` Greg Kroah-Hartman
2016-10-28 9:57 ` Lukas Wunner
2016-11-07 21:22 ` Luis R. Rodriguez
2016-11-08 6:45 ` Greg Kroah-Hartman
2016-11-08 19:21 ` Luis R. Rodriguez
2016-11-08 19:43 ` Greg Kroah-Hartman
2016-11-08 20:58 ` Luis R. Rodriguez
2016-11-09 6:45 ` Greg Kroah-Hartman
2016-11-09 9:36 ` Andrzej Hajda
2016-11-09 9:41 ` Greg Kroah-Hartman
2016-11-13 16:58 ` Lukas Wunner
2016-11-10 0:43 ` Rafael J. Wysocki
2016-11-10 0:59 ` Luis R. Rodriguez
2016-11-10 7:14 ` Laurent Pinchart
2016-11-10 22:04 ` Luis R. Rodriguez
2016-11-10 22:40 ` Greg Kroah-Hartman
2016-11-11 0:08 ` Laurent Pinchart
2016-11-13 10:59 ` Greg Kroah-Hartman
2016-11-14 14:50 ` Luis R. Rodriguez
2016-11-14 8:15 ` Geert Uytterhoeven
2016-11-10 8:46 ` Geert Uytterhoeven
2016-11-10 22:12 ` Luis R. Rodriguez
2016-10-27 15:32 ` Greg Kroah-Hartman
2016-11-07 21:39 ` Luis R. Rodriguez
2016-11-10 1:07 ` Rafael J. Wysocki
2016-11-10 7:05 ` Laurent Pinchart
2016-11-10 23:09 ` Luis R. Rodriguez
2016-11-13 17:34 ` Lukas Wunner
2016-11-14 13:48 ` Luis R. Rodriguez
2016-11-14 15:48 ` Lukas Wunner
2016-11-14 16:00 ` Luis R. Rodriguez
2016-10-10 12:54 ` [PATCH v5 3/5] PM / sleep: Make async suspend/resume of devices use device links Rafael J. Wysocki
2016-10-10 12:56 ` [PATCH v5 4/5] PM / runtime: Use " Rafael J. Wysocki
2016-10-20 13:17 ` [Update][PATCH " Rafael J. Wysocki
2016-10-10 12:57 ` [Rebase][PATCH v5 5/5] PM / runtime: Optimize the use of " Rafael J. Wysocki
2016-10-18 10:46 ` [PATCH v5 0/5] Functional dependencies between devices Marek Szyprowski
2016-10-19 11:57 ` Rafael J. Wysocki
2016-10-20 10:21 ` Marek Szyprowski
2016-10-20 12:54 ` Rafael J. Wysocki
2016-10-27 15:32 ` Greg Kroah-Hartman
[not found] ` <5811F0CF.5000204@huawei.com>
2016-10-28 9:39 ` Lukas Wunner
2016-11-02 20:55 ` Hanjun Guo
2016-10-30 16:22 ` [PATCH v6 " Rafael J. Wysocki
2016-10-30 16:28 ` [Resend][PATCH v6 3/5] PM / sleep: Make async suspend/resume of devices use device links Rafael J. Wysocki
2016-10-30 16:29 ` [Resend][PATCH v6 1/5] driver core: Add a wrapper around __device_release_driver() Rafael J. Wysocki
2016-10-30 16:32 ` [PATCH v6 2/5] driver core: Functional dependencies tracking support Rafael J. Wysocki
2016-10-30 16:32 ` [PATCH v6 4/5] PM / runtime: Use device links Rafael J. Wysocki
2016-12-18 14:01 ` Lukas Wunner
2016-12-18 15:53 ` Rafael J. Wysocki
2016-12-18 16:37 ` Lukas Wunner
2016-12-19 12:38 ` Rafael J. Wysocki
2016-10-30 16:32 ` [Resend][PATCH v6 5/5] PM / runtime: Optimize the use of " Rafael J. Wysocki
2016-10-30 16:40 ` [PATCH v6 0/5] Functional dependencies between devices Rafael J. Wysocki
2016-10-31 17:47 ` Greg Kroah-Hartman
2016-11-01 3:50 ` Rafael J. Wysocki
2016-11-02 7:58 ` Marek Szyprowski
2016-11-05 12:10 ` Greg Kroah-Hartman
2016-11-07 21:15 ` Luis R. Rodriguez
2016-11-08 6:36 ` Marek Szyprowski
2016-11-08 20:14 ` Luis R. Rodriguez
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=20160926165121.GA5353@wunner.de \
--to=lukas@wunner.de \
--cc=broonie@kernel.org \
--cc=gregkh@linuxfoundation.org \
--cc=khilman@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=m.szyprowski@samsung.com \
--cc=mcgrof@suse.com \
--cc=rjw@rjwysocki.net \
--cc=stern@rowland.harvard.edu \
--cc=tomeu.vizoso@collabora.com \
--cc=ulf.hansson@linaro.org \
/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;
as well as URLs for NNTP newsgroup(s).