Thread (18 messages) flat view 18 messages, 4 authors, 2021-01-12

Re: 5.11-rc device reordering breaks ThinkPad rmi4 suspend

From: "Rafael J. Wysocki" <rafael@kernel.org>
Date: 2021-01-12 12:45:00
Also in: lkml

On Mon, Jan 11, 2021 at 11:44 PM Saravana Kannan [off-list ref] wrote:
On Mon, Jan 11, 2021 at 8:57 AM Rafael J. Wysocki [off-list ref] wrote:
quoted
On Mon, Jan 11, 2021 at 5:12 PM Thierry Reding [off-list ref] wrote:
quoted
On Mon, Jan 11, 2021 at 03:57:37PM +0100, Rafael J. Wysocki wrote:
quoted
On Mon, Jan 11, 2021 at 2:43 PM Thierry Reding [off-list ref] wrote:
quoted
On Sun, Jan 10, 2021 at 08:44:13PM -0800, Hugh Dickins wrote:
quoted
Hi Rafael,

Synaptics RMI4 SMBus touchpad on ThinkPad X1 Carbon (5th generation)
fails to suspend when running 5.11-rc kernels: bisected to
5b6164d3465f ("driver core: Reorder devices on successful probe"),
and reverting that fixes it.  dmesg.xz attached, but go ahead and ask
me to switch on a debug option to extract further info if that may help.
Hi Hugh,

Quoting what I think are the relevant parts of that log:

[   34.373742] printk: Suspending console(s) (use no_console_suspend to debug)
[   34.429015] rmi4_physical rmi4-00: Failed to read irqs, code=-6
[   34.474973] rmi4_f01 rmi4-00.fn01: Failed to write sleep mode: -6.
[   34.474994] rmi4_f01 rmi4-00.fn01: Suspend failed with code -6.
[   34.475001] rmi4_physical rmi4-00: Failed to suspend functions: -6
[   34.475105] rmi4_smbus 6-002c: Failed to suspend device: -6
[   34.475113] PM: dpm_run_callback(): rmi_smb_suspend+0x0/0x3c returns -6
[   34.475130] PM: Device 6-002c failed to suspend: error -6
[   34.475187] PM: Some devices failed to suspend, or early wake event detected
[   34.480324] rmi4_f03 rmi4-00.fn03: rmi_f03_pt_write: Failed to write to F03 TX register (-6).
[   34.480748] rmi4_f03 rmi4-00.fn03: rmi_f03_pt_write: Failed to write to F03 TX register (-6).
[   34.481558] rmi4_physical rmi4-00: rmi_driver_clear_irq_bits: Failed to change enabled interrupts!
[   34.487935] acpi LNXPOWER:02: Turning OFF
[   34.488707] acpi LNXPOWER:01: Turning OFF
[   34.489554] rmi4_physical rmi4-00: rmi_driver_set_irq_bits: Failed to change enabled interrupts!
[   34.489669] psmouse: probe of serio2 failed with error -1
[   34.489882] OOM killer enabled.
[   34.489891] Restarting tasks ... done.
[   34.589183] PM: suspend exit
[   34.589839] PM: suspend entry (s2idle)
[   34.605884] Filesystems sync: 0.017 seconds
[   34.607594] Freezing user space processes ... (elapsed 0.006 seconds) done.
[   34.613645] OOM killer disabled.
[   34.613650] Freezing remaining freezable tasks ... (elapsed 0.001 seconds) done.
[   34.615482] printk: Suspending console(s) (use no_console_suspend to debug)
[   34.653097] rmi4_f01 rmi4-00.fn01: Failed to write sleep mode: -6.
[   34.653108] rmi4_f01 rmi4-00.fn01: Suspend failed with code -6.
[   34.653115] rmi4_physical rmi4-00: Failed to suspend functions: -6
[   34.653123] rmi4_smbus 6-002c: Failed to suspend device: -6
[   34.653129] PM: dpm_run_callback(): rmi_smb_suspend+0x0/0x3c returns -6
[   34.653160] PM: Device 6-002c failed to suspend: error -6
[   34.653174] PM: Some devices failed to suspend, or early wake event detected
[   34.660515] OOM killer enabled.
[   34.660524] Restarting tasks ...
[   34.661456] rmi4_physical rmi4-00: rmi_driver_set_irq_bits: Failed to change enabled interrupts!
[   34.661591] psmouse: probe of serio2 failed with error -1
[   34.669469] done.
[   34.748386] PM: suspend exit

I think what might be happening here is that the offending patch causes
some devices to be reordered in a way different to how they were ordered
originally and the rmi4 driver currently depends on that implicit order.
Actually, the only possible case in which the commit in question can
introduce suspend failures like this is when some dependency
information is missing and so the reordering causes the ordering to
change from the (working) implicit one.
quoted
Interestingly one of the bugs that the offending patch fixes is similar
in the failure mode but for the reverse reason: the implicit order
causes suspend/resume to fail.
And that happens because some dependency information is missing.

So we have failing cases when dependency information is missing, so
instead of fixing those we have tried to make the core change the
ordering after every successful probe in the hope that this will take
care of the problem without introducing new breakage.

However, it evidently has introduced new breakage and in order to fix
it we need to figure out what dependency information is missing in the
failing cases and put that information in, but we may as well do the
same for the cases that are failing without the offending change.

So why don't we revert the commit in question and do just that?
Unfortunately it isn't that easy. In fact, all the dependency
information already exists in the case that I cited in 5b6164d3465f
("driver core: Reorder devices on successful probe"), but it's the
driver core that suspends/resumes the devices in the wrong order.

The reason is because the ACONNECT device depends on the BPMP device
(via a power-domains property), but it's also instantiated before the
BPMP device (because it is listed earlier in device tree, which is
sorted by unit-address first, then alphabetically). BPMP being a CPU
non-addressable device it doesn't have a unit-address and hence is
listed very late in device tree (by convention). Normally this is would
not be a problem because deferred probe would take care of it. But there
is one corner-case which happens when the BPMP is built into the kernel
(which it usually is, as it provides access to resources necessary for
booting, such as clocks and resets) and ACONNECT is built as a loadable
module. In that case, BPMP gets probed before ACONNECT and hence when
ACONNECT does eventually get loaded, the BPMP is already there, meaning
ACONNECT won't defer probe and hence the DPM suspend/resume order is not
fixed up by the deferred probe code.
What about using a device link to enforce the right ordering, then?

Deferred probing is not a way to ensure the suitable suspend/resume ordering.
Thierry,

Can you try booting with fw_devlink=on with this series? It's queued
up for 5.12-rc1
https://lore.kernel.org/lkml/20201218031703.3053753-1-saravanak@google.com/ (local)

It might solve your issue, but I think your patch still addresses a real issue.
quoted
quoted
And that's precisely what the offending commit addresses. However, the
downside is, and we did discuss this during review, that it operates
under the (somewhat optimistic) assumption that all the dependency
information exists. This is because reordering on successful probe can
potentially introduce regressions for dependencies that were previously
implicit. So if a system has component B that depends on component A but
doesn't model that dependency via some child/parent relationship or an
explicit relationship that would be flagged by deferred probe,
Again, deferred probing may not help here.
quoted
then this implicit dependency can break by the new reordering on successful probe.

I very much suspect that that's exactly what's going on here. This RMI4
device very likely implicitly depends on some other resource getting
enabled but doesn't properly model that dependency. If we find out what
that dependency is and return -EPROBE_DEFER when that dependency has not
probed yet, then deferred probe will automatically take care of ordering
everything correctly again (or, in fact, ordering by successful probe
will take care of it already because RMI4 would initially fail with
-EPROBE_DEFER).

Adding Vincent, Jason, Andrew and Lucas (who have recently worked on
this driver), perhaps they have some better understanding of what
missing dependencies might be causing the above errors.
IMV it is a mistake to believe that deferred probing can get
everything right for you in every case, with or without the offending
commit.  Sometimes you need to tell the core what the right ordering
is and that's what device links are for.
IMHO, Thierry's patch is the right way to imply dependencies when
device links aren't explicitly calling out dependencies. It's not
really depending on deferred probe to imply dependency order. Rather,
it's saying that the order in which devices probe is a better way to
imply dependency than relying on the order in which devices are added.
Well, it breaks existing setups.

Moreover, I'm not really convinced that it is a better way to "imply
dependencies", it is just different.
For Thierry's case, fw_devlink=on might solve his problem, but that's
solving the problem by explicitly calling out the dependency (by
getting it from DT where the dependency is explicitly called out). For
implicit cases, we still need his patch. I wonder how
The "implicit" cases are all broken potentially, because the dpm_list
ordering only matters for the order in which PM sleep callbacks are
invoked, and that doesn't help if they are async and it is meaningless
for runtime PM.
quoted
As it stands today, that commit doesn't improve the situation and it
adds overhead and complexity.
I'm okay if we revert it for now, but that doesn't solve the
overarching ordering issues though.
No, it doesn't and the commit doesn't solve it either which is my point.

The situation before and after the commit is generally the same, even
though the set of affected systems is different in each case, so
because the general strategy of the kernel development is to avoid new
breakage, it should be reverted.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help