From 308878a60e7409e73e935ed5daa11a5187c80f6b Mon Sep 17 00:00:00 2001 From: Sultan Alsawaf Date: Mon, 26 Apr 2021 16:15:14 -0700 Subject: [PATCH] simple_lmk: Skip victim reduction when all victims need to be killed When there aren't enough pages found, it means all of the victims that were found need to be killed. The additional processing that attempts to reduce the number of victims can be skipped in this case. Signed-off-by: Sultan Alsawaf --- drivers/android/simple_lmk.c | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/drivers/android/simple_lmk.c b/drivers/android/simple_lmk.c index 79b4041040aa..a84bf545d41e 100644 --- a/drivers/android/simple_lmk.c +++ b/drivers/android/simple_lmk.c @@ -54,7 +54,7 @@ static int nr_victims; static atomic_t needs_reclaim = ATOMIC_INIT(0); static atomic_t nr_killed = ATOMIC_INIT(0); -static int victim_size_cmp(const void *lhs_ptr, const void *rhs_ptr) +static int victim_cmp(const void *lhs_ptr, const void *rhs_ptr) { const struct victim_info *lhs = (typeof(lhs))lhs_ptr; const struct victim_info *rhs = (typeof(rhs))rhs_ptr; @@ -137,7 +137,7 @@ static unsigned long find_victims(int *vindex, unsigned short target_adj_min, */ if (pages_found) sort(&victims[old_vindex], *vindex - old_vindex, - sizeof(*victims), victim_size_cmp, NULL); + sizeof(*victims), victim_cmp, NULL); return pages_found; } @@ -187,18 +187,25 @@ static void scan_and_kill(void) return; } - /* First round of victim processing to weed out unneeded victims */ - nr_to_kill = process_victims(nr_found); + /* Minimize the number of victims if we found more pages than needed */ + if (pages_found > MIN_FREE_PAGES) { + /* First round of processing to weed out unneeded victims */ + nr_to_kill = process_victims(nr_found); - /* - * Try to kill as few of the chosen victims as possible by sorting the - * chosen victims by size, which means larger victims that have a lower - * adj can be killed in place of smaller victims with a high adj. - */ - sort(victims, nr_to_kill, sizeof(*victims), victim_size_cmp, NULL); + /* + * Try to kill as few of the chosen victims as possible by + * sorting the chosen victims by size, which means larger + * victims that have a lower adj can be killed in place of + * smaller victims with a high adj. + */ + sort(victims, nr_to_kill, sizeof(*victims), victim_cmp, NULL); - /* Second round of victim processing to finally select the victims */ - nr_to_kill = process_victims(nr_to_kill); + /* Second round of processing to finally select the victims */ + nr_to_kill = process_victims(nr_to_kill); + } else { + /* Too few pages found, so all the victims need to be killed */ + nr_to_kill = nr_found; + } /* Store the final number of victims for simple_lmk_mm_freed() */ write_lock(&mm_free_lock);