From: Chris Redpath chris.redpath@arm.com
We use get_task_struct to increment the ref count on a task_struct so that even if the task dies with a pending migration we are still able to read the memory without causing a fault.
In the case of non-running tasks, we forgot to decrement the ref count when we are done with the task.
Signed-off-by: Chris Redpath chris.redpath@arm.com Signed-off-by: Jon Medhurst tixy@linaro.org --- kernel/sched/fair.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index a2d2b34..e661499 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -7061,13 +7061,13 @@ static void hmp_migrate_runnable_task(struct rq *rq) * with the source rq. */ if (src_rq->active_balance) - return; + goto out;
if (src_rq->nr_running <= 1) - return; + goto out;
if (task_rq(p) != src_rq) - return; + goto out; /* * Not sure if this applies here but one can never * be too cautious @@ -7102,6 +7102,8 @@ static void hmp_migrate_runnable_task(struct rq *rq)
rcu_read_unlock(); double_unlock_balance(src_rq, dst_rq); +out: + put_task_struct(p); }
static DEFINE_SPINLOCK(hmp_force_migration);