• Daniel Vetter's avatar
    drm: reference count event->completion · c75fe789
    Daniel Vetter authored
    commit 24835e44 upstream.
    
    When writing the generic nonblocking commit code I assumed that
    through clever lifetime management I can assure that the completion
    (stored in drm_crtc_commit) only gets freed after it is completed. And
    that worked.
    
    I also wanted to make nonblocking helpers resilient against driver
    bugs, by having timeouts everywhere. And that worked too.
    
    Unfortunately taking boths things together results in oopses :( Well,
    at least sometimes: What seems to happen is that the drm event hangs
    around forever stuck in limbo land. The nonblocking helpers eventually
    time out, move on and release it. Now the bug I tested all this
    against is drivers that just entirely fail to deliver the vblank
    events like they should, and in those cases the event is simply
    leaked. But what seems to happen, at least sometimes, on i915 is that
    the event is set up correctly, but somohow the vblank fails to fire in
    time. Which means the event isn't leaked, it's still there waiting for
    eventually a vblank to fire. That tends to happen when re-enabling the
    pipe, and then the trap springs and the kernel oopses.
    
    The correct fix here is simply to refcount the crtc commit to make
    sure that the event sticks around even for drivers which only
    sometimes fail to deliver vblanks for some arbitrary reasons. Since
    crtc commits are already refcounted that's easy to do.
    
    References: https://bugs.freedesktop.org/show_bug.cgi?id=96781
    Cc: Jim Rees <rees@umich.edu>
    Cc: Chris Wilson <chris@chris-wilson.co.uk>
    Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
    Cc: Jani Nikula <jani.nikula@linux.intel.com>
    Reviewed-by: default avatarMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
    Signed-off-by: default avatarDaniel Vetter <daniel.vetter@intel.com>
    Link: http://patchwork.freedesktop.org/patch/msgid/20161221102331.31033-1-daniel.vetter@ffwll.ch
    Cc: Arnd Bergmann <arnd@arndb.de>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    c75fe789
drm_fops.c 20 KB