aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kernel/sched/rt.c20
1 files changed, 19 insertions, 1 deletions
diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c
index 692fb1e77..c1b6096fc 100644
--- a/kernel/sched/rt.c
+++ b/kernel/sched/rt.c
@@ -2401,6 +2401,7 @@ static int push_rt_task(struct rq *rq)
struct task_struct *next_task;
struct rq *lowest_rq;
int ret = 0;
+ bool moved = false;
if (!rq->rt.overloaded)
return 0;
@@ -2465,6 +2466,7 @@ retry:
deactivate_task(rq, next_task, 0);
set_task_cpu(next_task, lowest_rq->cpu);
+ moved = true;
activate_task(lowest_rq, next_task, 0);
ret = 1;
@@ -2475,6 +2477,11 @@ retry:
out:
put_task_struct(next_task);
+ if (moved && task_notify_on_migrate(next_task))
+ atomic_notifier_call_chain(&migration_notifier_head,
+ cpu_of(lowest_rq),
+ (void *)cpu_of(rq));
+
return ret;
}
@@ -2614,9 +2621,11 @@ static int pull_rt_task(struct rq *this_rq)
int ret = 0;
#ifndef CONFIG_MT_RT_SCHED
int cpu;
- struct task_struct *p;
+ struct task_struct *p = NULL;
struct rq *src_rq;
#endif
+ bool moved = false;
+ int src_cpu = 0;
mt_sched_printf(sched_rt_info, "0. pull_rt_task %d %d ",
rt_overloaded(this_rq), this_rq->cpu);
@@ -2689,6 +2698,10 @@ static int pull_rt_task(struct rq *this_rq)
deactivate_task(src_rq, p, 0);
set_task_cpu(p, this_cpu);
activate_task(this_rq, p, 0);
+
+ moved = true;
+ src_cpu = cpu_of(src_rq);
+
/*
* We continue with the search, just in
* case there's an even higher prio task
@@ -2701,6 +2714,11 @@ skip:
}
#endif
+ if (moved && task_notify_on_migrate(p))
+ atomic_notifier_call_chain(&migration_notifier_head,
+ this_cpu,
+ (void *)src_cpu);
+
return ret;
}