lkml.org 
[lkml]   [2010]   [Jul]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[145/205] drm/i915: Hold the spinlock whilst resetting unpin_work along error path
    2.6.34-stable review patch.  If anyone has any objections, please let us know.

    ------------------

    From: Chris Wilson <chris@chris-wilson.co.uk>

    commit 468f0b44ce4b002ca7d9260f802a341854752c02 upstream.

    Delay taking the mutex until we need to and ensure that we hold the
    spinlock when resetting unpin_work on the error path. Also defer the
    debugging print messages until after we have released the spinlock.

    Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
    Cc: Jesse Barnes <jbarnes@virtuousgeek.org>
    Cc: Kristian Høgsberg <krh@bitplanet.net>
    Reviewed-by: Jesse Barnes <jbarnes@virtuousgeek.org>
    Signed-off-by: Eric Anholt <eric@anholt.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    drivers/gpu/drm/i915/intel_display.c | 20 ++++++++++++--------
    1 file changed, 12 insertions(+), 8 deletions(-)

    --- a/drivers/gpu/drm/i915/intel_display.c
    +++ b/drivers/gpu/drm/i915/intel_display.c
    @@ -4239,8 +4239,6 @@ static int intel_crtc_page_flip(struct d
    if (work == NULL)
    return -ENOMEM;

    - mutex_lock(&dev->struct_mutex);
    -
    work->event = event;
    work->dev = crtc->dev;
    intel_fb = to_intel_framebuffer(crtc->fb);
    @@ -4250,10 +4248,10 @@ static int intel_crtc_page_flip(struct d
    /* We borrow the event spin lock for protecting unpin_work */
    spin_lock_irqsave(&dev->event_lock, flags);
    if (intel_crtc->unpin_work) {
    - DRM_DEBUG_DRIVER("flip queue: crtc already busy\n");
    spin_unlock_irqrestore(&dev->event_lock, flags);
    kfree(work);
    - mutex_unlock(&dev->struct_mutex);
    +
    + DRM_DEBUG_DRIVER("flip queue: crtc already busy\n");
    return -EBUSY;
    }
    intel_crtc->unpin_work = work;
    @@ -4262,13 +4260,19 @@ static int intel_crtc_page_flip(struct d
    intel_fb = to_intel_framebuffer(fb);
    obj = intel_fb->obj;

    + mutex_lock(&dev->struct_mutex);
    ret = intel_pin_and_fence_fb_obj(dev, obj);
    if (ret != 0) {
    - DRM_DEBUG_DRIVER("flip queue: %p pin & fence failed\n",
    - to_intel_bo(obj));
    - kfree(work);
    - intel_crtc->unpin_work = NULL;
    mutex_unlock(&dev->struct_mutex);
    +
    + spin_lock_irqsave(&dev->event_lock, flags);
    + intel_crtc->unpin_work = NULL;
    + spin_unlock_irqrestore(&dev->event_lock, flags);
    +
    + kfree(work);
    +
    + DRM_DEBUG_DRIVER("flip queue: %p pin & fence failed\n",
    + to_intel_bo(obj));
    return ret;
    }


    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2010-07-30 20:05    [W:0.022 / U:30.892 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site