mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-09 15:29:16 +00:00
drm/vmwgfx: Make sure bo's are unpinned before putting them back
During cotable resize we pin the backup buffer to make sure the trylock doesn't fail. We were never unpinning the backup buffer resulting in every subsequent cotable resize trying to release a pinned bo. After we copy the old backup to the new we can release the pin. Mob's are always pinned so we just have to make sure we unpin them before releasing them. Reviewed-by: Thomas Hellström (Intel) <thomas_os@shipmail.org> Fixes: d1a73c641afd ("drm/vmwgfx: Make sure we unpin no longer needed buffers") Link: https://patchwork.freedesktop.org/patch/msgid/20210413205938.788366-1-zackr@vmware.com Signed-off-by: Zack Rusin <zackr@vmware.com>
This commit is contained in:
parent
68ce556bd1
commit
2ef4fb9236
@ -481,11 +481,15 @@ static int vmw_cotable_resize(struct vmw_resource *res, size_t new_size)
|
|||||||
vmw_bo_unreference(&old_buf);
|
vmw_bo_unreference(&old_buf);
|
||||||
res->id = vcotbl->type;
|
res->id = vcotbl->type;
|
||||||
|
|
||||||
|
/* Release the pin acquired in vmw_bo_init */
|
||||||
|
ttm_bo_unpin(bo);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
out_map_new:
|
out_map_new:
|
||||||
ttm_bo_kunmap(&old_map);
|
ttm_bo_kunmap(&old_map);
|
||||||
out_wait:
|
out_wait:
|
||||||
|
ttm_bo_unpin(bo);
|
||||||
ttm_bo_unreserve(bo);
|
ttm_bo_unreserve(bo);
|
||||||
vmw_bo_unreference(&buf);
|
vmw_bo_unreference(&buf);
|
||||||
|
|
||||||
|
@ -1522,11 +1522,8 @@ static inline void vmw_bo_unreference(struct vmw_buffer_object **buf)
|
|||||||
struct vmw_buffer_object *tmp_buf = *buf;
|
struct vmw_buffer_object *tmp_buf = *buf;
|
||||||
|
|
||||||
*buf = NULL;
|
*buf = NULL;
|
||||||
if (tmp_buf != NULL) {
|
if (tmp_buf != NULL)
|
||||||
if (tmp_buf->base.pin_count > 0)
|
|
||||||
ttm_bo_unpin(&tmp_buf->base);
|
|
||||||
ttm_bo_put(&tmp_buf->base);
|
ttm_bo_put(&tmp_buf->base);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline struct vmw_buffer_object *
|
static inline struct vmw_buffer_object *
|
||||||
|
@ -94,6 +94,16 @@ static void vmw_mob_pt_setup(struct vmw_mob *mob,
|
|||||||
struct vmw_piter data_iter,
|
struct vmw_piter data_iter,
|
||||||
unsigned long num_data_pages);
|
unsigned long num_data_pages);
|
||||||
|
|
||||||
|
|
||||||
|
static inline void vmw_bo_unpin_unlocked(struct ttm_buffer_object *bo)
|
||||||
|
{
|
||||||
|
int ret = ttm_bo_reserve(bo, false, true, NULL);
|
||||||
|
BUG_ON(ret != 0);
|
||||||
|
ttm_bo_unpin(bo);
|
||||||
|
ttm_bo_unreserve(bo);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* vmw_setup_otable_base - Issue an object table base setup command to
|
* vmw_setup_otable_base - Issue an object table base setup command to
|
||||||
* the device
|
* the device
|
||||||
@ -277,7 +287,7 @@ out_no_setup:
|
|||||||
&batch->otables[i]);
|
&batch->otables[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
ttm_bo_unpin(batch->otable_bo);
|
vmw_bo_unpin_unlocked(batch->otable_bo);
|
||||||
ttm_bo_put(batch->otable_bo);
|
ttm_bo_put(batch->otable_bo);
|
||||||
batch->otable_bo = NULL;
|
batch->otable_bo = NULL;
|
||||||
return ret;
|
return ret;
|
||||||
@ -341,9 +351,9 @@ static void vmw_otable_batch_takedown(struct vmw_private *dev_priv,
|
|||||||
BUG_ON(ret != 0);
|
BUG_ON(ret != 0);
|
||||||
|
|
||||||
vmw_bo_fence_single(bo, NULL);
|
vmw_bo_fence_single(bo, NULL);
|
||||||
|
ttm_bo_unpin(bo);
|
||||||
ttm_bo_unreserve(bo);
|
ttm_bo_unreserve(bo);
|
||||||
|
|
||||||
ttm_bo_unpin(batch->otable_bo);
|
|
||||||
ttm_bo_put(batch->otable_bo);
|
ttm_bo_put(batch->otable_bo);
|
||||||
batch->otable_bo = NULL;
|
batch->otable_bo = NULL;
|
||||||
}
|
}
|
||||||
@ -530,7 +540,7 @@ static void vmw_mob_pt_setup(struct vmw_mob *mob,
|
|||||||
void vmw_mob_destroy(struct vmw_mob *mob)
|
void vmw_mob_destroy(struct vmw_mob *mob)
|
||||||
{
|
{
|
||||||
if (mob->pt_bo) {
|
if (mob->pt_bo) {
|
||||||
ttm_bo_unpin(mob->pt_bo);
|
vmw_bo_unpin_unlocked(mob->pt_bo);
|
||||||
ttm_bo_put(mob->pt_bo);
|
ttm_bo_put(mob->pt_bo);
|
||||||
mob->pt_bo = NULL;
|
mob->pt_bo = NULL;
|
||||||
}
|
}
|
||||||
@ -646,7 +656,7 @@ int vmw_mob_bind(struct vmw_private *dev_priv,
|
|||||||
out_no_cmd_space:
|
out_no_cmd_space:
|
||||||
vmw_fifo_resource_dec(dev_priv);
|
vmw_fifo_resource_dec(dev_priv);
|
||||||
if (pt_set_up) {
|
if (pt_set_up) {
|
||||||
ttm_bo_unpin(mob->pt_bo);
|
vmw_bo_unpin_unlocked(mob->pt_bo);
|
||||||
ttm_bo_put(mob->pt_bo);
|
ttm_bo_put(mob->pt_bo);
|
||||||
mob->pt_bo = NULL;
|
mob->pt_bo = NULL;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user