From: Lukas Wunner <lukas-JFq808J9C/izQB+pC5nmwQ@public.gmane.org>
To: Lyude Paul <lyude-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
Cc: linux-pm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
David Airlie <airlied-cv59FeDIM0c@public.gmane.org>,
nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org,
linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org,
Ben Skeggs <bskeggs-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
Subject: Re: [PATCH 1/5] drm/nouveau: Prevent RPM callback recursion in suspend/resume paths
Date: Wed, 18 Jul 2018 09:47:10 +0200 [thread overview]
Message-ID: <20180718074710.GA16072@wunner.de> (raw)
In-Reply-To: <2dbe75b1a83c025b9cddc229dbca9af6fb30111e.camel-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
On Tue, Jul 17, 2018 at 02:34:47PM -0400, Lyude Paul wrote:
> On Tue, 2018-07-17 at 20:32 +0200, Lukas Wunner wrote:
> > On Tue, Jul 17, 2018 at 02:24:31PM -0400, Lyude Paul wrote:
> > > On Tue, 2018-07-17 at 20:20 +0200, Lukas Wunner wrote:
> > > > Okay, the PCI device is suspending and the nvkm_i2c_aux_acquire()
> > > > wants it in resumed state, so is waiting forever for the device to
> > > > runtime suspend in order to resume it again immediately afterwards.
> > > >
> > > > The deadlock in the stack trace you've posted could be resolved using
> > > > the technique I used in d61a5c106351 by adding the following to
> > > > include/linux/pm_runtime.h:
> > > >
> > > > static inline bool pm_runtime_status_suspending(struct device *dev)
> > > > {
> > > > return dev->power.runtime_status == RPM_SUSPENDING;
> > > > }
> > > >
> > > > static inline bool is_pm_work(struct device *dev)
> > > > {
> > > > struct work_struct *work = current_work();
> > > >
> > > > return work && work->func == dev->power.work;
> > > > }
> > > >
> > > > Then adding this to nvkm_i2c_aux_acquire():
> > > >
> > > > struct device *dev = pad->i2c->subdev.device->dev;
> > > >
> > > > if (!(is_pm_work(dev) && pm_runtime_status_suspending(dev))) {
> > > > ret = pm_runtime_get_sync(dev);
> > > > if (ret < 0 && ret != -EACCES)
> > > > return ret;
> > > > }
> > > >
> > > > But here's the catch: This only works for an *async* runtime suspend.
> > > > It doesn't work for pm_runtime_put_sync(), pm_runtime_suspend() etc,
> > > > because then the runtime suspend is executed in the context of the caller,
> > > > not in the context of dev->power.work.
[snip]
>
> Something I'm curious about. This isn't the first time I've hit a
> situation like this (see: the improper disable_depth fix I added into
> amdgpu I now need to go and fix), which makes me wonder: is there
> actually any reason Linux's runtime PM core doesn't just turn get/puts()
> in the context of s/r callbacks into no-ops by default?
So the PM core could save a pointer to the "current" task_struct
in struct device before invoking the ->runtime_suspend or
->runtime_resume callback, and all subsequent rpm_resume() and
rpm_suspend() calls could then become no-ops if "current" is
equivalent to the saved pointer. (This is also how you could
solve the deadlock you're dealing with for sync suspend.)
For a recursive resume during a resume or a recursive suspend
during a suspend, this might actually be fine.
For a recursive suspend during a resume or a recursive resume
during a suspend, things become murkier: How should the PM core
know if the particular part of the device is still accessible
when hitting a recursive resume during a suspend? Let's say a
clock is needed for i2c. Then the recursive resume during a
suspend may only become a no-op before that clock has been
turned off. That's something only the device driver itself
has knowledge about, because it implements the order in which
subdevices of the GPU are turned off.
Lukas
_______________________________________________
Nouveau mailing list
Nouveau@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/nouveau
next prev parent reply other threads:[~2018-07-18 7:47 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20180716235936.11268-1-lyude@redhat.com>
[not found] ` <20180716235936.11268-2-lyude@redhat.com>
2018-07-17 7:16 ` [Nouveau] [PATCH 1/5] drm/nouveau: Prevent RPM callback recursion in suspend/resume paths Lukas Wunner
[not found] ` <20180717071641.GA5411-JFq808J9C/izQB+pC5nmwQ@public.gmane.org>
2018-07-17 7:39 ` Rafael J. Wysocki
2018-07-17 16:53 ` [Nouveau] " Lyude Paul
[not found] ` <d7c25a7f41df70685c0c4726315592d1d9b561ff.camel-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2018-07-17 18:20 ` Lukas Wunner
[not found] ` <20180717182041.GA18363-JFq808J9C/izQB+pC5nmwQ@public.gmane.org>
2018-07-17 18:24 ` Lyude Paul
2018-07-17 18:32 ` [Nouveau] " Lukas Wunner
2018-07-17 18:34 ` Lyude Paul
[not found] ` <2dbe75b1a83c025b9cddc229dbca9af6fb30111e.camel-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2018-07-18 7:40 ` Rafael J. Wysocki
2018-07-18 7:47 ` Lukas Wunner [this message]
2018-07-18 7:38 ` Rafael J. Wysocki
[not found] ` <CAJZ5v0g8O8J0U8V-gLMe+NnTd3xgZ5_pjr9p2oci7yAfW54B-A-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2018-07-18 8:25 ` Lukas Wunner
[not found] ` <20180718082505.GB16072-JFq808J9C/izQB+pC5nmwQ@public.gmane.org>
2018-07-18 8:35 ` Rafael J. Wysocki
2018-07-18 8:36 ` [Nouveau] " Lukas Wunner
2018-07-18 20:11 ` Lyude Paul
[not found] ` <2724dd5eee8a1e4e523e43915fa184ad5afe1c59.camel-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2018-07-18 21:49 ` Rafael J. Wysocki
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=20180718074710.GA16072@wunner.de \
--to=lukas-jfq808j9c/izqb+pc5nmwq@public.gmane.org \
--cc=airlied-cv59FeDIM0c@public.gmane.org \
--cc=bskeggs-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org \
--cc=dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org \
--cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linux-pm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=lyude-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org \
--cc=nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.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).