Commit 1b9a01d6 authored by Thomas Hellstrom's avatar Thomas Hellstrom

drm/vmwgfx: Don't refcount cotable lookups during command buffer validation

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: default avatarThomas Hellstrom <thellstrom@vmware.com>
Reviewed-by: default avatarSinclair Yeh <syeh@vmware.com>
parent 508108ea
...@@ -861,9 +861,8 @@ struct vmw_resource *vmw_context_cotable(struct vmw_resource *ctx, ...@@ -861,9 +861,8 @@ struct vmw_resource *vmw_context_cotable(struct vmw_resource *ctx,
if (cotable_type >= SVGA_COTABLE_DX10_MAX) if (cotable_type >= SVGA_COTABLE_DX10_MAX)
return ERR_PTR(-EINVAL); return ERR_PTR(-EINVAL);
return vmw_resource_reference return container_of(ctx, struct vmw_user_context, res)->
(container_of(ctx, struct vmw_user_context, res)-> cotables[cotable_type];
cotables[cotable_type]);
} }
/** /**
......
...@@ -372,7 +372,6 @@ static int vmw_resource_context_res_add(struct vmw_private *dev_priv, ...@@ -372,7 +372,6 @@ static int vmw_resource_context_res_add(struct vmw_private *dev_priv,
continue; continue;
ret = vmw_resource_val_add(sw_context, res); ret = vmw_resource_val_add(sw_context, res);
vmw_resource_unreference(&res);
if (unlikely(ret != 0)) if (unlikely(ret != 0))
return ret; return ret;
} }
...@@ -1266,7 +1265,6 @@ static int vmw_cmd_dx_define_query(struct vmw_private *dev_priv, ...@@ -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); cotable_res = vmw_context_cotable(ctx_node->ctx, SVGA_COTABLE_DXQUERY);
ret = vmw_cotable_notify(cotable_res, cmd->q.queryId); ret = vmw_cotable_notify(cotable_res, cmd->q.queryId);
vmw_resource_unreference(&cotable_res);
return ret; return ret;
} }
...@@ -2578,7 +2576,6 @@ static int vmw_cmd_dx_view_define(struct vmw_private *dev_priv, ...@@ -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]); res = vmw_context_cotable(ctx_node->ctx, vmw_view_cotables[view_type]);
ret = vmw_cotable_notify(res, cmd->defined_id); ret = vmw_cotable_notify(res, cmd->defined_id);
vmw_resource_unreference(&res);
if (unlikely(ret != 0)) if (unlikely(ret != 0))
return ret; return ret;
...@@ -2675,7 +2672,6 @@ static int vmw_cmd_dx_so_define(struct vmw_private *dev_priv, ...@@ -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]); res = vmw_context_cotable(ctx_node->ctx, vmw_so_cotables[so_type]);
cmd = container_of(header, typeof(*cmd), header); cmd = container_of(header, typeof(*cmd), header);
ret = vmw_cotable_notify(res, cmd->defined_id); ret = vmw_cotable_notify(res, cmd->defined_id);
vmw_resource_unreference(&res);
return ret; return ret;
} }
...@@ -2806,7 +2802,6 @@ static int vmw_cmd_dx_define_shader(struct vmw_private *dev_priv, ...@@ -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); res = vmw_context_cotable(ctx_node->ctx, SVGA_COTABLE_DXSHADER);
ret = vmw_cotable_notify(res, cmd->body.shaderId); ret = vmw_cotable_notify(res, cmd->body.shaderId);
vmw_resource_unreference(&res);
if (ret) if (ret)
return ret; return ret;
......
...@@ -636,7 +636,8 @@ int vmw_dx_shader_add(struct vmw_cmdbuf_res_manager *man, ...@@ -636,7 +636,8 @@ int vmw_dx_shader_add(struct vmw_cmdbuf_res_manager *man,
res = &shader->res; res = &shader->res;
shader->ctx = ctx; 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->id = user_key;
shader->committed = false; shader->committed = false;
INIT_LIST_HEAD(&shader->cotable_head); INIT_LIST_HEAD(&shader->cotable_head);
......
...@@ -366,7 +366,8 @@ int vmw_view_add(struct vmw_cmdbuf_res_manager *man, ...@@ -366,7 +366,8 @@ int vmw_view_add(struct vmw_cmdbuf_res_manager *man,
res = &view->res; res = &view->res;
view->ctx = ctx; view->ctx = ctx;
view->srf = vmw_resource_reference(srf); 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_type = view_type;
view->view_id = user_key; view->view_id = user_key;
view->cmd_size = cmd_size; view->cmd_size = cmd_size;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment