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

Commit 989a768d authored by Matt Wagantall's avatar Matt Wagantall Committed by Dmitry Shmidt
Browse files

ANDROID: sched/rt: print RT tasks when RT throttling is activated



Existing debug prints do not provide any clues about which tasks
may have triggered RT throttling. Print the names and PIDs of
all tasks on the throttled rt_rq to help narrow down the source
of the problem.

Change-Id: I180534c8a647254ed38e89d0c981a8f8bccd741c
Signed-off-by: default avatarMatt Wagantall <mattw@codeaurora.org>
[rameezmustafa@codeaurora.org]: Port to msm-3.18]
Signed-off-by: default avatarSyed Rameez Mustafa <rameezmustafa@codeaurora.org>
Signed-off-by: default avatarAndres Oportus <andresoportus@google.com>
parent ae8edda2
Loading
Loading
Loading
Loading
+43 −1
Original line number Diff line number Diff line
@@ -899,6 +899,42 @@ static inline int rt_se_prio(struct sched_rt_entity *rt_se)
	return rt_task_of(rt_se)->prio;
}

static void dump_throttled_rt_tasks(struct rt_rq *rt_rq)
{
	struct rt_prio_array *array = &rt_rq->active;
	struct sched_rt_entity *rt_se;
	char buf[500];
	char *pos = buf;
	char *end = buf + sizeof(buf);
	int idx;

	pos += snprintf(pos, sizeof(buf),
		"sched: RT throttling activated for rt_rq %p (cpu %d)\n",
		rt_rq, cpu_of(rq_of_rt_rq(rt_rq)));

	if (bitmap_empty(array->bitmap, MAX_RT_PRIO))
		goto out;

	pos += snprintf(pos, end - pos, "potential CPU hogs:\n");
	idx = sched_find_first_bit(array->bitmap);
	while (idx < MAX_RT_PRIO) {
		list_for_each_entry(rt_se, array->queue + idx, run_list) {
			struct task_struct *p;

			if (!rt_entity_is_task(rt_se))
				continue;

			p = rt_task_of(rt_se);
			if (pos < end)
				pos += snprintf(pos, end - pos, "\t%s (%d)\n",
					p->comm, p->pid);
		}
		idx = find_next_bit(array->bitmap, MAX_RT_PRIO, idx + 1);
	}
out:
	printk_deferred("%s", buf);
}

static int sched_rt_runtime_exceeded(struct rt_rq *rt_rq)
{
	u64 runtime = sched_rt_runtime(rt_rq);
@@ -922,8 +958,14 @@ static int sched_rt_runtime_exceeded(struct rt_rq *rt_rq)
		 * but accrue some time due to boosting.
		 */
		if (likely(rt_b->rt_runtime)) {
			static bool once = false;

			rt_rq->rt_throttled = 1;
			printk_deferred_once("sched: RT throttling activated\n");

			if (!once) {
				once = true;
				dump_throttled_rt_tasks(rt_rq);
			}
		} else {
			/*
			 * In case we did anyway, make it go away,