diff options
Diffstat (limited to 'drivers/gpu/drm/vmwgfx/vmwgfx_resource.c')
-rw-r--r-- | drivers/gpu/drm/vmwgfx/vmwgfx_resource.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c index 6fdd82d42f65..2aa4bc6a4d60 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c | |||
@@ -88,6 +88,11 @@ struct vmw_resource *vmw_resource_reference(struct vmw_resource *res) | |||
88 | return res; | 88 | return res; |
89 | } | 89 | } |
90 | 90 | ||
91 | struct vmw_resource * | ||
92 | vmw_resource_reference_unless_doomed(struct vmw_resource *res) | ||
93 | { | ||
94 | return kref_get_unless_zero(&res->kref) ? res : NULL; | ||
95 | } | ||
91 | 96 | ||
92 | /** | 97 | /** |
93 | * vmw_resource_release_id - release a resource id to the id manager. | 98 | * vmw_resource_release_id - release a resource id to the id manager. |
@@ -136,8 +141,12 @@ static void vmw_resource_release(struct kref *kref) | |||
136 | vmw_dmabuf_unreference(&res->backup); | 141 | vmw_dmabuf_unreference(&res->backup); |
137 | } | 142 | } |
138 | 143 | ||
139 | if (likely(res->hw_destroy != NULL)) | 144 | if (likely(res->hw_destroy != NULL)) { |
140 | res->hw_destroy(res); | 145 | res->hw_destroy(res); |
146 | mutex_lock(&dev_priv->binding_mutex); | ||
147 | vmw_context_binding_res_list_kill(&res->binding_head); | ||
148 | mutex_unlock(&dev_priv->binding_mutex); | ||
149 | } | ||
141 | 150 | ||
142 | id = res->id; | 151 | id = res->id; |
143 | if (res->res_free != NULL) | 152 | if (res->res_free != NULL) |