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

Commit aeb7fa7b authored by Gioh Kim's avatar Gioh Kim Committed by Greg Kroah-Hartman
Browse files

staging: ion: debugfs to shrink pool



This patch enables debugfs file /sys/kernel/debug/ion/heaps/system_shrink
to shrink pool and get pool size. This technically enables debugfs
shrinking for all heaps, not just the system heap although the system heap
is the only one with a shrinker right now. It is already implemented
but not complete. This patch completes and enables it.

Reading the file returns pool size
in page unit and writing the number of pages shrinks pool.
It flushes all pages to write zero at the file.

Signed-off-by: default avatarGioh Kim <gioh.kim@lge.com>
Reviewed-by: default avatarLaura Abbott <labbott@redhat.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent b44d9ce3
Loading
Loading
Loading
Loading
+9 −13
Original line number Original line Diff line number Diff line
@@ -1466,7 +1466,6 @@ static const struct file_operations debug_heap_fops = {
	.release = single_release,
	.release = single_release,
};
};


#ifdef DEBUG_HEAP_SHRINKER
static int debug_shrink_set(void *data, u64 val)
static int debug_shrink_set(void *data, u64 val)
{
{
	struct ion_heap *heap = data;
	struct ion_heap *heap = data;
@@ -1474,15 +1473,14 @@ static int debug_shrink_set(void *data, u64 val)
	int objs;
	int objs;


	sc.gfp_mask = -1;
	sc.gfp_mask = -1;
	sc.nr_to_scan = 0;
	sc.nr_to_scan = val;

	if (!val)
		return 0;


	objs = heap->shrinker.shrink(&heap->shrinker, &sc);
	if (!val) {
		objs = heap->shrinker.count_objects(&heap->shrinker, &sc);
		sc.nr_to_scan = objs;
		sc.nr_to_scan = objs;
	}


	heap->shrinker.shrink(&heap->shrinker, &sc);
	heap->shrinker.scan_objects(&heap->shrinker, &sc);
	return 0;
	return 0;
}
}


@@ -1495,14 +1493,13 @@ static int debug_shrink_get(void *data, u64 *val)
	sc.gfp_mask = -1;
	sc.gfp_mask = -1;
	sc.nr_to_scan = 0;
	sc.nr_to_scan = 0;


	objs = heap->shrinker.shrink(&heap->shrinker, &sc);
	objs = heap->shrinker.count_objects(&heap->shrinker, &sc);
	*val = objs;
	*val = objs;
	return 0;
	return 0;
}
}


DEFINE_SIMPLE_ATTRIBUTE(debug_shrink_fops, debug_shrink_get,
DEFINE_SIMPLE_ATTRIBUTE(debug_shrink_fops, debug_shrink_get,
			debug_shrink_set, "%llu\n");
			debug_shrink_set, "%llu\n");
#endif


void ion_device_add_heap(struct ion_device *dev, struct ion_heap *heap)
void ion_device_add_heap(struct ion_device *dev, struct ion_heap *heap)
{
{
@@ -1540,8 +1537,7 @@ void ion_device_add_heap(struct ion_device *dev, struct ion_heap *heap)
			path, heap->name);
			path, heap->name);
	}
	}


#ifdef DEBUG_HEAP_SHRINKER
	if (heap->shrinker.count_objects && heap->shrinker.scan_objects) {
	if (heap->shrinker.shrink) {
		char debug_name[64];
		char debug_name[64];


		snprintf(debug_name, 64, "%s_shrink", heap->name);
		snprintf(debug_name, 64, "%s_shrink", heap->name);
@@ -1556,7 +1552,7 @@ void ion_device_add_heap(struct ion_device *dev, struct ion_heap *heap)
				path, debug_name);
				path, debug_name);
		}
		}
	}
	}
#endif

	up_write(&dev->lock);
	up_write(&dev->lock);
}
}