summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorSyed Rameez Mustafa <rameezmustafa@codeaurora.org>2016-10-24 18:37:14 -0700
committerSyed Rameez Mustafa <rameezmustafa@codeaurora.org>2016-10-24 18:44:02 -0700
commit5c647926d044993f9ded013d4531a373e6fcbc1e (patch)
treee949e0a09b2d6c108b13d359c708e294d0784ca3 /kernel
parent46aa49c1188a77f52dc4969f82292c176d8f399b (diff)
sched: Set curr/prev_window_cpu pointers to NULL in sched_exit()
trace_sched_update_task_ravg relies on NULL pointers to ensure that it doesn't access them. Make sure that when a task exits, these pointers are set to NULL. Otherwise any call to update_task_ravg() between sched_exit() and releasing the task structure will access bogus pointers. In some cases those memory locations are unmapped and cause a kernel panic. Change-Id: I9eebb4fb35aca2c8424bfb29ae9d833650dc5ad4 Signed-off-by: Syed Rameez Mustafa <rameezmustafa@codeaurora.org>
Diffstat (limited to 'kernel')
-rw-r--r--kernel/sched/core.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 53f7b50b7541..c07d844c576e 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -2273,6 +2273,14 @@ void sched_exit(struct task_struct *p)
kfree(p->ravg.curr_window_cpu);
kfree(p->ravg.prev_window_cpu);
+ /*
+ * update_task_ravg() can be called for exiting tasks. While the
+ * function itself ensures correct behavior, the corresponding
+ * trace event requires that these pointers be NULL.
+ */
+ p->ravg.curr_window_cpu = NULL;
+ p->ravg.prev_window_cpu = NULL;
+
enqueue_task(rq, p, 0);
clear_ed_task(p, rq);
task_rq_unlock(rq, p, &flags);