|
@@ -348,6 +348,32 @@ err:
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+#ifdef CONFIG_CMA_DEBUG
|
|
|
+static void cma_debug_show_areas(struct cma *cma)
|
|
|
+{
|
|
|
+ unsigned long next_zero_bit, next_set_bit;
|
|
|
+ unsigned long start = 0;
|
|
|
+ unsigned int nr_zero, nr_total = 0;
|
|
|
+
|
|
|
+ mutex_lock(&cma->lock);
|
|
|
+ pr_info("number of available pages: ");
|
|
|
+ for (;;) {
|
|
|
+ next_zero_bit = find_next_zero_bit(cma->bitmap, cma->count, start);
|
|
|
+ if (next_zero_bit >= cma->count)
|
|
|
+ break;
|
|
|
+ next_set_bit = find_next_bit(cma->bitmap, cma->count, next_zero_bit);
|
|
|
+ nr_zero = next_set_bit - next_zero_bit;
|
|
|
+ pr_cont("%s%u@%lu", nr_total ? "+" : "", nr_zero, next_zero_bit);
|
|
|
+ nr_total += nr_zero;
|
|
|
+ start = next_zero_bit + nr_zero;
|
|
|
+ }
|
|
|
+ pr_cont("=> %u free of %lu total pages\n", nr_total, cma->count);
|
|
|
+ mutex_unlock(&cma->lock);
|
|
|
+}
|
|
|
+#else
|
|
|
+static inline void cma_debug_show_areas(struct cma *cma) { }
|
|
|
+#endif
|
|
|
+
|
|
|
/**
|
|
|
* cma_alloc() - allocate pages from contiguous area
|
|
|
* @cma: Contiguous memory region for which the allocation is performed.
|
|
@@ -365,7 +391,7 @@ struct page *cma_alloc(struct cma *cma, size_t count, unsigned int align,
|
|
|
unsigned long start = 0;
|
|
|
unsigned long bitmap_maxno, bitmap_no, bitmap_count;
|
|
|
struct page *page = NULL;
|
|
|
- int ret;
|
|
|
+ int ret = -ENOMEM;
|
|
|
|
|
|
if (!cma || !cma->count)
|
|
|
return NULL;
|
|
@@ -423,6 +449,12 @@ struct page *cma_alloc(struct cma *cma, size_t count, unsigned int align,
|
|
|
|
|
|
trace_cma_alloc(pfn, page, count, align);
|
|
|
|
|
|
+ if (ret) {
|
|
|
+ pr_info("%s: alloc failed, req-size: %zu pages, ret: %d\n",
|
|
|
+ __func__, count, ret);
|
|
|
+ cma_debug_show_areas(cma);
|
|
|
+ }
|
|
|
+
|
|
|
pr_debug("%s(): returned %p\n", __func__, page);
|
|
|
return page;
|
|
|
}
|