drm/vmwgfx: Don't refcount cotable lookups during command buffer validation
authorThomas Hellstrom <thellstrom@vmware.com>
Wed, 26 Sep 2018 14:29:49 +0000 (16:29 +0200)
committerThomas Hellstrom <thellstrom@vmware.com>
Fri, 28 Sep 2018 06:57:08 +0000 (08:57 +0200)
The typical pattern of these lookups are
-Lookup
-Put on validate list if not already there.
-Unreference
And since we are the exclusive user of the context during lookup time,
we can be sure that the resource will stay alive during the sequence.
So avoid taking a reference during lookup, and also avoid unreferencing
when done. There are two users outside of command buffer validation and
those are refcounted explicitly.

Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com>
Reviewed-by: Sinclair Yeh <syeh@vmware.com>
drivers/gpu/drm/vmwgfx/vmwgfx_context.c
drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c
drivers/gpu/drm/vmwgfx/vmwgfx_shader.c
drivers/gpu/drm/vmwgfx/vmwgfx_so.c

index 24d7c81081aec9448657b525473be380028ad55e..14bd760a62fd7fda3053d9d244826984f6c7b5f7 100644 (file)
@@ -861,9 +861,8 @@ struct vmw_resource *vmw_context_cotable(struct vmw_resource *ctx,
        if (cotable_type >= SVGA_COTABLE_DX10_MAX)
                return ERR_PTR(-EINVAL);
 
-       return vmw_resource_reference
-               (container_of(ctx, struct vmw_user_context, res)->
-                cotables[cotable_type]);
+       return container_of(ctx, struct vmw_user_context, res)->
+               cotables[cotable_type];
 }
 
 /**
index 13db7efcb89c8071939e6c52a49d094deafbac99..dfa2d19274d501fec8e9284062260e90da31a95e 100644 (file)
@@ -372,7 +372,6 @@ static int vmw_resource_context_res_add(struct vmw_private *dev_priv,
                                continue;
 
                        ret = vmw_resource_val_add(sw_context, res);
-                       vmw_resource_unreference(&res);
                        if (unlikely(ret != 0))
                                return ret;
                }
@@ -1266,7 +1265,6 @@ static int vmw_cmd_dx_define_query(struct vmw_private *dev_priv,
 
        cotable_res = vmw_context_cotable(ctx_node->ctx, SVGA_COTABLE_DXQUERY);
        ret = vmw_cotable_notify(cotable_res, cmd->q.queryId);
-       vmw_resource_unreference(&cotable_res);
 
        return ret;
 }
@@ -2578,7 +2576,6 @@ static int vmw_cmd_dx_view_define(struct vmw_private *dev_priv,
 
        res = vmw_context_cotable(ctx_node->ctx, vmw_view_cotables[view_type]);
        ret = vmw_cotable_notify(res, cmd->defined_id);
-       vmw_resource_unreference(&res);
        if (unlikely(ret != 0))
                return ret;
 
@@ -2675,7 +2672,6 @@ static int vmw_cmd_dx_so_define(struct vmw_private *dev_priv,
        res = vmw_context_cotable(ctx_node->ctx, vmw_so_cotables[so_type]);
        cmd = container_of(header, typeof(*cmd), header);
        ret = vmw_cotable_notify(res, cmd->defined_id);
-       vmw_resource_unreference(&res);
 
        return ret;
 }
@@ -2806,7 +2802,6 @@ static int vmw_cmd_dx_define_shader(struct vmw_private *dev_priv,
 
        res = vmw_context_cotable(ctx_node->ctx, SVGA_COTABLE_DXSHADER);
        ret = vmw_cotable_notify(res, cmd->body.shaderId);
-       vmw_resource_unreference(&res);
        if (ret)
                return ret;
 
index 6915c8258e6be8def003bd74b1dba505dc50ed63..bf32fe44621986758ca59982e69a896a77d85e2f 100644 (file)
@@ -636,7 +636,8 @@ int vmw_dx_shader_add(struct vmw_cmdbuf_res_manager *man,
 
        res = &shader->res;
        shader->ctx = ctx;
-       shader->cotable = vmw_context_cotable(ctx, SVGA_COTABLE_DXSHADER);
+       shader->cotable = vmw_resource_reference
+               (vmw_context_cotable(ctx, SVGA_COTABLE_DXSHADER));
        shader->id = user_key;
        shader->committed = false;
        INIT_LIST_HEAD(&shader->cotable_head);
index aaabb87ac3af38b2488abcc7e5aa7f4ac3dabea6..bc8bb690f1ea03a09b4cdbcafe4ed6b9b9a6f2b8 100644 (file)
@@ -366,7 +366,8 @@ int vmw_view_add(struct vmw_cmdbuf_res_manager *man,
        res = &view->res;
        view->ctx = ctx;
        view->srf = vmw_resource_reference(srf);
-       view->cotable = vmw_context_cotable(ctx, vmw_view_cotables[view_type]);
+       view->cotable = vmw_resource_reference
+               (vmw_context_cotable(ctx, vmw_view_cotables[view_type]));
        view->view_type = view_type;
        view->view_id = user_key;
        view->cmd_size = cmd_size;