summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kernel/sched/core.c2
-rw-r--r--kernel/sched/hmp.c4
2 files changed, 5 insertions, 1 deletions
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 1d91c012b5d8..cec7fe8059a1 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -2325,11 +2325,11 @@ void sched_exit(struct task_struct *p)
reset_task_stats(p);
p->ravg.mark_start = wallclock;
p->ravg.sum_history[0] = EXITING_TASK_MARKER;
- free_task_load_ptrs(p);
enqueue_task(rq, p, 0);
clear_ed_task(p, rq);
task_rq_unlock(rq, p, &flags);
+ free_task_load_ptrs(p);
}
#endif /* CONFIG_SCHED_HMP */
diff --git a/kernel/sched/hmp.c b/kernel/sched/hmp.c
index ae6876e62c0f..70a556f0dd06 100644
--- a/kernel/sched/hmp.c
+++ b/kernel/sched/hmp.c
@@ -1526,6 +1526,10 @@ unsigned int cpu_temp(int cpu)
return 0;
}
+/*
+ * kfree() may wakeup kswapd. So this function should NOT be called
+ * with any CPU's rq->lock acquired.
+ */
void free_task_load_ptrs(struct task_struct *p)
{
kfree(p->ravg.curr_window_cpu);