diff options
| author | Colin Cross <ccross@android.com> | 2013-08-14 14:03:55 -0700 | 
|---|---|---|
| committer | Colin Cross <ccross@android.com> | 2013-09-19 23:03:30 -0500 | 
| commit | f526a55b400d166dafc6062e5818a2410555ef39 (patch) | |
| tree | d815480a10e21ce5bc58fefcb297709d69b4b976 /drivers/gpu | |
| parent | 6ebfe5864ae65ad31e1e5526f0f45a5f735c9a5b (diff) | |
| download | olio-linux-3.10-f526a55b400d166dafc6062e5818a2410555ef39.tar.xz olio-linux-3.10-f526a55b400d166dafc6062e5818a2410555ef39.zip | |
ion: chunk_heap: fix leak in allocated counter
buffer->size is controlled by the outer ion layer, don't modify it
inside the heap.  Instead, compute the rounded up allocated size
on demand.
Change-Id: I288ffc1221ce96cfe2591468502ac3279065bde4
Signed-off-by: Colin Cross <ccross@android.com>
Diffstat (limited to 'drivers/gpu')
| -rw-r--r-- | drivers/gpu/ion/ion_chunk_heap.c | 15 | 
1 files changed, 9 insertions, 6 deletions
| diff --git a/drivers/gpu/ion/ion_chunk_heap.c b/drivers/gpu/ion/ion_chunk_heap.c index d5e7379a6f4..15c9d7ad250 100644 --- a/drivers/gpu/ion/ion_chunk_heap.c +++ b/drivers/gpu/ion/ion_chunk_heap.c @@ -47,15 +47,15 @@ static int ion_chunk_heap_allocate(struct ion_heap *heap,  	struct scatterlist *sg;  	int ret, i;  	unsigned long num_chunks; +	unsigned long allocated_size;  	if (ion_buffer_fault_user_mappings(buffer))  		return -ENOMEM; -	num_chunks = ALIGN(size, chunk_heap->chunk_size) / -		chunk_heap->chunk_size; -	buffer->size = num_chunks * chunk_heap->chunk_size; +	allocated_size = ALIGN(size, chunk_heap->chunk_size); +	num_chunks = allocated_size / chunk_heap->chunk_size; -	if (buffer->size > chunk_heap->size - chunk_heap->allocated) +	if (allocated_size > chunk_heap->size - chunk_heap->allocated)  		return -ENOMEM;  	table = kzalloc(sizeof(struct sg_table), GFP_KERNEL); @@ -78,7 +78,7 @@ static int ion_chunk_heap_allocate(struct ion_heap *heap,  	}  	buffer->priv_virt = table; -	chunk_heap->allocated += buffer->size; +	chunk_heap->allocated += allocated_size;  	return 0;  err:  	sg = table->sgl; @@ -100,6 +100,9 @@ static void ion_chunk_heap_free(struct ion_buffer *buffer)  	struct sg_table *table = buffer->priv_virt;  	struct scatterlist *sg;  	int i; +	unsigned long allocated_size; + +	allocated_size = ALIGN(buffer->size, chunk_heap->chunk_size);  	ion_heap_buffer_zero(buffer); @@ -111,7 +114,7 @@ static void ion_chunk_heap_free(struct ion_buffer *buffer)  		gen_pool_free(chunk_heap->pool, page_to_phys(sg_page(sg)),  			      sg_dma_len(sg));  	} -	chunk_heap->allocated -= buffer->size; +	chunk_heap->allocated -= allocated_size;  	sg_free_table(table);  	kfree(table);  } |