Re: [Intel-gfx] [PATCH 1/5] drm/i915: Keep vblank irq enabled during vblank evasion.

2018-02-13 Thread Maarten Lankhorst
Op 12-02-18 om 21:55 schreef Chris Wilson:
> Quoting Ville Syrjälä (2018-02-12 18:06:58)
>> On Mon, Feb 12, 2018 at 05:24:54PM +, Chris Wilson wrote:
>>> Quoting Ville Syrjälä (2018-02-12 16:55:28)
 On Mon, Feb 12, 2018 at 04:41:05PM +0100, Maarten Lankhorst wrote:
> Op 12-02-18 om 16:31 schreef Chris Wilson:
>> Quoting Maarten Lankhorst (2018-02-12 15:27:34)
>>> Op 12-02-18 om 16:22 schreef Chris Wilson:
 Quoting Maarten Lankhorst (2018-02-12 15:16:39)
> Op 12-02-18 om 16:10 schreef Chris Wilson:
>> Quoting Maarten Lankhorst (2018-02-09 09:54:00)
>>> This is a nice preparation for grabbing the uncore lock during 
>>> evasion.
>>> Grabbing the spinlock with the lock held messes up the locking,
>>> so it's easier to handover the reference to the eve
>>>
>>> Signed-off-by: Maarten Lankhorst 
>>> ---
>>>  drivers/gpu/drm/i915/intel_sprite.c | 11 ---
>>>  1 file changed, 4 insertions(+), 7 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/i915/intel_sprite.c 
>>> b/drivers/gpu/drm/i915/intel_sprite.c
>>> index 3be22c0fcfb5..971a1ea0db45 100644
>>> --- a/drivers/gpu/drm/i915/intel_sprite.c
>>> +++ b/drivers/gpu/drm/i915/intel_sprite.c
>>> @@ -109,10 +109,10 @@ void intel_pipe_update_start(const struct 
>>> intel_crtc_state *new_crtc_state)
>>>  
>>> local_irq_disable();
>>>  
>>> -   if (min <= 0 || max <= 0)
>>> +   if (WARN_ON(drm_crtc_vblank_get(&crtc->base)))
>>> return;
>>>  
>>> -   if (WARN_ON(drm_crtc_vblank_get(&crtc->base)))
>>> +   if (min <= 0 || max <= 0)
>>> return;
>>>  
>> The corresponding vblank_put is the one later in update_start(), 
>> right?
>> I don't think you intended to keep this chunk.
>> -Chris
> I'm not sure what you mean? The vblank_put is now in pipe_update_end, 
> except if the
> event takes over the reference. I think the code is correct. :)
 Then it's unbalanced in the case of error still.
 -Chris
>>> It already would have been for events, hence the WARN_ON there.
>>> I don't think we can do anything about it, this shouldn't ever
>>> happen in practice, could be a BUG_ON for all I care. :)
>> I would much prefer that over intentionally bad code.
>>
>> But do we really need to enable the vblank irq here? If the event
>> requires it, doesn't it already enable the vblank. Here, we only need it
>> when sleeping, can we not determine we have enough time before the
>> vblank without enabling the interrupt?
> I'm not sure why we get a reference to the vblank counter here. Perhaps 
> Ville does?
 We need the vblank irq to be enabled before we check the scanline since
 otherwise we may end up doing:

 1. check scanline
 3. vblank irq fires
 2. enable vblank irq
 3. wait for the next vblank

 So we'd end up wasting an entire frame.
>>> Step: 2.5, check_scanline?
>>>
>>> Something like,
>>>
>>> diff --git a/drivers/gpu/drm/i915/intel_sprite.c 
>>> b/drivers/gpu/drm/i915/intel_sprite.c
>>> index 574bd02c5a2e..70c2ee1c7b8c 100644
>>> --- a/drivers/gpu/drm/i915/intel_sprite.c
>>> +++ b/drivers/gpu/drm/i915/intel_sprite.c
>>> @@ -97,6 +97,7 @@ void intel_pipe_update_start(const struct 
>>> intel_crtc_state *new_crtc_state)
>>> bool need_vlv_dsi_wa = (IS_VALLEYVIEW(dev_priv) || 
>>> IS_CHERRYVIEW(dev_priv)) &&
>>> intel_crtc_has_type(new_crtc_state, INTEL_OUTPUT_DSI);
>>> DEFINE_WAIT(wait);
>>> +   bool have_vblank_irq = false;
>>>  
>>> vblank_start = adjusted_mode->crtc_vblank_start;
>>> if (adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE)
>>> @@ -112,9 +113,6 @@ void intel_pipe_update_start(const struct 
>>> intel_crtc_state *new_crtc_state)
>>> if (min <= 0 || max <= 0)
>>> return;
>>>  
>>> -   if (WARN_ON(drm_crtc_vblank_get(&crtc->base)))
>>> -   return;
>>> -
>>> crtc->debug.min_vbl = min;
>>> crtc->debug.max_vbl = max;
>>> trace_i915_pipe_update_start(crtc);
>>> @@ -127,6 +125,10 @@ void intel_pipe_update_start(const struct 
>>> intel_crtc_state *new_crtc_state)
>>>  */
>>> prepare_to_wait(wq, &wait, TASK_UNINTERRUPTIBLE);
>>>  
>>> +   if (!have_vblank_irq)
>>> +   have_vblank_irq = !drm_crtc_vblank_get(&crtc->base);
>>> +
>> This doesn't seem to change anything.
> Nothing wrt to the existing code :)
>
> The idea is that we have to enable the vblank-irq before doing the
> scanline check in order to not miss the interrupt, which as I understand
> it was the danger you highlighted with trying to avoid taking the
> vblank-irq.
> -Chris

Re: [Intel-gfx] [PATCH 1/5] drm/i915: Keep vblank irq enabled during vblank evasion.

2018-02-12 Thread Chris Wilson
Quoting Ville Syrjälä (2018-02-12 18:06:58)
> On Mon, Feb 12, 2018 at 05:24:54PM +, Chris Wilson wrote:
> > Quoting Ville Syrjälä (2018-02-12 16:55:28)
> > > On Mon, Feb 12, 2018 at 04:41:05PM +0100, Maarten Lankhorst wrote:
> > > > Op 12-02-18 om 16:31 schreef Chris Wilson:
> > > > > Quoting Maarten Lankhorst (2018-02-12 15:27:34)
> > > > >> Op 12-02-18 om 16:22 schreef Chris Wilson:
> > > > >>> Quoting Maarten Lankhorst (2018-02-12 15:16:39)
> > > >  Op 12-02-18 om 16:10 schreef Chris Wilson:
> > > > > Quoting Maarten Lankhorst (2018-02-09 09:54:00)
> > > > >> This is a nice preparation for grabbing the uncore lock during 
> > > > >> evasion.
> > > > >> Grabbing the spinlock with the lock held messes up the locking,
> > > > >> so it's easier to handover the reference to the eve
> > > > >>
> > > > >> Signed-off-by: Maarten Lankhorst 
> > > > >> 
> > > > >> ---
> > > > >>  drivers/gpu/drm/i915/intel_sprite.c | 11 ---
> > > > >>  1 file changed, 4 insertions(+), 7 deletions(-)
> > > > >>
> > > > >> diff --git a/drivers/gpu/drm/i915/intel_sprite.c 
> > > > >> b/drivers/gpu/drm/i915/intel_sprite.c
> > > > >> index 3be22c0fcfb5..971a1ea0db45 100644
> > > > >> --- a/drivers/gpu/drm/i915/intel_sprite.c
> > > > >> +++ b/drivers/gpu/drm/i915/intel_sprite.c
> > > > >> @@ -109,10 +109,10 @@ void intel_pipe_update_start(const struct 
> > > > >> intel_crtc_state *new_crtc_state)
> > > > >>  
> > > > >> local_irq_disable();
> > > > >>  
> > > > >> -   if (min <= 0 || max <= 0)
> > > > >> +   if (WARN_ON(drm_crtc_vblank_get(&crtc->base)))
> > > > >> return;
> > > > >>  
> > > > >> -   if (WARN_ON(drm_crtc_vblank_get(&crtc->base)))
> > > > >> +   if (min <= 0 || max <= 0)
> > > > >> return;
> > > > >>  
> > > > > The corresponding vblank_put is the one later in update_start(), 
> > > > > right?
> > > > > I don't think you intended to keep this chunk.
> > > > > -Chris
> > > >  I'm not sure what you mean? The vblank_put is now in 
> > > >  pipe_update_end, except if the
> > > >  event takes over the reference. I think the code is correct. :)
> > > > >>> Then it's unbalanced in the case of error still.
> > > > >>> -Chris
> > > > >> It already would have been for events, hence the WARN_ON there.
> > > > >> I don't think we can do anything about it, this shouldn't ever
> > > > >> happen in practice, could be a BUG_ON for all I care. :)
> > > > > I would much prefer that over intentionally bad code.
> > > > >
> > > > > But do we really need to enable the vblank irq here? If the event
> > > > > requires it, doesn't it already enable the vblank. Here, we only need 
> > > > > it
> > > > > when sleeping, can we not determine we have enough time before the
> > > > > vblank without enabling the interrupt?
> > > > I'm not sure why we get a reference to the vblank counter here. Perhaps 
> > > > Ville does?
> > > 
> > > We need the vblank irq to be enabled before we check the scanline since
> > > otherwise we may end up doing:
> > > 
> > > 1. check scanline
> > > 3. vblank irq fires
> > > 2. enable vblank irq
> > > 3. wait for the next vblank
> > > 
> > > So we'd end up wasting an entire frame.
> > 
> > Step: 2.5, check_scanline?
> > 
> > Something like,
> > 
> > diff --git a/drivers/gpu/drm/i915/intel_sprite.c 
> > b/drivers/gpu/drm/i915/intel_sprite.c
> > index 574bd02c5a2e..70c2ee1c7b8c 100644
> > --- a/drivers/gpu/drm/i915/intel_sprite.c
> > +++ b/drivers/gpu/drm/i915/intel_sprite.c
> > @@ -97,6 +97,7 @@ void intel_pipe_update_start(const struct 
> > intel_crtc_state *new_crtc_state)
> > bool need_vlv_dsi_wa = (IS_VALLEYVIEW(dev_priv) || 
> > IS_CHERRYVIEW(dev_priv)) &&
> > intel_crtc_has_type(new_crtc_state, INTEL_OUTPUT_DSI);
> > DEFINE_WAIT(wait);
> > +   bool have_vblank_irq = false;
> >  
> > vblank_start = adjusted_mode->crtc_vblank_start;
> > if (adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE)
> > @@ -112,9 +113,6 @@ void intel_pipe_update_start(const struct 
> > intel_crtc_state *new_crtc_state)
> > if (min <= 0 || max <= 0)
> > return;
> >  
> > -   if (WARN_ON(drm_crtc_vblank_get(&crtc->base)))
> > -   return;
> > -
> > crtc->debug.min_vbl = min;
> > crtc->debug.max_vbl = max;
> > trace_i915_pipe_update_start(crtc);
> > @@ -127,6 +125,10 @@ void intel_pipe_update_start(const struct 
> > intel_crtc_state *new_crtc_state)
> >  */
> > prepare_to_wait(wq, &wait, TASK_UNINTERRUPTIBLE);
> >  
> > +   if (!have_vblank_irq)
> > +   have_vblank_irq = !drm_crtc_vblank_get(&crtc->base);
> > +
> 
> This doesn't seem to change anything.

Nothing wrt to the existing code :)

The idea is that we have to enable the vblank-irq before doing the
sc

Re: [Intel-gfx] [PATCH 1/5] drm/i915: Keep vblank irq enabled during vblank evasion.

2018-02-12 Thread Ville Syrjälä
On Mon, Feb 12, 2018 at 05:24:54PM +, Chris Wilson wrote:
> Quoting Ville Syrjälä (2018-02-12 16:55:28)
> > On Mon, Feb 12, 2018 at 04:41:05PM +0100, Maarten Lankhorst wrote:
> > > Op 12-02-18 om 16:31 schreef Chris Wilson:
> > > > Quoting Maarten Lankhorst (2018-02-12 15:27:34)
> > > >> Op 12-02-18 om 16:22 schreef Chris Wilson:
> > > >>> Quoting Maarten Lankhorst (2018-02-12 15:16:39)
> > >  Op 12-02-18 om 16:10 schreef Chris Wilson:
> > > > Quoting Maarten Lankhorst (2018-02-09 09:54:00)
> > > >> This is a nice preparation for grabbing the uncore lock during 
> > > >> evasion.
> > > >> Grabbing the spinlock with the lock held messes up the locking,
> > > >> so it's easier to handover the reference to the eve
> > > >>
> > > >> Signed-off-by: Maarten Lankhorst 
> > > >> 
> > > >> ---
> > > >>  drivers/gpu/drm/i915/intel_sprite.c | 11 ---
> > > >>  1 file changed, 4 insertions(+), 7 deletions(-)
> > > >>
> > > >> diff --git a/drivers/gpu/drm/i915/intel_sprite.c 
> > > >> b/drivers/gpu/drm/i915/intel_sprite.c
> > > >> index 3be22c0fcfb5..971a1ea0db45 100644
> > > >> --- a/drivers/gpu/drm/i915/intel_sprite.c
> > > >> +++ b/drivers/gpu/drm/i915/intel_sprite.c
> > > >> @@ -109,10 +109,10 @@ void intel_pipe_update_start(const struct 
> > > >> intel_crtc_state *new_crtc_state)
> > > >>  
> > > >> local_irq_disable();
> > > >>  
> > > >> -   if (min <= 0 || max <= 0)
> > > >> +   if (WARN_ON(drm_crtc_vblank_get(&crtc->base)))
> > > >> return;
> > > >>  
> > > >> -   if (WARN_ON(drm_crtc_vblank_get(&crtc->base)))
> > > >> +   if (min <= 0 || max <= 0)
> > > >> return;
> > > >>  
> > > > The corresponding vblank_put is the one later in update_start(), 
> > > > right?
> > > > I don't think you intended to keep this chunk.
> > > > -Chris
> > >  I'm not sure what you mean? The vblank_put is now in 
> > >  pipe_update_end, except if the
> > >  event takes over the reference. I think the code is correct. :)
> > > >>> Then it's unbalanced in the case of error still.
> > > >>> -Chris
> > > >> It already would have been for events, hence the WARN_ON there.
> > > >> I don't think we can do anything about it, this shouldn't ever
> > > >> happen in practice, could be a BUG_ON for all I care. :)
> > > > I would much prefer that over intentionally bad code.
> > > >
> > > > But do we really need to enable the vblank irq here? If the event
> > > > requires it, doesn't it already enable the vblank. Here, we only need it
> > > > when sleeping, can we not determine we have enough time before the
> > > > vblank without enabling the interrupt?
> > > I'm not sure why we get a reference to the vblank counter here. Perhaps 
> > > Ville does?
> > 
> > We need the vblank irq to be enabled before we check the scanline since
> > otherwise we may end up doing:
> > 
> > 1. check scanline
> > 3. vblank irq fires
> > 2. enable vblank irq
> > 3. wait for the next vblank
> > 
> > So we'd end up wasting an entire frame.
> 
> Step: 2.5, check_scanline?
> 
> Something like,
> 
> diff --git a/drivers/gpu/drm/i915/intel_sprite.c 
> b/drivers/gpu/drm/i915/intel_sprite.c
> index 574bd02c5a2e..70c2ee1c7b8c 100644
> --- a/drivers/gpu/drm/i915/intel_sprite.c
> +++ b/drivers/gpu/drm/i915/intel_sprite.c
> @@ -97,6 +97,7 @@ void intel_pipe_update_start(const struct intel_crtc_state 
> *new_crtc_state)
> bool need_vlv_dsi_wa = (IS_VALLEYVIEW(dev_priv) || 
> IS_CHERRYVIEW(dev_priv)) &&
> intel_crtc_has_type(new_crtc_state, INTEL_OUTPUT_DSI);
> DEFINE_WAIT(wait);
> +   bool have_vblank_irq = false;
>  
> vblank_start = adjusted_mode->crtc_vblank_start;
> if (adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE)
> @@ -112,9 +113,6 @@ void intel_pipe_update_start(const struct 
> intel_crtc_state *new_crtc_state)
> if (min <= 0 || max <= 0)
> return;
>  
> -   if (WARN_ON(drm_crtc_vblank_get(&crtc->base)))
> -   return;
> -
> crtc->debug.min_vbl = min;
> crtc->debug.max_vbl = max;
> trace_i915_pipe_update_start(crtc);
> @@ -127,6 +125,10 @@ void intel_pipe_update_start(const struct 
> intel_crtc_state *new_crtc_state)
>  */
> prepare_to_wait(wq, &wait, TASK_UNINTERRUPTIBLE);
>  
> +   if (!have_vblank_irq)
> +   have_vblank_irq = !drm_crtc_vblank_get(&crtc->base);
> +

This doesn't seem to change anything.

Did you mean something like this perhaps?

for (;;) {
prepare_to_wait();

if (scanline ok)
break;

if (!have_vbl_irq) {
have_vbl_irq = !vbl_get();
/*
 * Check the scanline again to make sure
 * we didn't just miss the vblank interrupt.
 */
con

Re: [Intel-gfx] [PATCH 1/5] drm/i915: Keep vblank irq enabled during vblank evasion.

2018-02-12 Thread Chris Wilson
Quoting Ville Syrjälä (2018-02-12 16:55:28)
> On Mon, Feb 12, 2018 at 04:41:05PM +0100, Maarten Lankhorst wrote:
> > Op 12-02-18 om 16:31 schreef Chris Wilson:
> > > Quoting Maarten Lankhorst (2018-02-12 15:27:34)
> > >> Op 12-02-18 om 16:22 schreef Chris Wilson:
> > >>> Quoting Maarten Lankhorst (2018-02-12 15:16:39)
> >  Op 12-02-18 om 16:10 schreef Chris Wilson:
> > > Quoting Maarten Lankhorst (2018-02-09 09:54:00)
> > >> This is a nice preparation for grabbing the uncore lock during 
> > >> evasion.
> > >> Grabbing the spinlock with the lock held messes up the locking,
> > >> so it's easier to handover the reference to the eve
> > >>
> > >> Signed-off-by: Maarten Lankhorst 
> > >> ---
> > >>  drivers/gpu/drm/i915/intel_sprite.c | 11 ---
> > >>  1 file changed, 4 insertions(+), 7 deletions(-)
> > >>
> > >> diff --git a/drivers/gpu/drm/i915/intel_sprite.c 
> > >> b/drivers/gpu/drm/i915/intel_sprite.c
> > >> index 3be22c0fcfb5..971a1ea0db45 100644
> > >> --- a/drivers/gpu/drm/i915/intel_sprite.c
> > >> +++ b/drivers/gpu/drm/i915/intel_sprite.c
> > >> @@ -109,10 +109,10 @@ void intel_pipe_update_start(const struct 
> > >> intel_crtc_state *new_crtc_state)
> > >>  
> > >> local_irq_disable();
> > >>  
> > >> -   if (min <= 0 || max <= 0)
> > >> +   if (WARN_ON(drm_crtc_vblank_get(&crtc->base)))
> > >> return;
> > >>  
> > >> -   if (WARN_ON(drm_crtc_vblank_get(&crtc->base)))
> > >> +   if (min <= 0 || max <= 0)
> > >> return;
> > >>  
> > > The corresponding vblank_put is the one later in update_start(), 
> > > right?
> > > I don't think you intended to keep this chunk.
> > > -Chris
> >  I'm not sure what you mean? The vblank_put is now in pipe_update_end, 
> >  except if the
> >  event takes over the reference. I think the code is correct. :)
> > >>> Then it's unbalanced in the case of error still.
> > >>> -Chris
> > >> It already would have been for events, hence the WARN_ON there.
> > >> I don't think we can do anything about it, this shouldn't ever
> > >> happen in practice, could be a BUG_ON for all I care. :)
> > > I would much prefer that over intentionally bad code.
> > >
> > > But do we really need to enable the vblank irq here? If the event
> > > requires it, doesn't it already enable the vblank. Here, we only need it
> > > when sleeping, can we not determine we have enough time before the
> > > vblank without enabling the interrupt?
> > I'm not sure why we get a reference to the vblank counter here. Perhaps 
> > Ville does?
> 
> We need the vblank irq to be enabled before we check the scanline since
> otherwise we may end up doing:
> 
> 1. check scanline
> 3. vblank irq fires
> 2. enable vblank irq
> 3. wait for the next vblank
> 
> So we'd end up wasting an entire frame.

Step: 2.5, check_scanline?

Something like,

diff --git a/drivers/gpu/drm/i915/intel_sprite.c 
b/drivers/gpu/drm/i915/intel_sprite.c
index 574bd02c5a2e..70c2ee1c7b8c 100644
--- a/drivers/gpu/drm/i915/intel_sprite.c
+++ b/drivers/gpu/drm/i915/intel_sprite.c
@@ -97,6 +97,7 @@ void intel_pipe_update_start(const struct intel_crtc_state 
*new_crtc_state)
bool need_vlv_dsi_wa = (IS_VALLEYVIEW(dev_priv) || 
IS_CHERRYVIEW(dev_priv)) &&
intel_crtc_has_type(new_crtc_state, INTEL_OUTPUT_DSI);
DEFINE_WAIT(wait);
+   bool have_vblank_irq = false;
 
vblank_start = adjusted_mode->crtc_vblank_start;
if (adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE)
@@ -112,9 +113,6 @@ void intel_pipe_update_start(const struct intel_crtc_state 
*new_crtc_state)
if (min <= 0 || max <= 0)
return;
 
-   if (WARN_ON(drm_crtc_vblank_get(&crtc->base)))
-   return;
-
crtc->debug.min_vbl = min;
crtc->debug.max_vbl = max;
trace_i915_pipe_update_start(crtc);
@@ -127,6 +125,10 @@ void intel_pipe_update_start(const struct intel_crtc_state 
*new_crtc_state)
 */
prepare_to_wait(wq, &wait, TASK_UNINTERRUPTIBLE);
 
+   if (!have_vblank_irq)
+   have_vblank_irq = !drm_crtc_vblank_get(&crtc->base);
+
scanline = intel_get_crtc_scanline(crtc);
if (scanline < min || scanline > max)
break;
@@ -145,8 +147,8 @@ void intel_pipe_update_start(const struct intel_crtc_state 
*new_crtc_state)
}
 
finish_wait(wq, &wait);
-
-   drm_crtc_vblank_put(&crtc->base);
+   if (have_vblank_irq)
+   drm_crtc_vblank_put(&crtc->base);
 
/*
 * On VLV/CHV DSI the scanline counter would appear to

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


Re: [Intel-gfx] [PATCH 1/5] drm/i915: Keep vblank irq enabled during vblank evasion.

2018-02-12 Thread Ville Syrjälä
On Mon, Feb 12, 2018 at 04:41:05PM +0100, Maarten Lankhorst wrote:
> Op 12-02-18 om 16:31 schreef Chris Wilson:
> > Quoting Maarten Lankhorst (2018-02-12 15:27:34)
> >> Op 12-02-18 om 16:22 schreef Chris Wilson:
> >>> Quoting Maarten Lankhorst (2018-02-12 15:16:39)
>  Op 12-02-18 om 16:10 schreef Chris Wilson:
> > Quoting Maarten Lankhorst (2018-02-09 09:54:00)
> >> This is a nice preparation for grabbing the uncore lock during evasion.
> >> Grabbing the spinlock with the lock held messes up the locking,
> >> so it's easier to handover the reference to the eve
> >>
> >> Signed-off-by: Maarten Lankhorst 
> >> ---
> >>  drivers/gpu/drm/i915/intel_sprite.c | 11 ---
> >>  1 file changed, 4 insertions(+), 7 deletions(-)
> >>
> >> diff --git a/drivers/gpu/drm/i915/intel_sprite.c 
> >> b/drivers/gpu/drm/i915/intel_sprite.c
> >> index 3be22c0fcfb5..971a1ea0db45 100644
> >> --- a/drivers/gpu/drm/i915/intel_sprite.c
> >> +++ b/drivers/gpu/drm/i915/intel_sprite.c
> >> @@ -109,10 +109,10 @@ void intel_pipe_update_start(const struct 
> >> intel_crtc_state *new_crtc_state)
> >>  
> >> local_irq_disable();
> >>  
> >> -   if (min <= 0 || max <= 0)
> >> +   if (WARN_ON(drm_crtc_vblank_get(&crtc->base)))
> >> return;
> >>  
> >> -   if (WARN_ON(drm_crtc_vblank_get(&crtc->base)))
> >> +   if (min <= 0 || max <= 0)
> >> return;
> >>  
> > The corresponding vblank_put is the one later in update_start(), right?
> > I don't think you intended to keep this chunk.
> > -Chris
>  I'm not sure what you mean? The vblank_put is now in pipe_update_end, 
>  except if the
>  event takes over the reference. I think the code is correct. :)
> >>> Then it's unbalanced in the case of error still.
> >>> -Chris
> >> It already would have been for events, hence the WARN_ON there.
> >> I don't think we can do anything about it, this shouldn't ever
> >> happen in practice, could be a BUG_ON for all I care. :)
> > I would much prefer that over intentionally bad code.
> >
> > But do we really need to enable the vblank irq here? If the event
> > requires it, doesn't it already enable the vblank. Here, we only need it
> > when sleeping, can we not determine we have enough time before the
> > vblank without enabling the interrupt?
> I'm not sure why we get a reference to the vblank counter here. Perhaps Ville 
> does?

We need the vblank irq to be enabled before we check the scanline since
otherwise we may end up doing:

1. check scanline
3. vblank irq fires
2. enable vblank irq
3. wait for the next vblank

So we'd end up wasting an entire frame.

-- 
Ville Syrjälä
Intel OTC
___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


Re: [Intel-gfx] [PATCH 1/5] drm/i915: Keep vblank irq enabled during vblank evasion.

2018-02-12 Thread Maarten Lankhorst
Op 12-02-18 om 16:31 schreef Chris Wilson:
> Quoting Maarten Lankhorst (2018-02-12 15:27:34)
>> Op 12-02-18 om 16:22 schreef Chris Wilson:
>>> Quoting Maarten Lankhorst (2018-02-12 15:16:39)
 Op 12-02-18 om 16:10 schreef Chris Wilson:
> Quoting Maarten Lankhorst (2018-02-09 09:54:00)
>> This is a nice preparation for grabbing the uncore lock during evasion.
>> Grabbing the spinlock with the lock held messes up the locking,
>> so it's easier to handover the reference to the eve
>>
>> Signed-off-by: Maarten Lankhorst 
>> ---
>>  drivers/gpu/drm/i915/intel_sprite.c | 11 ---
>>  1 file changed, 4 insertions(+), 7 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/i915/intel_sprite.c 
>> b/drivers/gpu/drm/i915/intel_sprite.c
>> index 3be22c0fcfb5..971a1ea0db45 100644
>> --- a/drivers/gpu/drm/i915/intel_sprite.c
>> +++ b/drivers/gpu/drm/i915/intel_sprite.c
>> @@ -109,10 +109,10 @@ void intel_pipe_update_start(const struct 
>> intel_crtc_state *new_crtc_state)
>>  
>> local_irq_disable();
>>  
>> -   if (min <= 0 || max <= 0)
>> +   if (WARN_ON(drm_crtc_vblank_get(&crtc->base)))
>> return;
>>  
>> -   if (WARN_ON(drm_crtc_vblank_get(&crtc->base)))
>> +   if (min <= 0 || max <= 0)
>> return;
>>  
> The corresponding vblank_put is the one later in update_start(), right?
> I don't think you intended to keep this chunk.
> -Chris
 I'm not sure what you mean? The vblank_put is now in pipe_update_end, 
 except if the
 event takes over the reference. I think the code is correct. :)
>>> Then it's unbalanced in the case of error still.
>>> -Chris
>> It already would have been for events, hence the WARN_ON there.
>> I don't think we can do anything about it, this shouldn't ever
>> happen in practice, could be a BUG_ON for all I care. :)
> I would much prefer that over intentionally bad code.
>
> But do we really need to enable the vblank irq here? If the event
> requires it, doesn't it already enable the vblank. Here, we only need it
> when sleeping, can we not determine we have enough time before the
> vblank without enabling the interrupt?
I'm not sure why we get a reference to the vblank counter here. Perhaps Ville 
does?

~Maarten
___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


Re: [Intel-gfx] [PATCH 1/5] drm/i915: Keep vblank irq enabled during vblank evasion.

2018-02-12 Thread Chris Wilson
Quoting Maarten Lankhorst (2018-02-12 15:27:34)
> Op 12-02-18 om 16:22 schreef Chris Wilson:
> > Quoting Maarten Lankhorst (2018-02-12 15:16:39)
> >> Op 12-02-18 om 16:10 schreef Chris Wilson:
> >>> Quoting Maarten Lankhorst (2018-02-09 09:54:00)
>  This is a nice preparation for grabbing the uncore lock during evasion.
>  Grabbing the spinlock with the lock held messes up the locking,
>  so it's easier to handover the reference to the eve
> 
>  Signed-off-by: Maarten Lankhorst 
>  ---
>   drivers/gpu/drm/i915/intel_sprite.c | 11 ---
>   1 file changed, 4 insertions(+), 7 deletions(-)
> 
>  diff --git a/drivers/gpu/drm/i915/intel_sprite.c 
>  b/drivers/gpu/drm/i915/intel_sprite.c
>  index 3be22c0fcfb5..971a1ea0db45 100644
>  --- a/drivers/gpu/drm/i915/intel_sprite.c
>  +++ b/drivers/gpu/drm/i915/intel_sprite.c
>  @@ -109,10 +109,10 @@ void intel_pipe_update_start(const struct 
>  intel_crtc_state *new_crtc_state)
>   
>  local_irq_disable();
>   
>  -   if (min <= 0 || max <= 0)
>  +   if (WARN_ON(drm_crtc_vblank_get(&crtc->base)))
>  return;
>   
>  -   if (WARN_ON(drm_crtc_vblank_get(&crtc->base)))
>  +   if (min <= 0 || max <= 0)
>  return;
>   
> >>> The corresponding vblank_put is the one later in update_start(), right?
> >>> I don't think you intended to keep this chunk.
> >>> -Chris
> >> I'm not sure what you mean? The vblank_put is now in pipe_update_end, 
> >> except if the
> >> event takes over the reference. I think the code is correct. :)
> > Then it's unbalanced in the case of error still.
> > -Chris
> 
> It already would have been for events, hence the WARN_ON there.
> I don't think we can do anything about it, this shouldn't ever
> happen in practice, could be a BUG_ON for all I care. :)

I would much prefer that over intentionally bad code.

But do we really need to enable the vblank irq here? If the event
requires it, doesn't it already enable the vblank. Here, we only need it
when sleeping, can we not determine we have enough time before the
vblank without enabling the interrupt?
-Chris
___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


Re: [Intel-gfx] [PATCH 1/5] drm/i915: Keep vblank irq enabled during vblank evasion.

2018-02-12 Thread Maarten Lankhorst
Op 12-02-18 om 16:22 schreef Chris Wilson:
> Quoting Maarten Lankhorst (2018-02-12 15:16:39)
>> Op 12-02-18 om 16:10 schreef Chris Wilson:
>>> Quoting Maarten Lankhorst (2018-02-09 09:54:00)
 This is a nice preparation for grabbing the uncore lock during evasion.
 Grabbing the spinlock with the lock held messes up the locking,
 so it's easier to handover the reference to the eve

 Signed-off-by: Maarten Lankhorst 
 ---
  drivers/gpu/drm/i915/intel_sprite.c | 11 ---
  1 file changed, 4 insertions(+), 7 deletions(-)

 diff --git a/drivers/gpu/drm/i915/intel_sprite.c 
 b/drivers/gpu/drm/i915/intel_sprite.c
 index 3be22c0fcfb5..971a1ea0db45 100644
 --- a/drivers/gpu/drm/i915/intel_sprite.c
 +++ b/drivers/gpu/drm/i915/intel_sprite.c
 @@ -109,10 +109,10 @@ void intel_pipe_update_start(const struct 
 intel_crtc_state *new_crtc_state)
  
 local_irq_disable();
  
 -   if (min <= 0 || max <= 0)
 +   if (WARN_ON(drm_crtc_vblank_get(&crtc->base)))
 return;
  
 -   if (WARN_ON(drm_crtc_vblank_get(&crtc->base)))
 +   if (min <= 0 || max <= 0)
 return;
  
>>> The corresponding vblank_put is the one later in update_start(), right?
>>> I don't think you intended to keep this chunk.
>>> -Chris
>> I'm not sure what you mean? The vblank_put is now in pipe_update_end, except 
>> if the
>> event takes over the reference. I think the code is correct. :)
> Then it's unbalanced in the case of error still.
> -Chris

It already would have been for events, hence the WARN_ON there.
I don't think we can do anything about it, this shouldn't ever
happen in practice, could be a BUG_ON for all I care. :)

~Maarten

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


Re: [Intel-gfx] [PATCH 1/5] drm/i915: Keep vblank irq enabled during vblank evasion.

2018-02-12 Thread Chris Wilson
Quoting Maarten Lankhorst (2018-02-12 15:16:39)
> Op 12-02-18 om 16:10 schreef Chris Wilson:
> > Quoting Maarten Lankhorst (2018-02-09 09:54:00)
> >> This is a nice preparation for grabbing the uncore lock during evasion.
> >> Grabbing the spinlock with the lock held messes up the locking,
> >> so it's easier to handover the reference to the eve
> >>
> >> Signed-off-by: Maarten Lankhorst 
> >> ---
> >>  drivers/gpu/drm/i915/intel_sprite.c | 11 ---
> >>  1 file changed, 4 insertions(+), 7 deletions(-)
> >>
> >> diff --git a/drivers/gpu/drm/i915/intel_sprite.c 
> >> b/drivers/gpu/drm/i915/intel_sprite.c
> >> index 3be22c0fcfb5..971a1ea0db45 100644
> >> --- a/drivers/gpu/drm/i915/intel_sprite.c
> >> +++ b/drivers/gpu/drm/i915/intel_sprite.c
> >> @@ -109,10 +109,10 @@ void intel_pipe_update_start(const struct 
> >> intel_crtc_state *new_crtc_state)
> >>  
> >> local_irq_disable();
> >>  
> >> -   if (min <= 0 || max <= 0)
> >> +   if (WARN_ON(drm_crtc_vblank_get(&crtc->base)))
> >> return;
> >>  
> >> -   if (WARN_ON(drm_crtc_vblank_get(&crtc->base)))
> >> +   if (min <= 0 || max <= 0)
> >> return;
> >>  
> > The corresponding vblank_put is the one later in update_start(), right?
> > I don't think you intended to keep this chunk.
> > -Chris
> 
> I'm not sure what you mean? The vblank_put is now in pipe_update_end, except 
> if the
> event takes over the reference. I think the code is correct. :)

Then it's unbalanced in the case of error still.
-Chris
___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


Re: [Intel-gfx] [PATCH 1/5] drm/i915: Keep vblank irq enabled during vblank evasion.

2018-02-12 Thread Maarten Lankhorst
Op 12-02-18 om 16:10 schreef Chris Wilson:
> Quoting Maarten Lankhorst (2018-02-09 09:54:00)
>> This is a nice preparation for grabbing the uncore lock during evasion.
>> Grabbing the spinlock with the lock held messes up the locking,
>> so it's easier to handover the reference to the eve
>>
>> Signed-off-by: Maarten Lankhorst 
>> ---
>>  drivers/gpu/drm/i915/intel_sprite.c | 11 ---
>>  1 file changed, 4 insertions(+), 7 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/i915/intel_sprite.c 
>> b/drivers/gpu/drm/i915/intel_sprite.c
>> index 3be22c0fcfb5..971a1ea0db45 100644
>> --- a/drivers/gpu/drm/i915/intel_sprite.c
>> +++ b/drivers/gpu/drm/i915/intel_sprite.c
>> @@ -109,10 +109,10 @@ void intel_pipe_update_start(const struct 
>> intel_crtc_state *new_crtc_state)
>>  
>> local_irq_disable();
>>  
>> -   if (min <= 0 || max <= 0)
>> +   if (WARN_ON(drm_crtc_vblank_get(&crtc->base)))
>> return;
>>  
>> -   if (WARN_ON(drm_crtc_vblank_get(&crtc->base)))
>> +   if (min <= 0 || max <= 0)
>> return;
>>  
> The corresponding vblank_put is the one later in update_start(), right?
> I don't think you intended to keep this chunk.
> -Chris

I'm not sure what you mean? The vblank_put is now in pipe_update_end, except if 
the
event takes over the reference. I think the code is correct. :)

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx


Re: [Intel-gfx] [PATCH 1/5] drm/i915: Keep vblank irq enabled during vblank evasion.

2018-02-12 Thread Chris Wilson
Quoting Maarten Lankhorst (2018-02-09 09:54:00)
> This is a nice preparation for grabbing the uncore lock during evasion.
> Grabbing the spinlock with the lock held messes up the locking,
> so it's easier to handover the reference to the event.
> 
> Signed-off-by: Maarten Lankhorst 
> ---
>  drivers/gpu/drm/i915/intel_sprite.c | 11 ---
>  1 file changed, 4 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_sprite.c 
> b/drivers/gpu/drm/i915/intel_sprite.c
> index 3be22c0fcfb5..971a1ea0db45 100644
> --- a/drivers/gpu/drm/i915/intel_sprite.c
> +++ b/drivers/gpu/drm/i915/intel_sprite.c
> @@ -109,10 +109,10 @@ void intel_pipe_update_start(const struct 
> intel_crtc_state *new_crtc_state)
>  
> local_irq_disable();
>  
> -   if (min <= 0 || max <= 0)
> +   if (WARN_ON(drm_crtc_vblank_get(&crtc->base)))
> return;
>  
> -   if (WARN_ON(drm_crtc_vblank_get(&crtc->base)))
> +   if (min <= 0 || max <= 0)
> return;
>  

The corresponding vblank_put is the one later in update_start(), right?
I don't think you intended to keep this chunk.
-Chris
___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx