return rhs->size - lhs->size;
}
-static bool vtsk_is_duplicate(struct victim_info *varr, int vlen,
- struct task_struct *vtsk)
+static bool vtsk_is_duplicate(int vlen, struct task_struct *vtsk)
{
int i;
for (i = 0; i < vlen; i++) {
- if (same_thread_group(varr[i].tsk, vtsk))
+ if (same_thread_group(victims[i].tsk, vtsk))
return true;
}
return false;
}
-static unsigned long find_victims(struct victim_info *varr, int *vindex,
- int vmaxlen, short target_adj)
+static unsigned long find_victims(int *vindex, short target_adj)
{
unsigned long pages_found = 0;
int old_vindex = *vindex;
* trying to lock a task that we locked earlier.
*/
if (READ_ONCE(tsk->signal->oom_score_adj) != target_adj ||
- vtsk_is_duplicate(varr, *vindex, tsk))
+ vtsk_is_duplicate(*vindex, tsk))
continue;
vtsk = find_lock_task_mm(tsk);
continue;
/* Store this potential victim away for later */
- varr[*vindex].tsk = vtsk;
- varr[*vindex].mm = vtsk->mm;
- varr[*vindex].size = get_mm_rss(vtsk->mm);
+ victims[*vindex].tsk = vtsk;
+ victims[*vindex].mm = vtsk->mm;
+ victims[*vindex].size = get_mm_rss(vtsk->mm);
/* Keep track of the number of pages that have been found */
- pages_found += varr[*vindex].size;
+ pages_found += victims[*vindex].size;
/* Make sure there's space left in the victim array */
- if (++*vindex == vmaxlen)
+ if (++*vindex == MAX_VICTIMS)
break;
}
* the larger ones first.
*/
if (pages_found)
- sort(&varr[old_vindex], *vindex - old_vindex, sizeof(*varr),
- victim_size_cmp, NULL);
+ sort(&victims[old_vindex], *vindex - old_vindex,
+ sizeof(*victims), victim_size_cmp, NULL);
return pages_found;
}
-static int process_victims(struct victim_info *varr, int vlen,
- unsigned long pages_needed)
+static int process_victims(int vlen, unsigned long pages_needed)
{
unsigned long pages_found = 0;
int i, nr_to_kill = 0;
*/
read_lock(&tasklist_lock);
for (i = 0; i < ARRAY_SIZE(adj_prio); i++) {
- pages_found += find_victims(victims, &nr_victims, MAX_VICTIMS,
- adj_prio[i]);
+ pages_found += find_victims(&nr_victims, adj_prio[i]);
if (pages_found >= pages_needed || nr_victims == MAX_VICTIMS)
break;
}
return;
/* First round of victim processing to weed out unneeded victims */
- nr_to_kill = process_victims(victims, nr_victims, pages_needed);
+ nr_to_kill = process_victims(nr_victims, pages_needed);
/*
* Try to kill as few of the chosen victims as possible by sorting the
sort(victims, nr_to_kill, sizeof(*victims), victim_size_cmp, NULL);
/* Second round of victim processing to finally select the victims */
- nr_to_kill = process_victims(victims, nr_to_kill, pages_needed);
+ nr_to_kill = process_victims(nr_to_kill, pages_needed);
/* Kill the victims */
atomic_set_release(&victims_to_kill, nr_to_kill);
static atomic_t init_done = ATOMIC_INIT(0);
struct task_struct *thread;
- if (atomic_cmpxchg(&init_done, 0, 1))
- return 0;
-
- thread = kthread_run_perf_critical(simple_lmk_reclaim_thread, NULL,
- "simple_lmkd");
- BUG_ON(IS_ERR(thread));
+ if (!atomic_cmpxchg(&init_done, 0, 1)) {
+ thread = kthread_run_perf_critical(simple_lmk_reclaim_thread,
+ NULL, "simple_lmkd");
+ BUG_ON(IS_ERR(thread));
+ }
return 0;
}