Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 34cae66f authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "mm: cma: print allocation failure reason and bitmap status"

parents d8f6597f efb354d8
Loading
Loading
Loading
Loading
+33 −1
Original line number Diff line number Diff line
@@ -358,6 +358,32 @@ int __init cma_declare_contiguous(phys_addr_t base,
	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.
@@ -374,8 +400,8 @@ 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 retry_after_sleep = 0;
	int ret = -ENOMEM;

	if (!cma || !cma->count)
		return NULL;
@@ -452,6 +478,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;
}