diff options
author | Emil Goode <emilgoode@gmail.com> | 2012-08-17 18:53:26 +0200 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2012-09-04 12:18:10 -0700 |
commit | d4eb23a98f6c39ab0e5aa6abb67b615bb8973610 (patch) | |
tree | e95c246087d290b25c0d4259b7deec53bc692a2d /drivers/staging/omapdrm | |
parent | 79e3f02887feabcc2f2f6dd31c7c38ae776e3d7c (diff) |
staging: drm/omap: Add error handling
This patch adds fail checks for kmalloc and kzalloc calls
and also adds a error path that frees allocated pages by
introducing a call to _drm_gem_put_pages.
Signed-off-by: Emil Goode <emilgoode@gmail.com>
Signed-off-by: Rob Clark <rob@ti.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/staging/omapdrm')
-rw-r--r-- | drivers/staging/omapdrm/omap_gem.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/drivers/staging/omapdrm/omap_gem.c b/drivers/staging/omapdrm/omap_gem.c index 74082aa35589..c8287438e0dc 100644 --- a/drivers/staging/omapdrm/omap_gem.c +++ b/drivers/staging/omapdrm/omap_gem.c @@ -226,7 +226,8 @@ static int omap_gem_attach_pages(struct drm_gem_object *obj) struct drm_device *dev = obj->dev; struct omap_gem_object *omap_obj = to_omap_bo(obj); struct page **pages; - int i, npages = obj->size >> PAGE_SHIFT; + int npages = obj->size >> PAGE_SHIFT; + int i, ret; dma_addr_t *addrs; WARN_ON(omap_obj->pages); @@ -246,18 +247,32 @@ static int omap_gem_attach_pages(struct drm_gem_object *obj) */ if (omap_obj->flags & (OMAP_BO_WC|OMAP_BO_UNCACHED)) { addrs = kmalloc(npages * sizeof(addrs), GFP_KERNEL); + if (!addrs) { + ret = -ENOMEM; + goto free_pages; + } + for (i = 0; i < npages; i++) { addrs[i] = dma_map_page(dev->dev, pages[i], 0, PAGE_SIZE, DMA_BIDIRECTIONAL); } } else { addrs = kzalloc(npages * sizeof(addrs), GFP_KERNEL); + if (!addrs) { + ret = -ENOMEM; + goto free_pages; + } } omap_obj->addrs = addrs; omap_obj->pages = pages; return 0; + +free_pages: + _drm_gem_put_pages(obj, pages, true, false); + + return ret; } /** release backing pages */ |