[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <151845781278.18923.259952134307306444@mail.alporthouse.com>
Date: Mon, 12 Feb 2018 17:50:12 +0000
From: Chris Wilson <chris@...is-wilson.co.uk>
To: Lyude Paul <lyude@...hat.com>, "Lukas Wunner" <lukas@...ner.de>,
"Tejun Heo" <tj@...nel.org>,
"Lai Jiangshan" <jiangshanlai@...il.com>,
"Alex Deucher" <alexander.deucher@....com>,
"Dave Airlie" <airlied@...hat.com>,
"Ben Skeggs" <bskeggs@...hat.com>
Cc: "Pierre Moreau" <pierre.morrow@...e.fr>,
"Archit Taneja" <architt@...eaurora.org>,
"Ismo Toijala" <ismo.toijala@...il.com>,
nouveau@...ts.freedesktop.org, intel-gfx@...ts.freedesktop.org,
linux-kernel@...r.kernel.org, dri-devel@...ts.freedesktop.org,
"Hans de Goede" <hdegoede@...hat.com>,
"Peter Wu" <peter@...ensteyn.nl>
Subject: Re: [Intel-gfx] [PATCH 2/5] drm: Allow determining if current task is output
poll worker
Quoting Lyude Paul (2018-02-12 17:46:11)
> On Sun, 2018-02-11 at 10:38 +0100, Lukas Wunner wrote:
> > Introduce a helper to determine if the current task is an output poll
> > worker.
> >
> > This allows us to fix a long-standing deadlock in several DRM drivers
> > wherein the ->runtime_suspend callback waits for the output poll worker
> > to finish and the worker in turn calls a ->detect callback which waits
> > for runtime suspend to finish. The ->detect callback is invoked from
> > multiple call sites and waiting for runtime suspend to finish is the
> > correct thing to do except if it's executing in the context of the
> > worker.
> >
> > Cc: Dave Airlie <airlied@...hat.com>
> > Cc: Ben Skeggs <bskeggs@...hat.com>
> > Cc: Alex Deucher <alexander.deucher@....com>
> > Signed-off-by: Lukas Wunner <lukas@...ner.de>
> > ---
> > drivers/gpu/drm/drm_probe_helper.c | 14 ++++++++++++++
> > include/drm/drm_crtc_helper.h | 1 +
> > 2 files changed, 15 insertions(+)
> >
> > diff --git a/drivers/gpu/drm/drm_probe_helper.c
> > b/drivers/gpu/drm/drm_probe_helper.c
> > index 555fbe54d6e2..019881d15ce1 100644
> > --- a/drivers/gpu/drm/drm_probe_helper.c
> > +++ b/drivers/gpu/drm/drm_probe_helper.c
> > @@ -653,6 +653,20 @@ static void output_poll_execute(struct work_struct
> > *work)
> > schedule_delayed_work(delayed_work,
> > DRM_OUTPUT_POLL_PERIOD);
> > }
> >
> > +/**
> > + * drm_kms_helper_is_poll_worker - is %current task an output poll worker?
> > + *
> > + * Determine if %current task is an output poll worker. This can be used
> > + * to select distinct code paths for output polling versus other contexts.
> > + */
> For this, it would be worth explicitly noting in the comments herethat this
> should be called by DRM drivers in order to prevent racing with hotplug
> polling workers, so that new drivers in the future can avoid implementing this
> race condition in their driver.
>
> > +bool drm_kms_helper_is_poll_worker(void)
> > +{
> > + struct work_struct *work = current_work();
> > +
> > + return work && work->func == output_poll_execute;
What ensures that work is accessible? Does this need rcu_read_lock
protection or more?
-Chris
Powered by blists - more mailing lists