| From 3e04e2fe6d87807d27521ad6ebb9e7919d628f25 Mon Sep 17 00:00:00 2001 |
| From: Thomas Hellstrom <thellstrom@vmware.com> |
| Date: Tue, 11 Aug 2015 22:31:17 -0700 |
| Subject: drm/vmwgfx: Fix execbuf locking issues |
| |
| From: Thomas Hellstrom <thellstrom@vmware.com> |
| |
| commit 3e04e2fe6d87807d27521ad6ebb9e7919d628f25 upstream. |
| |
| This addresses two issues that cause problems with viewperf maya-03 in |
| situation with memory pressure. |
| |
| The first issue causes attempts to unreserve buffers if batched |
| reservation fails due to, for example, a signal pending. While previously |
| the ttm_eu api was resistant against this type of error, it is no longer |
| and the lockdep code will complain about attempting to unreserve buffers |
| that are not reserved. The issue is resolved by avoid calling |
| ttm_eu_backoff_reservation in the buffer reserve error path. |
| |
| The second issue is that the binding_mutex may be held when user-space |
| fence objects are created and hence during memory reclaims. This may cause |
| recursive attempts to grab the binding mutex. The issue is resolved by not |
| holding the binding mutex across fence creation and submission. |
| |
| Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com> |
| Reviewed-by: Sinclair Yeh <syeh@vmware.com> |
| Signed-off-by: Dave Airlie <airlied@redhat.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c |
| +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c |
| @@ -2475,7 +2475,7 @@ int vmw_execbuf_process(struct drm_file |
| |
| ret = vmw_resources_validate(sw_context); |
| if (unlikely(ret != 0)) |
| - goto out_err; |
| + goto out_err_nores; |
| |
| if (throttle_us) { |
| ret = vmw_wait_lag(dev_priv, &dev_priv->fifo.marker_queue, |
| @@ -2511,6 +2511,7 @@ int vmw_execbuf_process(struct drm_file |
| vmw_resource_relocations_free(&sw_context->res_relocations); |
| |
| vmw_fifo_commit(dev_priv, command_size); |
| + mutex_unlock(&dev_priv->binding_mutex); |
| |
| vmw_query_bo_switch_commit(dev_priv, sw_context); |
| ret = vmw_execbuf_fence_commands(file_priv, dev_priv, |
| @@ -2526,7 +2527,6 @@ int vmw_execbuf_process(struct drm_file |
| DRM_ERROR("Fence submission error. Syncing.\n"); |
| |
| vmw_resource_list_unreserve(&sw_context->resource_list, false); |
| - mutex_unlock(&dev_priv->binding_mutex); |
| |
| ttm_eu_fence_buffer_objects(&ticket, &sw_context->validate_nodes, |
| (void *) fence); |