[PATCH v4] staging: android: ion: Add per-heap counters

Laura Abbott labbott at redhat.com
Wed Oct 3 17:53:25 UTC 2018


On 09/30/2018 08:24 AM, Alexey Skidanov wrote:
> Heap statistics have been removed and currently even basics statistics
> are missing.
> 
> This patch creates per heap debugfs directory /sys/kernel/debug/<heap_name>
> and adds the following counters:
> - the number of allocated buffers;
> - the number of allocated bytes;
> - the number of allocated bytes watermark.
> 

If none of the other Android people have strong opinions

Acked-by: Laura Abbott <labbott at redhat.com>

> Signed-off-by: Alexey Skidanov <alexey.skidanov at intel.com>
> ---
> 
> v3:
> 	Removed debugfs_create_dir() return value checking
> v4:
> 	Added spinlock to protect heap statistics
> 
>   drivers/staging/android/ion/ion.c | 50 ++++++++++++++++++++++++++++++++-------
>   drivers/staging/android/ion/ion.h | 10 +++++++-
>   2 files changed, 51 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/staging/android/ion/ion.c b/drivers/staging/android/ion/ion.c
> index 9907332..6fd8979 100644
> --- a/drivers/staging/android/ion/ion.c
> +++ b/drivers/staging/android/ion/ion.c
> @@ -95,6 +95,13 @@ static struct ion_buffer *ion_buffer_create(struct ion_heap *heap,
>   		goto err1;
>   	}
>   
> +	spin_lock(&heap->stat_lock);
> +	heap->num_of_buffers++;
> +	heap->num_of_alloc_bytes += len;
> +	if (heap->num_of_alloc_bytes > heap->alloc_bytes_wm)
> +		heap->alloc_bytes_wm = heap->num_of_alloc_bytes;
> +	spin_unlock(&heap->stat_lock);
> +
>   	INIT_LIST_HEAD(&buffer->attachments);
>   	mutex_init(&buffer->lock);
>   	mutex_lock(&dev->buffer_lock);
> @@ -117,6 +124,11 @@ void ion_buffer_destroy(struct ion_buffer *buffer)
>   		buffer->heap->ops->unmap_kernel(buffer->heap, buffer);
>   	}
>   	buffer->heap->ops->free(buffer);
> +	spin_lock(&buffer->heap->stat_lock);
> +	buffer->heap->num_of_buffers--;
> +	buffer->heap->num_of_alloc_bytes -= buffer->size;
> +	spin_unlock(&buffer->heap->stat_lock);
> +
>   	kfree(buffer);
>   }
>   
> @@ -528,12 +540,15 @@ void ion_device_add_heap(struct ion_heap *heap)
>   {
>   	struct ion_device *dev = internal_dev;
>   	int ret;
> +	struct dentry *heap_root;
> +	char debug_name[64];
>   
>   	if (!heap->ops->allocate || !heap->ops->free)
>   		pr_err("%s: can not add heap with invalid ops struct.\n",
>   		       __func__);
>   
>   	spin_lock_init(&heap->free_lock);
> +	spin_lock_init(&heap->stat_lock);
>   	heap->free_list_size = 0;
>   
>   	if (heap->flags & ION_HEAP_FLAG_DEFER_FREE)
> @@ -546,6 +561,33 @@ void ion_device_add_heap(struct ion_heap *heap)
>   	}
>   
>   	heap->dev = dev;
> +	heap->num_of_buffers = 0;
> +	heap->num_of_alloc_bytes = 0;
> +	heap->alloc_bytes_wm = 0;
> +
> +	heap_root = debugfs_create_dir(heap->name, dev->debug_root);
> +	debugfs_create_u64("num_of_buffers",
> +			   0444, heap_root,
> +			   &heap->num_of_buffers);
> +	debugfs_create_u64("num_of_alloc_bytes",
> +			   0444,
> +			   heap_root,
> +			   &heap->num_of_alloc_bytes);
> +	debugfs_create_u64("alloc_bytes_wm",
> +			   0444,
> +			   heap_root,
> +			   &heap->alloc_bytes_wm);
> +
> +	if (heap->shrinker.count_objects &&
> +	    heap->shrinker.scan_objects) {
> +		snprintf(debug_name, 64, "%s_shrink", heap->name);
> +		debugfs_create_file(debug_name,
> +				    0644,
> +				    heap_root,
> +				    heap,
> +				    &debug_shrink_fops);
> +	}
> +
>   	down_write(&dev->lock);
>   	heap->id = heap_id++;
>   	/*
> @@ -555,14 +597,6 @@ void ion_device_add_heap(struct ion_heap *heap)
>   	plist_node_init(&heap->node, -heap->id);
>   	plist_add(&heap->node, &dev->heaps);
>   
> -	if (heap->shrinker.count_objects && heap->shrinker.scan_objects) {
> -		char debug_name[64];
> -
> -		snprintf(debug_name, 64, "%s_shrink", heap->name);
> -		debugfs_create_file(debug_name, 0644, dev->debug_root,
> -				    heap, &debug_shrink_fops);
> -	}
> -
>   	dev->heap_cnt++;
>   	up_write(&dev->lock);
>   }
> diff --git a/drivers/staging/android/ion/ion.h b/drivers/staging/android/ion/ion.h
> index 16cbd38..f487127 100644
> --- a/drivers/staging/android/ion/ion.h
> +++ b/drivers/staging/android/ion/ion.h
> @@ -159,6 +159,9 @@ struct ion_heap_ops {
>    * @task:		task struct of deferred free thread
>    * @debug_show:		called when heap debug file is read to add any
>    *			heap specific debug info to output
> + * @num_of_buffers	the number of currently allocated buffers
> + * @num_of_alloc_bytes	the number of allocated bytes
> + * @alloc_bytes_wm	the number of allocated bytes watermark
>    *
>    * Represents a pool of memory from which buffers can be made.  In some
>    * systems the only heap is regular system memory allocated via vmalloc.
> @@ -179,9 +182,14 @@ struct ion_heap {
>   	spinlock_t free_lock;
>   	wait_queue_head_t waitqueue;
>   	struct task_struct *task;
> -
>   	int (*debug_show)(struct ion_heap *heap, struct seq_file *s,
>   			  void *unused);
> +	u64 num_of_buffers;
> +	u64 num_of_alloc_bytes;
> +	u64 alloc_bytes_wm;
> +
> +	/* protect heap statistics */
> +	spinlock_t stat_lock;
>   };
>   
>   /**
> 



More information about the devel mailing list