From: Daniel Vetter <daniel@ffwll.ch> To: Ben Widawsky <ben@bwidawsk.net> Cc: Daniel Vetter <daniel.vetter@ffwll.ch>, intel-gfx@lists.freedesktop.org Subject: Re: [PATCH 3/3] drm/i915: close rps work vs. rps disable races Date: Sun, 4 Sep 2011 21:17:24 +0200 Message-ID: <20110904191723.GA2799@phenom.ffwll.local> (raw) In-Reply-To: <20110904172330.GA16313@cloud01> On Sun, Sep 04, 2011 at 05:23:30PM +0000, Ben Widawsky wrote: > On Sun, Sep 04, 2011 at 05:35:02PM +0200, Daniel Vetter wrote: > > The rps disabling code wasn't properly cancelling outstanding work > > items. Also add a comment that explains why we're not racing with > > the work item, that could again unmask interrupts. > > > > This also fixes a bug on module unload because nothing was properly > > syncing up with that work item, possibly leading to it being run after > > freeing dev_priv or removing the module code. > > > > Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> > > --- > > drivers/gpu/drm/i915/intel_display.c | 8 +++++++- > > 1 files changed, 7 insertions(+), 1 deletions(-) > > > > diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c > > index 56a8554..ccd4600 100644 > > --- a/drivers/gpu/drm/i915/intel_display.c > > +++ b/drivers/gpu/drm/i915/intel_display.c > > @@ -7483,10 +7483,16 @@ void gen6_disable_rps(struct drm_device *dev) > > > > I915_WRITE(GEN6_RPNSWREQ, 1 << 31); > > I915_WRITE(GEN6_PMINTRMSK, 0xffffffff); > > - I915_WRITE(GEN6_PMIER, 0); > > + /* Complete PM interrupt masking here doesn't race with the rps work > > + * item again unmasking PM interrupts because that is using PMIMR > > + * (logically sitting atop of PMINTRMSK) to mask interrupts. */ > > + cancel_work_sync(&dev_priv->rps_work); > > > > + /* Clear PMIMR and dev_priv->pm_iir in case outstanding work gets > > + * cancelled before having run. */ > > This comment is wrong, you are clearing PMIER, not IMR. IMR gets cleared > in enable() iirc Bleh, now it's my turn to completely screw it up ;-) Still, I think some comment that we muck around with different registers than the work item would be good. And clearing PMIMR under the lock just for paranoia so that setting dev_priv->pm_iir doesn't leave a strange interrupt mask lingering around > > spin_lock_irq(&dev_priv->rps_lock); > > dev_priv->pm_iir = 0; > > + I915_WRITE(GEN6_PMIER, 0); > > spin_unlock_irq(&dev_priv->rps_lock); > > > > I915_WRITE(GEN6_PMIIR, I915_READ(GEN6_PMIIR)); > I'm not sure this actually fixes a problem. The existing code: > 1. disables all interrupts (no more can occur). > 2. sets pm_iir to 0 safe in rps lock > <workqueues can run at this point, but IMR has no effect with IER = 0> > > I think you should do the cancel work sync somewhere in the code before > module unload (to be correct). I just don't think this fixes a race. Well, we definitely need the cancel_work_sync in the unload path somewhere. I prefer it in the rps disable function. In the context of the other patches my patch description is a bit lousy because I've really only wanted to fix the unload race (and the PMIMR inconsistency) with this patch. -Daniel -- Daniel Vetter Mail: daniel@ffwll.ch Mobile: +41 (0)79 365 57 48
next prev parent reply index Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top 2011-09-04 3:24 [PATCH] drm/i915: Fix rps irq warning Ben Widawsky 2011-09-04 9:03 ` Chris Wilson 2011-09-04 15:49 ` Ben Widawsky 2011-09-04 15:34 ` [PATCH 0/3] slaughter rps races some more Daniel Vetter 2011-09-04 15:35 ` [PATCH 1/3] drm/i915: close PM interrupt masking races in the irq handler Daniel Vetter 2011-09-04 17:09 ` Ben Widawsky 2011-09-04 15:35 ` [PATCH 2/3] drm/i915: close PM interrupt masking races in the rps work func Daniel Vetter 2011-09-04 17:08 ` Ben Widawsky 2011-09-04 19:26 ` Daniel Vetter 2011-09-04 19:56 ` Ben Widawsky 2011-09-04 20:10 ` Daniel Vetter 2011-09-04 21:38 ` Ben Widawsky 2011-09-05 6:38 ` Daniel Vetter 2011-09-05 6:51 ` Ben Widawsky 2011-09-05 12:15 ` Chris Wilson 2011-09-04 15:35 ` [PATCH 3/3] drm/i915: close rps work vs. rps disable races Daniel Vetter 2011-09-04 17:23 ` Ben Widawsky 2011-09-04 19:17 ` Daniel Vetter [this message] 2011-09-04 19:50 ` Ben Widawsky 2011-09-04 19:57 ` Daniel Vetter 2011-09-05 8:15 ` [PATCH] drm/i915: properly cancel rps_work on module unload Daniel Vetter 2011-09-05 17:27 ` Ben Widawsky
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=20110904191723.GA2799@phenom.ffwll.local \ --to=daniel@ffwll.ch \ --cc=ben@bwidawsk.net \ --cc=daniel.vetter@ffwll.ch \ --cc=intel-gfx@lists.freedesktop.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
Intel-GFX Archive on lore.kernel.org Archives are clonable: git clone --mirror https://lore.kernel.org/intel-gfx/0 intel-gfx/git/0.git git clone --mirror https://lore.kernel.org/intel-gfx/1 intel-gfx/git/1.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 intel-gfx intel-gfx/ https://lore.kernel.org/intel-gfx \ intel-gfx@lists.freedesktop.org public-inbox-index intel-gfx Example config snippet for mirrors Newsgroup available over NNTP: nntp://nntp.lore.kernel.org/org.freedesktop.lists.intel-gfx AGPL code for this site: git clone https://public-inbox.org/public-inbox.git