drm/udl: handle page mapping in dmabuf export.
authorHaixia Shi <hshi@chromium.org>
Tue, 25 Nov 2014 20:04:02 +0000 (12:04 -0800)
committerDave Airlie <airlied@redhat.com>
Wed, 26 Nov 2014 00:03:00 +0000 (10:03 +1000)
Fixes dmabuf export failure with -E_NOMEM when the page is not mapped.

Signed-off-by: Haixia Shi <hshi@chromium.org>
Reviewed-by: Stéphane Marchesin <marcheu@chromium.org>
Signed-off-by: Dave Airlie <airlied@redhat.com>
drivers/gpu/drm/udl/udl_dmabuf.c
drivers/gpu/drm/udl/udl_drv.h
drivers/gpu/drm/udl/udl_gem.c

index 1d85c3a9151d1301035d20f3fad6137e55d1fc63..2425b76dc44ce49b5e5d5ea4250fa2427b4c78a0 100644 (file)
@@ -90,8 +90,11 @@ static struct sg_table *udl_map_dma_buf(struct dma_buf_attachment *attach,
                return &udl_attach->sgt;
 
        if (!obj->pages) {
-               DRM_ERROR("pages is null.\n");
-               return ERR_PTR(-ENOMEM);
+               ret = udl_gem_get_pages(obj);
+               if (ret) {
+                       DRM_ERROR("failed to map pages.\n");
+                       return ERR_PTR(ret);
+               }
        }
 
        page_count = obj->base.size / PAGE_SIZE;
index 1b132d779621d452bd319bf41770dc93f83ed1e2..80adbac82bdedcfb99db9164575ffa6b8787a9f8 100644 (file)
@@ -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 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);
 void udl_gem_vunmap(struct udl_gem_object *obj);
 int udl_drm_gem_mmap(struct file *filp, struct vm_area_struct *vma);
index cd3482de5cab4e1de1c86a2b4f49660a7a689745..2a0a784ab6eec37c34143f250fae9851f5d3ea94 100644 (file)
@@ -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;
 
@@ -143,7 +143,7 @@ static int udl_gem_get_pages(struct udl_gem_object *obj)
        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) {
                drm_free_large(obj->pages);