Skip to content

Commit

Permalink
drm/qxl: avoid buffer reservation in qxl_crtc_page_flip
Browse files Browse the repository at this point in the history
This avoid a dependency lock error.
According to https://lwn.net/Articles/548909/ users of WW mutex API
should avoid using different context.
When a buffer is reserved with qxl_bo_reserve a ww_mutex_lock without
context is used. However during qxl_draw_dirty_fb different locks
with specific context are used.
This is detected during a machine booting with a debug kernel with lock
dependency checking enabled.
Like many other function in this file to avoid this problem object
pinning is used. Once the object is pinned is not necessary to keep
the lock so it can be released avoiding the locking problem.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
  • Loading branch information
Frediano Ziglio authored and Dave Airlie committed Oct 7, 2015
1 parent 6090652 commit 7eb9974
Showing 1 changed file with 9 additions and 1 deletion.
10 changes: 9 additions & 1 deletion drivers/gpu/drm/qxl/qxl_display.c
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,10 @@ static int qxl_crtc_page_flip(struct drm_crtc *crtc,
bo->is_primary = true;

ret = qxl_bo_reserve(bo, false);
if (ret)
return ret;
ret = qxl_bo_pin(bo, bo->type, NULL);
qxl_bo_unreserve(bo);
if (ret)
return ret;

Expand All @@ -257,7 +261,11 @@ static int qxl_crtc_page_flip(struct drm_crtc *crtc,
}
drm_vblank_put(dev, qcrtc->index);

qxl_bo_unreserve(bo);
ret = qxl_bo_reserve(bo, false);
if (!ret) {
qxl_bo_unpin(bo);
qxl_bo_unreserve(bo);
}

return 0;
}
Expand Down

0 comments on commit 7eb9974

Please sign in to comment.