Message ID | 20190212162857.20003-1-bigeasy@linutronix.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | drm/i915/fence: Do not use TIMER_IRQSAFE | expand |
On 2019-02-12 17:28:57 [+0100], To linux-kernel@vger.kernel.org wrote: > The timer is initialized with TIMER_IRQSAFE flag. It does look like the > timer callback requires this flag at all. Its sole purpose is to ensure > synchronisation in the workqueue code. > > Remove TIMER_IRQSAFE flag because it is not required. ping > Cc: Jani Nikula <jani.nikula@linux.intel.com> > Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> > Cc: Rodrigo Vivi <rodrigo.vivi@intel.com> > Cc: David Airlie <airlied@linux.ie> > Cc: Daniel Vetter <daniel@ffwll.ch> > Cc: intel-gfx@lists.freedesktop.org > Cc: dri-devel@lists.freedesktop.org > Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> > --- > drivers/gpu/drm/i915/i915_sw_fence.c | 3 +-- > 1 file changed, 1 insertion(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/i915/i915_sw_fence.c b/drivers/gpu/drm/i915/i915_sw_fence.c > index fc2eeab823b70..6d22d9df6a433 100644 > --- a/drivers/gpu/drm/i915/i915_sw_fence.c > +++ b/drivers/gpu/drm/i915/i915_sw_fence.c > @@ -461,8 +461,7 @@ int i915_sw_fence_await_dma_fence(struct i915_sw_fence *fence, > timer->dma = dma_fence_get(dma); > init_irq_work(&timer->work, irq_i915_sw_fence_work); > > - timer_setup(&timer->timer, > - timer_i915_sw_fence_wake, TIMER_IRQSAFE); > + timer_setup(&timer->timer, timer_i915_sw_fence_wake, 0); > mod_timer(&timer->timer, round_jiffies_up(jiffies + timeout)); > > func = dma_i915_sw_fence_wake_timer; Sebastian
Quoting Sebastian Andrzej Siewior (2019-02-26 16:00:38) > On 2019-02-12 17:28:57 [+0100], To linux-kernel@vger.kernel.org wrote: > > The timer is initialized with TIMER_IRQSAFE flag. It does look like the > > timer callback requires this flag at all. Its sole purpose is to ensure > > synchronisation in the workqueue code. > > > > Remove TIMER_IRQSAFE flag because it is not required. > > ping We call del_timer_sync from irq context, which mandates using TIMER_IRQSAFE. Failure to do so results in lots of explosions across CI -- every machine managed to hit the warning. It may not be the best of api, but it's the only one available for the driver to use... -Chris
On Thu, 28 Feb 2019, Chris Wilson wrote: > Quoting Sebastian Andrzej Siewior (2019-02-26 16:00:38) > > On 2019-02-12 17:28:57 [+0100], To linux-kernel@vger.kernel.org wrote: > > > The timer is initialized with TIMER_IRQSAFE flag. It does look like the > > > timer callback requires this flag at all. Its sole purpose is to ensure > > > synchronisation in the workqueue code. > > > > > > Remove TIMER_IRQSAFE flag because it is not required. > > > > ping > > We call del_timer_sync from irq context, which mandates using > TIMER_IRQSAFE. Failure to do so results in lots of explosions across CI > -- every machine managed to hit the warning. > > It may not be the best of api, but it's the only one available for the > driver to use... The comment in the header files says clearly: * Note: The irq disabled callback execution is a special case for * workqueue locking issues. It's not meant for executing random crap * with interrupts disabled. Abuse is monitored! So what's so special in drm that you need to call del_timer_sync() from interrupt context? Thanks tglx
Quoting Thomas Gleixner (2019-02-28 10:09:26) > On Thu, 28 Feb 2019, Chris Wilson wrote: > > > Quoting Sebastian Andrzej Siewior (2019-02-26 16:00:38) > > > On 2019-02-12 17:28:57 [+0100], To linux-kernel@vger.kernel.org wrote: > > > > The timer is initialized with TIMER_IRQSAFE flag. It does look like the > > > > timer callback requires this flag at all. Its sole purpose is to ensure > > > > synchronisation in the workqueue code. > > > > > > > > Remove TIMER_IRQSAFE flag because it is not required. > > > > > > ping > > > > We call del_timer_sync from irq context, which mandates using > > TIMER_IRQSAFE. Failure to do so results in lots of explosions across CI > > -- every machine managed to hit the warning. > > > > It may not be the best of api, but it's the only one available for the > > driver to use... > > The comment in the header files says clearly: > > * Note: The irq disabled callback execution is a special case for > * workqueue locking issues. It's not meant for executing random crap > * with interrupts disabled. Abuse is monitored! > > So what's so special in drm that you need to call del_timer_sync() from > interrupt context? There's no protection against fence signaling from inside interrupt context, and a lot of pressure to do so. -Chris
On Thu, 28 Feb 2019, Chris Wilson wrote: > Quoting Thomas Gleixner (2019-02-28 10:09:26) > > On Thu, 28 Feb 2019, Chris Wilson wrote: > > > It may not be the best of api, but it's the only one available for the > > > driver to use... > > > > The comment in the header files says clearly: > > > > * Note: The irq disabled callback execution is a special case for > > * workqueue locking issues. It's not meant for executing random crap > > * with interrupts disabled. Abuse is monitored! > > > > So what's so special in drm that you need to call del_timer_sync() from > > interrupt context? > > There's no protection against fence signaling from inside interrupt > context, and a lot of pressure to do so. Whatever that means that still does not justify to pick something which is clearly stated not to be for general usage without talking to the people who added that restriction. I looked at that code and it's so well commented that's it's utterly obvious how all this is connected and why this is the only way to solve the problem. Oh well.. Thanks, tglx
diff --git a/drivers/gpu/drm/i915/i915_sw_fence.c b/drivers/gpu/drm/i915/i915_sw_fence.c index fc2eeab823b70..6d22d9df6a433 100644 --- a/drivers/gpu/drm/i915/i915_sw_fence.c +++ b/drivers/gpu/drm/i915/i915_sw_fence.c @@ -461,8 +461,7 @@ int i915_sw_fence_await_dma_fence(struct i915_sw_fence *fence, timer->dma = dma_fence_get(dma); init_irq_work(&timer->work, irq_i915_sw_fence_work); - timer_setup(&timer->timer, - timer_i915_sw_fence_wake, TIMER_IRQSAFE); + timer_setup(&timer->timer, timer_i915_sw_fence_wake, 0); mod_timer(&timer->timer, round_jiffies_up(jiffies + timeout)); func = dma_i915_sw_fence_wake_timer;
The timer is initialized with TIMER_IRQSAFE flag. It does look like the timer callback requires this flag at all. Its sole purpose is to ensure synchronisation in the workqueue code. Remove TIMER_IRQSAFE flag because it is not required. Cc: Jani Nikula <jani.nikula@linux.intel.com> Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> Cc: Rodrigo Vivi <rodrigo.vivi@intel.com> Cc: David Airlie <airlied@linux.ie> Cc: Daniel Vetter <daniel@ffwll.ch> Cc: intel-gfx@lists.freedesktop.org Cc: dri-devel@lists.freedesktop.org Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> --- drivers/gpu/drm/i915/i915_sw_fence.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)