Merge branch 'drm-intel-fixes' of git://people.freedesktop.org/~danvet/drm-intel...
[firefly-linux-kernel-4.4.55.git] / drivers / base / dma-contiguous.c
index 34d94c762a1e79415fc00b0fc59caf034a3e186a..612afcc5a938f45549ed877ebd6c8ac697315fe3 100644 (file)
 #include <linux/mm.h>
 #include <linux/mutex.h>
 #include <linux/page-isolation.h>
+#include <linux/sizes.h>
 #include <linux/slab.h>
 #include <linux/swap.h>
 #include <linux/mm_types.h>
 #include <linux/dma-contiguous.h>
 
-#ifndef SZ_1M
-#define SZ_1M (1 << 20)
-#endif
-
 struct cma {
        unsigned long   base_pfn;
        unsigned long   count;
@@ -315,6 +312,7 @@ struct page *dma_alloc_from_contiguous(struct device *dev, int count,
 {
        unsigned long mask, pfn, pageno, start = 0;
        struct cma *cma = dev_get_cma_area(dev);
+       struct page *page = NULL;
        int ret;
 
        if (!cma || !cma->count)
@@ -336,18 +334,17 @@ struct page *dma_alloc_from_contiguous(struct device *dev, int count,
        for (;;) {
                pageno = bitmap_find_next_zero_area(cma->bitmap, cma->count,
                                                    start, count, mask);
-               if (pageno >= cma->count) {
-                       ret = -ENOMEM;
-                       goto error;
-               }
+               if (pageno >= cma->count)
+                       break;
 
                pfn = cma->base_pfn + pageno;
                ret = alloc_contig_range(pfn, pfn + count, MIGRATE_CMA);
                if (ret == 0) {
                        bitmap_set(cma->bitmap, pageno, count);
+                       page = pfn_to_page(pfn);
                        break;
                } else if (ret != -EBUSY) {
-                       goto error;
+                       break;
                }
                pr_debug("%s(): memory range at %p is busy, retrying\n",
                         __func__, pfn_to_page(pfn));
@@ -356,12 +353,8 @@ struct page *dma_alloc_from_contiguous(struct device *dev, int count,
        }
 
        mutex_unlock(&cma_mutex);
-
-       pr_debug("%s(): returned %p\n", __func__, pfn_to_page(pfn));
-       return pfn_to_page(pfn);
-error:
-       mutex_unlock(&cma_mutex);
-       return NULL;
+       pr_debug("%s(): returned %p\n", __func__, page);
+       return page;
 }
 
 /**