Commit 4bc158e0 authored by Haixia Shi's avatar Haixia Shi Committed by Dave Airlie

drm/udl: handle page mapping in dmabuf export.

Fixes dmabuf export failure with -E_NOMEM when the page is not mapped.
Signed-off-by: default avatarHaixia Shi <hshi@chromium.org>
Reviewed-by: default avatarStéphane Marchesin <marcheu@chromium.org>
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent 0a3d775f
...@@ -90,8 +90,11 @@ static struct sg_table *udl_map_dma_buf(struct dma_buf_attachment *attach, ...@@ -90,8 +90,11 @@ static struct sg_table *udl_map_dma_buf(struct dma_buf_attachment *attach,
return &udl_attach->sgt; return &udl_attach->sgt;
if (!obj->pages) { if (!obj->pages) {
DRM_ERROR("pages is null.\n"); ret = udl_gem_get_pages(obj);
return ERR_PTR(-ENOMEM); if (ret) {
DRM_ERROR("failed to map pages.\n");
return ERR_PTR(ret);
}
} }
page_count = obj->base.size / PAGE_SIZE; page_count = obj->base.size / PAGE_SIZE;
......
...@@ -129,6 +129,8 @@ struct dma_buf *udl_gem_prime_export(struct drm_device *dev, ...@@ -129,6 +129,8 @@ struct dma_buf *udl_gem_prime_export(struct drm_device *dev,
struct drm_gem_object *udl_gem_prime_import(struct drm_device *dev, struct drm_gem_object *udl_gem_prime_import(struct drm_device *dev,
struct dma_buf *dma_buf); struct dma_buf *dma_buf);
int udl_gem_get_pages(struct udl_gem_object *obj);
void udl_gem_put_pages(struct udl_gem_object *obj);
int udl_gem_vmap(struct udl_gem_object *obj); int udl_gem_vmap(struct udl_gem_object *obj);
void udl_gem_vunmap(struct udl_gem_object *obj); void udl_gem_vunmap(struct udl_gem_object *obj);
int udl_drm_gem_mmap(struct file *filp, struct vm_area_struct *vma); int udl_drm_gem_mmap(struct file *filp, struct vm_area_struct *vma);
......
...@@ -127,7 +127,7 @@ int udl_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf) ...@@ -127,7 +127,7 @@ int udl_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
} }
} }
static int udl_gem_get_pages(struct udl_gem_object *obj) int udl_gem_get_pages(struct udl_gem_object *obj)
{ {
struct page **pages; struct page **pages;
...@@ -143,7 +143,7 @@ static int udl_gem_get_pages(struct udl_gem_object *obj) ...@@ -143,7 +143,7 @@ static int udl_gem_get_pages(struct udl_gem_object *obj)
return 0; return 0;
} }
static void udl_gem_put_pages(struct udl_gem_object *obj) void udl_gem_put_pages(struct udl_gem_object *obj)
{ {
if (obj->base.import_attach) { if (obj->base.import_attach) {
drm_free_large(obj->pages); drm_free_large(obj->pages);
......
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