From: Thierry Reding <thierry.reding@gmail.com>
To: Tobias Jakobi <tjakobi@math.uni-bielefeld.de>
Cc: linux-samsung-soc@vger.kernel.org,
Tomasz Stanislawski <t.stanislaws@samsung.com>,
dri-devel@lists.freedesktop.org
Subject: Re: drm: exynos: mixer: fix using usleep() in atomic context
Date: Wed, 17 Dec 2014 08:54:36 +0100 [thread overview]
Message-ID: <20141217075433.GA2814@ulmo> (raw)
In-Reply-To: <7454d0630d95195d41c3906637e223af@math.uni-bielefeld.de>
[-- Attachment #1: Type: text/plain, Size: 3017 bytes --]
On Mon, Dec 01, 2014 at 05:16:17PM +0100, Tobias Jakobi wrote:
> On 2014-12-01 16:54, Thierry Reding wrote:
> >On Sun, Nov 30, 2014 at 01:35:25AM +0100, tjakobi@math.uni-bielefeld.de
> >wrote:
> >>From: Tomasz Stanislawski <t.stanislaws@samsung.com>
> >>
> >>This patch fixes calling usleep_range() after taking reg_slock
> >>using spin_lock_irqsave(). The mdelay() is used instead.
> >>Waiting in atomic context is not the best idea in general.
> >>Hopefully, waiting occurs only when Video Processor fails
> >>to reset correctly.
> >>
> >>Signed-off-by: Tomasz Stanislawski <t.stanislaws@samsung.com>
> >>---
> >> drivers/gpu/drm/exynos/exynos_mixer.c | 2 +-
> >> 1 file changed, 1 insertion(+), 1 deletion(-)
> >>
> >>diff --git a/drivers/gpu/drm/exynos/exynos_mixer.c
> >>b/drivers/gpu/drm/exynos/exynos_mixer.c
> >>index a41c84e..cc7cccc 100644
> >>--- a/drivers/gpu/drm/exynos/exynos_mixer.c
> >>+++ b/drivers/gpu/drm/exynos/exynos_mixer.c
> >>@@ -632,7 +632,7 @@ static void vp_win_reset(struct mixer_context *ctx)
> >> /* waiting until VP_SRESET_PROCESSING is 0 */
> >> if (~vp_reg_read(res, VP_SRESET) & VP_SRESET_PROCESSING)
> >> break;
> >>- usleep_range(10000, 12000);
> >>+ mdelay(10);
> >> }
> >> WARN(tries == 0, "failed to reset Video Processor\n");
> >> }
> >
> >I can't see a reason why you would need to hold the lock around this
> >code. Perhaps a better way to fix this would be to drop the lock before
> >calling vp_win_reset()?
> >
> >Thierry
>
> Hmm, I'm pretty new to spinlocks (only have worked with the usual mutex
> stuff in userspace), but wouldn't that mean that it is then possible for
> mixer_win_reset to execute while a (previous) vp_win_reset is still running?
Indeed it would. I didn't look properly. Looking more closely it seems
the call stack for this looks something like:
vp_win_reset()
mixer_win_reset()
mixer_poweron()
mixer_dpms()
exynos_drm_crtc_dpms()
Which can then be called from two places:
exynos_drm_crtc_commit()
drm_crtc_helper_set_mode()
drm_crtc_helper_set_config()
drm_helper_connector_dpms()
drm_crtc_helper_set_config()
drm_crtc_helper_set_config() itself must be called with the all modeset
locks held, so I don't see a way how vp_win_reset() could be called
concurrently.
Anyway, even if you're still concerned about concurrent accesses to the
register you'd better lock this section with a mutex to avoid excessive
spinning. In fact I think a better option would be to extend the mutex
in mixer_poweron() to encompass the whole function. This currently looks
broken because one process could go to sleep in pm_runtime_get_sync() or
clk_prepare_enable() and another process start running mixer_poweron()
concurrently, getting to the second mutex_lock() sooner than the first
process. So the lock being dropped between checking for ctx->powered and
setting it doesn't actually prevent a race.
Then again, nobody seems to have cared so far...
Thierry
[-- Attachment #2: Type: application/pgp-signature, Size: 819 bytes --]
next prev parent reply other threads:[~2014-12-17 7:54 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-11-30 0:35 drm/exynos: some small forgotten patch tjakobi
2014-11-30 0:35 ` drm: exynos: mixer: fix using usleep() in atomic context tjakobi
2014-12-01 15:54 ` Thierry Reding
2014-12-01 16:16 ` Tobias Jakobi
2014-12-17 7:54 ` Thierry Reding [this message]
2014-12-21 15:04 ` Inki Dae
2015-01-21 22:46 ` Tobias Jakobi
2015-01-22 7:47 ` Seung-Woo Kim
2014-12-09 12:09 ` drm/exynos: some small forgotten patch Inki Dae
2014-12-09 15:36 ` Tobias Jakobi
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=20141217075433.GA2814@ulmo \
--to=thierry.reding@gmail.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=linux-samsung-soc@vger.kernel.org \
--cc=t.stanislaws@samsung.com \
--cc=tjakobi@math.uni-bielefeld.de \
/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