Patch "drm/vmwgfx: Check pin count before attempting to move a buffer" has been added to the 4.6-stable tree
Subsystems (4)
This is a note to let you know that I've just added the patch titled
drm/vmwgfx: Check pin count before attempting to move a buffer
to the 4.6-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
drm-vmwgfx-check-pin-count-before-attempting-to-move-a-buffer.patch
and it can be found in the queue-4.6 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
4ed7e2242b637bc4af0416e4aa9f945db30fb44aMon Sep 17 00:00:00 2001
From: Sinclair Yeh <[email protected]>
Date: Wed, 29 Jun 2016 13:20:26 -0700
Subject: drm/vmwgfx: Check pin count before attempting to move a buffer
From: Sinclair Yeh <[email protected]>
commit 4ed7e2242b637bc4af0416e4aa9f945db30fb44a upstream.
In certain scenarios, e.g. when fbdev is enabled, we can get into a situation where a vmw_framebuffer_pin() is called on a buffer that is already pinned.
When this happens, ttm_bo_validate() will unintentially remove the TTM_PL_FLAG_NO_EVICT flag, thus unpinning it, and leaving no way to actually pin the buffer again.
To prevent this, if a buffer is already pinned, then instead of calling ttm_bo_validate(), just make sure the proposed placement is compatible with the existing placement.
--- drivers/gpu/drm/vmwgfx/vmwgfx_dmabuf.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-)
drivers/gpu/drm/vmwgfx/vmwgfx_dmabuf.c +22 -3
@@ -49,6 +49,7 @@ int vmw_dmabuf_pin_in_placement(struct v {struct ttm_buffer_object *bo = &buf->base;int ret; +uint32_t new_flags; ret =ttm_write_lock (&dev_priv->reservation_sem, interruptible);if (unlikely (ret !=0 ))
@@ -60,7 +61,12 @@ int vmw_dmabuf_pin_in_placement(struct vif (unlikely (ret !=0 )) goto err; - ret =ttm_bo_validate (bo, placement, interruptible, false); +if (buf->pin_count >0 ) + ret =ttm_bo_mem_compat (placement, &bo->mem, + &new_flags) == true ?0 : -EINVAL ; +else + ret =ttm_bo_validate (bo, placement, interruptible, false); +if (!ret)vmw_bo_pin_reserved (buf, true);
@@ -91,6 +97,7 @@ int vmw_dmabuf_pin_in_vram_or_gmr(struct {struct ttm_buffer_object *bo = &buf->base;int ret; +uint32_t new_flags; ret =ttm_write_lock (&dev_priv->reservation_sem, interruptible);if (unlikely (ret !=0 ))
@@ -102,6 +109,12 @@ int vmw_dmabuf_pin_in_vram_or_gmr(structif (unlikely (ret !=0 )) goto err; +if (buf->pin_count >0 ) { + ret =ttm_bo_mem_compat (&vmw_vram_gmr_placement, &bo->mem, + &new_flags) == true ?0 : -EINVAL ; + goto out_unreserve; + } + ret =ttm_bo_validate (bo, &vmw_vram_gmr_placement, interruptible, false);if (likely (ret ==0 ) || ret == -ERESTARTSYS )
@@ -161,6 +174,7 @@ int vmw_dmabuf_pin_in_start_of_vram(strustruct ttm_placement placement;struct ttm_place place;int ret =0 ; +uint32_t new_flags; place = vmw_vram_placement.placement[0 ]; place.lpfn = bo->num_pages;
@@ -185,10 +199,15 @@ int vmw_dmabuf_pin_in_start_of_vram(stru*/ if (bo->mem.mem_type ==TTM_PL_VRAM && bo->mem.start < bo->num_pages && - bo->mem.start >0 ) + bo->mem.start >0 && + buf->pin_count ==0 ) (void )ttm_bo_validate (bo, &vmw_sys_placement, false, false); - ret =ttm_bo_validate (bo, &placement, interruptible, false); +if (buf->pin_count >0 ) + ret =ttm_bo_mem_compat (&placement, &bo->mem, + &new_flags) == true ?0 : -EINVAL ; +else + ret =ttm_bo_validate (bo, &placement, interruptible, false);/* For some reason we didn't end up at the start of vram */ WARN_ON (ret ==0 && bo->offset !=0 );
Patches currently in stable-queue which might be from [email protected] are
queue-4.6/drm-ttm-make-ttm_bo_mem_compat-available.patch queue-4.6/drm-vmwgfx-delay-pinning-fbdev-framebuffer-until-after-mode-set.patch queue-4.6/drm-vmwgfx-add-an-option-to-change-assumed-fb-bpp.patch queue-4.6/drm-vmwgfx-fix-corner-case-screen-target-management.patch queue-4.6/drm-vmwgfx-check-pin-count-before-attempting-to-move-a-buffer.patch queue-4.6/drm-vmwgfx-work-around-mode-set-failure-in-2d-vms.patch queue-4.6/drm-vmwgfx-fix-error-paths-when-mapping-framebuffer.patch