e-mail snafu, sent it too early by accident, and from a gmail web
interface which i'm apparently incapable of using properly...

The second fix should look like this:

> A simple fix in static void vblank_disable_and_save() would be to
> replace the new...
>
> if (!vblank->enabled) {
>
> ... check by ...

if (!vblank->enabled &&
   drm_get_last_vbltimestamp(dev, crtc, &tvblank, 0)) {

... We need to make sure timestamp queries work and are actually
locked to the vblank, otherwise we can't do that last update there in
vblank_disable_and_save().


With these two fixes or similar applied i'd be happy, otherwise it
will inflict pain and real bugs on real users.

thanks,
-mario



On Wed, Sep 10, 2014 at 4:19 PM, Mario Kleiner
<mario.kleiner.de at gmail.com> wrote:
> Hmm, not quite an ack from my side for the pull in its current form. I
> said if the two remaining issues i mentioned are addressed, then i'm
> happy with it and can have my reviewed/acked-by. Looking at the code
> they haven't been adressed.
>
> However, this is easily fixable on top of the current patches:
>
> 1. A vblank_disable_timeout module parameter of zero should always
> leave vblank irq's enabled and also override the drivers choice,
> otherwise a user can't override the driver on a broken driver/gpu
> combo, which is the only use case for having that module parameter.
> Currenty the disable_immediately flag overrides the users override ->
> Ouch.
>
> So in drm_vblank_put():
>
> ...
>
> /* Last user schedules interrupt disable */
> if (atomic_dec_and_test(&vblank->refcount)) {
>>>> Insert zero -> opt-out check <<<
>    if (drm_vblank_offdelay == 0)
>        return;
>>>> Remaining code continues <<<
>    if (dev->vblank_disable_immediate || drm_vblank_offdelay < 0)
>        vblank_disable_fn((unsigned long)vblank);
>    else if (drm_vblank_offdelay > 0)
>        mod_timer(&vblank->disable_timer, jiffies +
> ((drm_vblank_offdelay * HZ)/1000));
>
> ...
>
> 2. For the "drm: Have the vblank counter account for the time ... "
> patch, we must opt-out of that last timestamp/counter update/bump if
> the driver doesn't support high-precision vblank timestamping,
> otherwise the vblank count and timestamp will be inconsistent with
> each other - or outright wrong in case of the timestamp. Rather
> deliver a slightly outdated, but correct count+timestamp pair to
> userspace, which is still useable for practical purposes, than a pair
> that's outright wrong and will definitely confuse clients.
>
> A simple fix in static void vblank_disable_and_save() would be to
> replace the new...
>
> if (!vblank->enabled) {
>
> ... check by ...
>
> if (!vblank->enabled &&
> ) {
>
>
> On Wed, Sep 10, 2014 at 2:05 PM, Daniel Vetter <daniel.vetter at ffwll.ch> 
> wrote:
>> Hi Dave,
>>
>> So here's the final bits of Ville's vblank rework with a bit of cleanup
>> from Mario on top.
>>
>> The neat thing this finally allows is to immediately disable the vblank
>> interrupt on the last drm_vblank_put if the hardware has perfectly
>> accurate vblank counter and timestamp readout support. On i915 that
>> required piles of small adjustements from Ville since depending upon the
>> platform and port the vblank happens at different scanout lines.
>>
>> Of course this is fully opt-in and per-device (we need that since gen2
>> doesn't have a hw vblank counter).
>>
>> Mario reviewed the entire pile too and after some initial hesitation
>> (about drivers without accurate timestampt support) acked it.
>>
>> Cheers, Daniel
>>
>>
>> The following changes since commit 21d70354bba9965a098382fc4d7fb17e138111f3:
>>
>>   drm: move drm_stub.c to drm_drv.c (2014-08-06 19:10:44 +1000)
>>
>> are available in the git repository at:
>>
>>   git://anongit.freedesktop.org/drm-intel tags/topic/vblank-rework-2014-09-10
>>
>> for you to fetch changes up to 2368ffb18b1d2b04eb80478d225676caa7a3c4c8:
>>
>>   drm: Use vblank_disable_and_save in drm_vblank_cleanup() (2014-09-10 
>> 09:41:29 +0200)
>>
>> ----------------------------------------------------------------
>> Mario Kleiner (2):
>>       drm: Remove drm_vblank_cleanup from drm_vblank_init error path.
>>       drm: Use vblank_disable_and_save in drm_vblank_cleanup()
>>
>> Ville Syrj?l? (16):
>>       drm: Always reject drm_vblank_get() after drm_vblank_off()
>>       drm/i915: Warn if drm_vblank_get() still works after drm_vblank_off()
>>       drm: Don't clear vblank timestamps when vblank interrupt is disabled
>>       drm: Move drm_update_vblank_count()
>>       drm: Have the vblank counter account for the time between vblank irq 
>> disable and drm_vblank_off()
>>       drm: Avoid random vblank counter jumps if the hardware counter has 
>> been reset
>>       drm: Reduce the amount of dev->vblank[crtc] in the code
>>       drm: Fix deadlock between event_lock and vbl_lock/vblank_time_lock
>>       drm: Fix race between drm_vblank_off() and drm_queue_vblank_event()
>>       drm: Disable vblank interrupt immediately when drm_vblank_offdelay<0
>>       drm: Add dev->vblank_disable_immediate flag
>>       drm/i915: Opt out of vblank disable timer on >gen2
>>       drm: Kick start vblank interrupts at drm_vblank_on()
>>       drm/i915: Update scanline_offset only for active crtcs
>>       drm: Fix confusing debug message in drm_update_vblank_count()
>>       drm: Store the vblank timestamp when adjusting the counter during 
>> disable
>>
>>  Documentation/DocBook/drm.tmpl       |   7 +
>>  drivers/gpu/drm/drm_drv.c            |   4 +-
>>  drivers/gpu/drm/drm_irq.c            | 345 
>> ++++++++++++++++++++++-------------
>>  drivers/gpu/drm/i915/i915_irq.c      |   8 +
>>  drivers/gpu/drm/i915/intel_display.c |  17 +-
>>  include/drm/drmP.h                   |  12 +-
>>  6 files changed, 256 insertions(+), 137 deletions(-)
>>
>> --
>> Daniel Vetter
>> Software Engineer, Intel Corporation
>> +41 (0) 79 365 57 48 - http://blog.ffwll.ch
>> _______________________________________________
>> Intel-gfx mailing list
>> Intel-gfx at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to