diff options
author | Haixia Shi <hshi@chromium.org> | 2014-11-25 15:04:02 -0500 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2014-11-25 19:03:00 -0500 |
commit | 4bc158e0be4b03b320db9f3b91a84c898ae928a0 (patch) | |
tree | 20b69afd73ae291cd077bfac5b19b8521b773a4c /drivers/gpu/drm/udl | |
parent | 0a3d775fb2c951d1bd3f5f916eee55face0eaada (diff) |
drm/udl: handle page mapping in dmabuf export.
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>
Diffstat (limited to 'drivers/gpu/drm/udl')
-rw-r--r-- | drivers/gpu/drm/udl/udl_dmabuf.c | 7 | ||||
-rw-r--r-- | drivers/gpu/drm/udl/udl_drv.h | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/udl/udl_gem.c | 4 |
3 files changed, 9 insertions, 4 deletions
diff --git a/drivers/gpu/drm/udl/udl_dmabuf.c b/drivers/gpu/drm/udl/udl_dmabuf.c index 1d85c3a9151d..2425b76dc44c 100644 --- a/drivers/gpu/drm/udl/udl_dmabuf.c +++ b/drivers/gpu/drm/udl/udl_dmabuf.c | |||
@@ -90,8 +90,11 @@ static struct sg_table *udl_map_dma_buf(struct dma_buf_attachment *attach, | |||
90 | return &udl_attach->sgt; | 90 | return &udl_attach->sgt; |
91 | 91 | ||
92 | if (!obj->pages) { | 92 | if (!obj->pages) { |
93 | DRM_ERROR("pages is null.\n"); | 93 | ret = udl_gem_get_pages(obj); |
94 | return ERR_PTR(-ENOMEM); | 94 | if (ret) { |
95 | DRM_ERROR("failed to map pages.\n"); | ||
96 | return ERR_PTR(ret); | ||
97 | } | ||
95 | } | 98 | } |
96 | 99 | ||
97 | page_count = obj->base.size / PAGE_SIZE; | 100 | page_count = obj->base.size / PAGE_SIZE; |
diff --git a/drivers/gpu/drm/udl/udl_drv.h b/drivers/gpu/drm/udl/udl_drv.h index 1b132d779621..80adbac82bde 100644 --- a/drivers/gpu/drm/udl/udl_drv.h +++ b/drivers/gpu/drm/udl/udl_drv.h | |||
@@ -129,6 +129,8 @@ struct dma_buf *udl_gem_prime_export(struct drm_device *dev, | |||
129 | struct drm_gem_object *udl_gem_prime_import(struct drm_device *dev, | 129 | struct drm_gem_object *udl_gem_prime_import(struct drm_device *dev, |
130 | struct dma_buf *dma_buf); | 130 | struct dma_buf *dma_buf); |
131 | 131 | ||
132 | int udl_gem_get_pages(struct udl_gem_object *obj); | ||
133 | void udl_gem_put_pages(struct udl_gem_object *obj); | ||
132 | int udl_gem_vmap(struct udl_gem_object *obj); | 134 | int udl_gem_vmap(struct udl_gem_object *obj); |
133 | void udl_gem_vunmap(struct udl_gem_object *obj); | 135 | void udl_gem_vunmap(struct udl_gem_object *obj); |
134 | int udl_drm_gem_mmap(struct file *filp, struct vm_area_struct *vma); | 136 | int udl_drm_gem_mmap(struct file *filp, struct vm_area_struct *vma); |
diff --git a/drivers/gpu/drm/udl/udl_gem.c b/drivers/gpu/drm/udl/udl_gem.c index cd3482de5cab..2a0a784ab6ee 100644 --- a/drivers/gpu/drm/udl/udl_gem.c +++ b/drivers/gpu/drm/udl/udl_gem.c | |||
@@ -127,7 +127,7 @@ int udl_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf) | |||
127 | } | 127 | } |
128 | } | 128 | } |
129 | 129 | ||
130 | static int udl_gem_get_pages(struct udl_gem_object *obj) | 130 | int udl_gem_get_pages(struct udl_gem_object *obj) |
131 | { | 131 | { |
132 | struct page **pages; | 132 | struct page **pages; |
133 | 133 | ||
@@ -143,7 +143,7 @@ static int udl_gem_get_pages(struct udl_gem_object *obj) | |||
143 | return 0; | 143 | return 0; |
144 | } | 144 | } |
145 | 145 | ||
146 | static void udl_gem_put_pages(struct udl_gem_object *obj) | 146 | void udl_gem_put_pages(struct udl_gem_object *obj) |
147 | { | 147 | { |
148 | if (obj->base.import_attach) { | 148 | if (obj->base.import_attach) { |
149 | drm_free_large(obj->pages); | 149 | drm_free_large(obj->pages); |