Subject: [PATCH] drm/i915/fence: Do not use TIMER_IRQSAFE

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 <[email protected]>
Cc: Joonas Lahtinen <[email protected]>
Cc: Rodrigo Vivi <[email protected]>
Cc: David Airlie <[email protected]>
Cc: Daniel Vetter <[email protected]>
Cc: [email protected]
Cc: [email protected]
Signed-off-by: Sebastian Andrzej Siewior <[email protected]>
---
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;
--
2.20.1



Subject: Re: [PATCH] drm/i915/fence: Do not use TIMER_IRQSAFE

On 2019-02-12 17:28:57 [+0100], To [email protected] 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 <[email protected]>
> Cc: Joonas Lahtinen <[email protected]>
> Cc: Rodrigo Vivi <[email protected]>
> Cc: David Airlie <[email protected]>
> Cc: Daniel Vetter <[email protected]>
> Cc: [email protected]
> Cc: [email protected]
> Signed-off-by: Sebastian Andrzej Siewior <[email protected]>
> ---
> 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

2019-02-28 10:01:14

by Chris Wilson

[permalink] [raw]
Subject: Re: [Intel-gfx] [PATCH] drm/i915/fence: Do not use TIMER_IRQSAFE

Quoting Sebastian Andrzej Siewior (2019-02-26 16:00:38)
> On 2019-02-12 17:28:57 [+0100], To [email protected] 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

2019-02-28 10:20:49

by Chris Wilson

[permalink] [raw]
Subject: Re: [Intel-gfx] [PATCH] drm/i915/fence: Do not use TIMER_IRQSAFE

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 [email protected] 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

2019-02-28 11:51:48

by Thomas Gleixner

[permalink] [raw]
Subject: Re: [Intel-gfx] [PATCH] drm/i915/fence: Do not use TIMER_IRQSAFE

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 [email protected] 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





2019-02-28 12:11:52

by Thomas Gleixner

[permalink] [raw]
Subject: Re: [Intel-gfx] [PATCH] drm/i915/fence: Do not use TIMER_IRQSAFE

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