Commit 347cf10a authored by Dave Airlie's avatar Dave Airlie

drm/udl: take reference to device struct for dma-bufs

this stops the device from being deleted before all the dma-bufs
on it are freed, this fixes an oops when you unplug a udl device while
it has imported a buffer from another device.
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent b098d672
...@@ -177,8 +177,10 @@ void udl_gem_free_object(struct drm_gem_object *gem_obj) ...@@ -177,8 +177,10 @@ void udl_gem_free_object(struct drm_gem_object *gem_obj)
if (obj->vmapping) if (obj->vmapping)
udl_gem_vunmap(obj); udl_gem_vunmap(obj);
if (gem_obj->import_attach) if (gem_obj->import_attach) {
drm_prime_gem_destroy(gem_obj, obj->sg); drm_prime_gem_destroy(gem_obj, obj->sg);
put_device(gem_obj->dev->dev);
}
if (obj->pages) if (obj->pages)
udl_gem_put_pages(obj); udl_gem_put_pages(obj);
...@@ -256,9 +258,12 @@ struct drm_gem_object *udl_gem_prime_import(struct drm_device *dev, ...@@ -256,9 +258,12 @@ struct drm_gem_object *udl_gem_prime_import(struct drm_device *dev,
int ret; int ret;
/* need to attach */ /* need to attach */
get_device(dev->dev);
attach = dma_buf_attach(dma_buf, dev->dev); attach = dma_buf_attach(dma_buf, dev->dev);
if (IS_ERR(attach)) if (IS_ERR(attach)) {
put_device(dev->dev);
return ERR_CAST(attach); return ERR_CAST(attach);
}
get_dma_buf(dma_buf); get_dma_buf(dma_buf);
...@@ -282,6 +287,6 @@ struct drm_gem_object *udl_gem_prime_import(struct drm_device *dev, ...@@ -282,6 +287,6 @@ struct drm_gem_object *udl_gem_prime_import(struct drm_device *dev,
fail_detach: fail_detach:
dma_buf_detach(dma_buf, attach); dma_buf_detach(dma_buf, attach);
dma_buf_put(dma_buf); dma_buf_put(dma_buf);
put_device(dev->dev);
return ERR_PTR(ret); return ERR_PTR(ret);
} }
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