Skip to contentSkip to conversation

Patch "staging: ion: Fix ion_cma_heap allocations" has been added to the 4.14-stable tree

PATCH [email protected] 1 participant 1 message Feb 28, 2018

Subsystems (2)
lore
Share & tools
lore

[email protected]

author maintainer Applied
#0 lore raw

This is a note to let you know that I've just added the patch titled

staging: ion: Fix ion_cma_heap allocations

to the 4.14-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
staging-ion-fix-ion_cma_heap-allocations.patch
and it can be found in the queue-4.14 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.

Quoted 1 line

From foo@baz Wed Feb 28 16:23:28 CET 2018

From: John Stultz <[email protected]>
Date: Fri, 15 Dec 2017 19:59:47 -0800
Subject: staging: ion: Fix ion_cma_heap allocations

From: John Stultz <[email protected]>

[ Upstream commit f292b9b28097d8fe870336108e91bd95a14294bf ]

In trying to add support for drm_hwcomposer to HiKey, I've needed to utilize the ION CMA heap, and I've noticed problems with allocations on newer kernels failing.

It seems back with 204f672255c2 ("ion: Use CMA APIs directly"), the ion_cma_heap code was modified to use the CMA API, but kept the arguments as buffer lengths rather then number of pages.

This results in errors as we don't have enough pages in CMA to satisfy the exaggerated requests.

This patch converts the ion_cma_heap CMA API usage to properly request pages.

It also fixes a minor issue in the allocation where in the error path, the cma_release is called with the buffer->size value which hasn't yet been set.

Cc Laura Abbott <[email protected]>
Cc Sumit Semwal <[email protected]>
Cc Benjamin Gaignard <[email protected]>
Cc Archit Taneja <[email protected]>
Cc Greg KH <[email protected]>
Cc Daniel Vetter <[email protected]>
Cc Dmitry Shmidt <[email protected]>
Cc Todd Kjos <[email protected]>
Cc Amit Pundir <[email protected]>
Fixes 204f672255c2 ("staging: android: ion: Use CMA APIs directly")
---
 drivers/staging/android/ion/Kconfig        |    2 +-
 drivers/staging/android/ion/ion_cma_heap.c |   15 +++++++++++----
 2 files changed, 12 insertions(+), 5 deletions(-)
drivers/staging/android/ion/Kconfig +1 -1
@@ -37,7 +37,7 @@ config ION_CHUNK_HEAP
 
 config ION_CMA_HEAP
 	bool "Ion CMA heap support"
-	depends on ION && CMA
+	depends on ION && DMA_CMA
 	help
 	  Choose this option to enable CMA heaps with Ion. This heap is backed
 	  by the Contiguous Memory Allocator (CMA). If your system has these
drivers/staging/android/ion/ion_cma_heap.c +11 -4
@@ -39,9 +39,15 @@ static int ion_cma_allocate(struct ion_h
 	struct ion_cma_heap *cma_heap = to_cma_heap(heap);
 	struct sg_table *table;
 	struct page *pages;
+	unsigned long size = PAGE_ALIGN(len);
+	unsigned long nr_pages = size >> PAGE_SHIFT;
+	unsigned long align = get_order(size);
 	int ret;
 
-	pages = cma_alloc(cma_heap->cma, len, 0, GFP_KERNEL);
+	if (align > CONFIG_CMA_ALIGNMENT)
+		align = CONFIG_CMA_ALIGNMENT;
+
+	pages = cma_alloc(cma_heap->cma, nr_pages, align, GFP_KERNEL);
 	if (!pages)
 		return -ENOMEM;
 
@@ -53,7 +59,7 @@ static int ion_cma_allocate(struct ion_h
 	if (ret)
 		goto free_mem;
 
-	sg_set_page(table->sgl, pages, len, 0);
+	sg_set_page(table->sgl, pages, size, 0);
 
 	buffer->priv_virt = pages;
 	buffer->sg_table = table;
@@ -62,7 +68,7 @@ static int ion_cma_allocate(struct ion_h
 free_mem:
 	kfree(table);
 err:
-	cma_release(cma_heap->cma, pages, buffer->size);
+	cma_release(cma_heap->cma, pages, nr_pages);
 	return -ENOMEM;
 }
 
@@ -70,9 +76,10 @@ static void ion_cma_free(struct ion_buff
 {
 	struct ion_cma_heap *cma_heap = to_cma_heap(buffer->heap);
 	struct page *pages = buffer->priv_virt;
+	unsigned long nr_pages = PAGE_ALIGN(buffer->size) >> PAGE_SHIFT;
 
 	/* release memory */
-	cma_release(cma_heap->cma, pages, buffer->size);
+	cma_release(cma_heap->cma, pages, nr_pages);
 	/* release sg table */
 	sg_free_table(buffer->sg_table);
 	kfree(buffer->sg_table);

Patches currently in stable-queue which might be from [email protected] are

queue-4.14/hrtimer-ensure-posix-compliance-relative-clock_realtime-hrtimers.patch queue-4.14/staging-ion-fix-ion_cma_heap-allocations.patch