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

Commit 9d705ba7 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "ANDROID: Fixes to locking around handle_lmk_event"

parents a7d96b8f e9701ca4
Loading
Loading
Loading
Loading
+20 −20
Original line number Diff line number Diff line
@@ -119,20 +119,26 @@ struct lmk_event {
	struct list_head list;
};

void handle_lmk_event(struct task_struct *selected, short min_score_adj)
void handle_lmk_event(struct task_struct *selected, int selected_tasksize,
		      short min_score_adj)
{
	int head;
	int tail;
	struct lmk_event *events;
	struct lmk_event *event;
	int res;
	long rss_in_pages = -1;
	struct mm_struct *mm = get_task_mm(selected);
	char taskname[MAX_TASKNAME];

	if (mm) {
		rss_in_pages = get_mm_rss(mm);
		mmput(mm);
	}
	res = get_cmdline(selected, taskname, MAX_TASKNAME - 1);

	/* No valid process name means this is definitely not associated with a
	 * userspace activity.
	 */

	if (res <= 0 || res >= MAX_TASKNAME)
		return;

	taskname[res] = '\0';

	spin_lock(&lmk_event_lock);

@@ -148,18 +154,8 @@ void handle_lmk_event(struct task_struct *selected, short min_score_adj)
	events = (struct lmk_event *) event_buffer.buf;
	event = &events[head];

	res = get_cmdline(selected, event->taskname, MAX_TASKNAME - 1);
	memcpy(event->taskname, taskname, res + 1);

	/* No valid process name means this is definitely not associated with a
	 * userspace activity.
	 */

	if (res <= 0 || res >= MAX_TASKNAME) {
		spin_unlock(&lmk_event_lock);
		return;
	}

	event->taskname[res] = '\0';
	event->pid = selected->pid;
	event->uid = from_kuid_munged(current_user_ns(), task_uid(selected));
	if (selected->group_leader)
@@ -170,7 +166,7 @@ void handle_lmk_event(struct task_struct *selected, short min_score_adj)
	event->maj_flt = selected->maj_flt;
	event->oom_score_adj = selected->signal->oom_score_adj;
	event->start_time = nsec_to_clock_t(selected->real_start_time);
	event->rss_in_pages = rss_in_pages;
	event->rss_in_pages = selected_tasksize;
	event->min_score_adj = min_score_adj;

	event_buffer.head = (head + 1) & (MAX_BUFFERED_EVENTS - 1);
@@ -786,7 +782,7 @@ static unsigned long lowmem_scan(struct shrinker *s, struct shrink_control *sc)
		lowmem_deathpending_timeout = jiffies + HZ;
		rem += selected_tasksize;
		rcu_read_unlock();
		handle_lmk_event(selected, min_score_adj);
		get_task_struct(selected);
		/* give the system time to free up the memory */
		msleep_interruptible(20);
		trace_almk_shrink(selected_tasksize, ret,
@@ -801,6 +797,10 @@ static unsigned long lowmem_scan(struct shrinker *s, struct shrink_control *sc)
		     sc->nr_to_scan, sc->gfp_mask, rem);
	mutex_unlock(&scan_mutex);

	if (selected) {
		handle_lmk_event(selected, selected_tasksize, min_score_adj);
		put_task_struct(selected);
	}
	return rem;
}