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

Commit 56dd8109 authored by Vinayak Menon's avatar Vinayak Menon Committed by Zhenhua Huang
Browse files

ion: fix the return value of shrinkers



ION page pool and cma shrinkers return the total pooled
memory instead of the freed. This can result in an early
exit of ION page pool shrinker thus giving back less memory
to the system. For cma shrinker this change doesn't have an
effect since the callers of shrink_slab currently ignores
the return value.

Another, it is to fix a corner case when doing drop caches, eg.
"echo 2/3 > /proc/sys/vm/drop_caches". There is an infinite
loop when freed pages > 10.

Change-Id: I0b3727807d9a5f020623766d27da360d077395f3
Signed-off-by: default avatarVinayak Menon <vinmenon@codeaurora.org>
Signed-off-by: default avatarZhenhua Huang <zhenhuah@codeaurora.org>
parent 4953b87a
Loading
Loading
Loading
Loading
+6 −4
Original line number Diff line number Diff line
@@ -346,8 +346,8 @@ static void ion_secure_cma_free_chunk(struct ion_cma_secure_heap *sheap,
	kfree(chunk);
}

static void __ion_secure_cma_shrink_pool(struct ion_cma_secure_heap *sheap,
					 int max_nr)
static unsigned long
__ion_secure_cma_shrink_pool(struct ion_cma_secure_heap *sheap, int max_nr)
{
	struct list_head *entry, *_n;
	unsigned long drained_size = 0, skipped_size = 0;
@@ -371,6 +371,7 @@ static void __ion_secure_cma_shrink_pool(struct ion_cma_secure_heap *sheap,
	}

	trace_ion_secure_cma_shrink_pool_end(drained_size, skipped_size);
	return drained_size;
}

int ion_secure_cma_drain_pool(struct ion_heap *heap, void *unused)
@@ -388,6 +389,7 @@ int ion_secure_cma_drain_pool(struct ion_heap *heap, void *unused)
static unsigned long ion_secure_cma_shrinker(struct shrinker *shrinker,
					     struct shrink_control *sc)
{
	unsigned long freed;
	struct ion_cma_secure_heap *sheap = container_of(shrinker,
					struct ion_cma_secure_heap, shrinker);
	int nr_to_scan = sc->nr_to_scan;
@@ -400,11 +402,11 @@ static unsigned long ion_secure_cma_shrinker(struct shrinker *shrinker,
	if (!mutex_trylock(&sheap->chunk_lock))
		return -EAGAIN;

	__ion_secure_cma_shrink_pool(sheap, nr_to_scan);
	freed = __ion_secure_cma_shrink_pool(sheap, nr_to_scan);

	mutex_unlock(&sheap->chunk_lock);

	return atomic_read(&sheap->total_pool_size);
	return freed;
}

static unsigned long ion_secure_cma_shrinker_count(struct shrinker *shrinker,