|
@@ -891,17 +891,16 @@ vmw_surface_handle_reference(struct vmw_private *dev_priv,
|
|
|
uint32_t handle;
|
|
uint32_t handle;
|
|
|
struct ttm_base_object *base;
|
|
struct ttm_base_object *base;
|
|
|
int ret;
|
|
int ret;
|
|
|
|
|
+ bool require_exist = false;
|
|
|
|
|
|
|
|
if (handle_type == DRM_VMW_HANDLE_PRIME) {
|
|
if (handle_type == DRM_VMW_HANDLE_PRIME) {
|
|
|
ret = ttm_prime_fd_to_handle(tfile, u_handle, &handle);
|
|
ret = ttm_prime_fd_to_handle(tfile, u_handle, &handle);
|
|
|
if (unlikely(ret != 0))
|
|
if (unlikely(ret != 0))
|
|
|
return ret;
|
|
return ret;
|
|
|
} else {
|
|
} else {
|
|
|
- if (unlikely(drm_is_render_client(file_priv))) {
|
|
|
|
|
- DRM_ERROR("Render client refused legacy "
|
|
|
|
|
- "surface reference.\n");
|
|
|
|
|
- return -EACCES;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ if (unlikely(drm_is_render_client(file_priv)))
|
|
|
|
|
+ require_exist = true;
|
|
|
|
|
+
|
|
|
if (ACCESS_ONCE(vmw_fpriv(file_priv)->locked_master)) {
|
|
if (ACCESS_ONCE(vmw_fpriv(file_priv)->locked_master)) {
|
|
|
DRM_ERROR("Locked master refused legacy "
|
|
DRM_ERROR("Locked master refused legacy "
|
|
|
"surface reference.\n");
|
|
"surface reference.\n");
|
|
@@ -929,17 +928,14 @@ vmw_surface_handle_reference(struct vmw_private *dev_priv,
|
|
|
|
|
|
|
|
/*
|
|
/*
|
|
|
* Make sure the surface creator has the same
|
|
* Make sure the surface creator has the same
|
|
|
- * authenticating master.
|
|
|
|
|
|
|
+ * authenticating master, or is already registered with us.
|
|
|
*/
|
|
*/
|
|
|
if (drm_is_primary_client(file_priv) &&
|
|
if (drm_is_primary_client(file_priv) &&
|
|
|
- user_srf->master != file_priv->master) {
|
|
|
|
|
- DRM_ERROR("Trying to reference surface outside of"
|
|
|
|
|
- " master domain.\n");
|
|
|
|
|
- ret = -EACCES;
|
|
|
|
|
- goto out_bad_resource;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ user_srf->master != file_priv->master)
|
|
|
|
|
+ require_exist = true;
|
|
|
|
|
|
|
|
- ret = ttm_ref_object_add(tfile, base, TTM_REF_USAGE, NULL);
|
|
|
|
|
|
|
+ ret = ttm_ref_object_add(tfile, base, TTM_REF_USAGE, NULL,
|
|
|
|
|
+ require_exist);
|
|
|
if (unlikely(ret != 0)) {
|
|
if (unlikely(ret != 0)) {
|
|
|
DRM_ERROR("Could not add a reference to a surface.\n");
|
|
DRM_ERROR("Could not add a reference to a surface.\n");
|
|
|
goto out_bad_resource;
|
|
goto out_bad_resource;
|