linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "Rafael J. Wysocki" <rjw@rjwysocki.net>
To: Lukas Wunner <lukas@wunner.de>
Cc: "Rafael J. Wysocki" <rafael@kernel.org>,
	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: [RFC/RFT][PATCH v2 0/7] Functional dependencies between devices
Date: Wed, 14 Sep 2016 01:18:16 +0200	[thread overview]
Message-ID: <4860126.rVrMyhOcY1@vostro.rjw.lan> (raw)
In-Reply-To: <20160913175731.GA1393@wunner.de>

On Tuesday, September 13, 2016 07:57:31 PM Lukas Wunner wrote:
> On Sun, Sep 11, 2016 at 12:04:36AM +0200, Rafael J. Wysocki wrote:
> > On Sat, Sep 10, 2016 at 1:39 PM, Lukas Wunner <lukas@wunner.de> wrote:
> > > On Thu, Sep 08, 2016 at 11:25:44PM +0200, Rafael J. Wysocki wrote:
> > >> As discussed in the recent "On-demand device probing" thread and in a
> > >> Kernel Summit session earlier today, there is a problem with handling
> > >> cases where functional dependencies between devices are involved.
> > >>
> > >> What I mean by a "functional dependency" is when the driver of device B
> > >> needs both device A and its driver to be present and functional to be
> > >> able to work.  This implies that the driver of A needs to be working
> > >> for B to be probed successfully and it cannot be unbound from the
> > >> device before the B's driver.  This also has certain consequences for
> > >> power management of these devices (suspend/resume and runtime PM
> > >> ordering).
> > >
> > > As a general observation, this series seems to conflate two
> > > separate issues:
> > >
> > > (a) non-hierarchical device dependencies
> > >     (a device depends on another device which is not its parent
> > >     with regards to (runtime) suspend/resume ordering)
> > 
> > You need to say what it means that one device depends on another one.
> > Without that you don't get anything useful.
> 
> As stated above, what it means is that "a device depends on another device
> with regards to (runtime) suspend/resume ordering".

But this series isn't only about suspend/resume, which seems to be your point,
right?

> > > (b) driver-presence dependencies
> > >     (a device depends on another device to be bound to a driver
> > >     before it can probe / must be unbound before the other device
> > >     can unbind)
> > >
> > > Those two issues are orthogonal.
> > 
> > No, they aren't.
> > 
> > At least for a number of devices (quite likely it would be safe to say
> > that for the majority of them I think) the supplier can only provide
> 
> You got numbers to back up the majority claim?

This isn't a claim (which is why I said "quite likely" and so on).

I have examples, though.  I2C/SPI/GPIO controllers providing connections/pins
to devices that aren't their children, IOMMUs.

> > any useful service to its consumers when it has a driver bound to it
> > and running and the consumers cannot operate correctly without that
> > service.  That's why the "unbind consumers before unbinding the
> > supplier" logic is in there.
> > 
> > And in the context of this series a "dependency" boils down to the
> > ordering of execution of callbacks of certain type.  Like, for
> > example, "can I execute ->runtime_suspend() for device A before
> > executing it for device B?"  If there's a link between A and B where
> > the former is the supplier, the answer is "no".  The reason why is the
> > assumption that after ->runtime_suspend() A will stop responding and
> > will not be able to provide the service in question to B any more.
> > 
> > Likewise, if the driver of A goes away, this device will not be able
> > to provide the service in question to B any more, so it doesn't make
> > sense for the driver of B to still be running then.
> > 
> > This is the case I wanted to cover with this series if it was not clear
> > before.
> 
> That much was clear to me. I maintain that dependency with regards to
> suspend/resume ordering and dependency with regards to driver presence
> are two different things. The case you wanted to cover just happens to
> be a combination of the two. The series would be more useful if either
> type of dependency could be achieved without gratuitously also getting
> the other type.

It looks like you're referring to the previous iteration of the series here.

> You could make the case that providing two separate APIs seems
> wasteful since it would increase the amount of code and sometimes
> both types of dependency are required at the same time anyway.
> That would be a valid argument.

Well, that was my thinking, but I guess it wasn't clearly stated.

Maybe except that IMO it is "sometimes one type of the dependency is not
required" rather than the other way around.

> But you should design the API thus that either dependency type is optional.
> 
> Providing just dependency with regards to suspend/resume ordering
> should be as simple as adding a "DEVICE_LINKS_DRIVER_DONT_CARE" flag.
> Then the various calls that you're adding in dd.c would only have to
> be called if the flag isn't set, same for the various places where
> you check the link state.

OK, fair enough.  But that could be added later too.

> > Of course, you don't like what device_links_unbind_consumers() does
> > because of your "Thunderbolt on Macs" use case, but guess what,
> 
> To name a different use case: On hybrid graphics laptops, the discrete
> GPU usually includes an HDA controller for external HDMI displays.
> The GPU and the HDA controllers are siblings (functions 0 and 1 of a
> PCI slot), yet in many laptops power is cut to both devices when _PS3
> is executed for the GPU function. Currently we have a kludge where
> the HDA controller is suspended before the GPU is powered down
> (see vga_switcheroo_init_domain_pm_optimus_hdmi_audio()).
> 
> I envision the HDA controller to be a consumer of the GPU in those
> cases, thus ensuring that it's suspended before power is cut.

So this example isn't a good one IMO.  That clearly is a case when two
(or more) devices share power resources controlled by a single on/off
switch.  Which is a clear use case for a PM domain.

> The way your series works right now, the HDA controller can't be
> bound unless the GPU is bound. That restriction is unnecessary.

That depends on when the link is created, actually.  If the link is created
in the "active" state from the supplier probe, there's no such restriction
AFAICS.

The restriction is only there if (a) that is a permanent link and (b) it
was created before probing both the supplier and the consumer.

> I've also heard from the i915 folks that on some Intel chipsets, the
> integrated HDA controller depends on power wells that are controlled
> by the integrated GPU. I'm not sure if a driver for the GPU needs
> to be present in this use case.
> 
> 
> > you can add a link flag to keep the consumer around when the supplier
> > driver goes away.  I just don't want that to be the default behavior.
> 
> I assume you're referring to the DEVICE_LINK_PERSISTENT flag and that
> a separate patch is needed to make this work, as you've pointed out
> in your e-mail of Sep 7.

No, I'm not.  I was thinking about something like the DEVICE_LINKS_DRIVER_DONT_CARE
you mentioned above.  It would be easy enough to add on top of this series,
but I can put it in there if you insist.

> According to the commit message, such links need to be added before
> the consumer probes, which I fear will require addition of PCI quirks.
> That's not very pretty, a DEVICE_LINKS_DRIVER_DONT_CARE flag would
> seem preferrable.

The commit message may be outdated.

With the series as is you can create a link in (almost) any state from
anywhere.

> > > E.g. a driver-presence dependency may exist between a child and a
> > > parent, or between siblings, whereas a non-hierarchical device
> > > dependency by definition cannot exist between child/parent.
> > >
> > > Let's say I need a driver-presence dependency between parent/child.
> > > The PM core already guarantees correct (runtime) suspend/resume
> > > ordering between child. Device links duplicate that functionality.
> > > Oops?
> > 
> > No, they don't and that should be clear.
> > 
> > They are for out-of-the-tree dependencies only and the parent-child
> > one is *in* the tree.
> 
> I'm sure there are situations where a driver presence dependency
> is needed between parent/child and you should fully expect that
> developers will try to employ device links for these use cases.
> Which means that the code for suspend/resume device ordering is
> executed twice.

Creating a link between a parent and child would be a bug.  I guess
device_link_add() should just return NULL on an attempt to do that.

Thanks,
Rafael

  reply	other threads:[~2016-09-13 23:12 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 [this message]
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
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=4860126.rVrMyhOcY1@vostro.rjw.lan \
    --to=rjw@rjwysocki.net \
    --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=lukas@wunner.de \
    --cc=m.szyprowski@samsung.com \
    --cc=mcgrof@suse.com \
    --cc=rafael@kernel.org \
    --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).