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: Thomas Hellstrom <thellstrom@vmware.com> Reviewed-by: Sinclair Yeh <syeh@vmware.com>
This commit is contained in:
parent
508108ea27
commit
1b9a01d62c
@ -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,
|
|||||||
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,
|
|||||||
|
|
||||||
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,
|
|||||||
|
|
||||||
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,
|
|||||||
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,
|
|||||||
|
|
||||||
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,
|
|||||||
|
|
||||||
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,
|
|||||||
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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user