lkml.org 
[lkml]   [2015]   [Sep]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.16.y-ckt 109/130] drm/vmwgfx: Fix execbuf locking issues
    Date
    3.16.7-ckt17 -stable review patch.  If anyone has any objections, please let me know.

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

    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: Luis Henriques <luis.henriques@canonical.com>
    ---
    drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c | 4 ++--
    1 file changed, 2 insertions(+), 2 deletions(-)

    diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c b/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c
    index 6f6fa7d2db47..3a21633eba2f 100644
    --- a/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c
    +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c
    @@ -2467,7 +2467,7 @@ int vmw_execbuf_process(struct drm_file *file_priv,

    ret = ttm_eu_reserve_buffers(&ticket, &sw_context->validate_nodes);
    if (unlikely(ret != 0))
    - goto out_err;
    + goto out_err_nores;

    ret = vmw_validate_buffers(dev_priv, sw_context);
    if (unlikely(ret != 0))
    @@ -2511,6 +2511,7 @@ int vmw_execbuf_process(struct drm_file *file_priv,
    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 *file_priv,
    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);

    \
     
     \ /
      Last update: 2015-09-04 15:41    [W:3.617 / U:0.124 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site