|
@@ -2544,13 +2544,9 @@ static int ttwu_remote(struct task_struct *p, int wake_flags)
|
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_SMP
|
|
|
-static void sched_ttwu_pending(void)
|
|
|
+static void sched_ttwu_do_pending(struct task_struct *list)
|
|
|
{
|
|
|
struct rq *rq = this_rq();
|
|
|
- struct task_struct *list = xchg(&rq->wake_list, NULL);
|
|
|
-
|
|
|
- if (!list)
|
|
|
- return;
|
|
|
|
|
|
raw_spin_lock(&rq->lock);
|
|
|
|
|
@@ -2563,9 +2559,45 @@ static void sched_ttwu_pending(void)
|
|
|
raw_spin_unlock(&rq->lock);
|
|
|
}
|
|
|
|
|
|
+#ifdef CONFIG_HOTPLUG_CPU
|
|
|
+
|
|
|
+static void sched_ttwu_pending(void)
|
|
|
+{
|
|
|
+ struct rq *rq = this_rq();
|
|
|
+ struct task_struct *list = xchg(&rq->wake_list, NULL);
|
|
|
+
|
|
|
+ if (!list)
|
|
|
+ return;
|
|
|
+
|
|
|
+ sched_ttwu_do_pending(list);
|
|
|
+}
|
|
|
+
|
|
|
+#endif /* CONFIG_HOTPLUG_CPU */
|
|
|
+
|
|
|
void scheduler_ipi(void)
|
|
|
{
|
|
|
- sched_ttwu_pending();
|
|
|
+ struct rq *rq = this_rq();
|
|
|
+ struct task_struct *list = xchg(&rq->wake_list, NULL);
|
|
|
+
|
|
|
+ if (!list)
|
|
|
+ return;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Not all reschedule IPI handlers call irq_enter/irq_exit, since
|
|
|
+ * traditionally all their work was done from the interrupt return
|
|
|
+ * path. Now that we actually do some work, we need to make sure
|
|
|
+ * we do call them.
|
|
|
+ *
|
|
|
+ * Some archs already do call them, luckily irq_enter/exit nest
|
|
|
+ * properly.
|
|
|
+ *
|
|
|
+ * Arguably we should visit all archs and update all handlers,
|
|
|
+ * however a fair share of IPIs are still resched only so this would
|
|
|
+ * somewhat pessimize the simple resched case.
|
|
|
+ */
|
|
|
+ irq_enter();
|
|
|
+ sched_ttwu_do_pending(list);
|
|
|
+ irq_exit();
|
|
|
}
|
|
|
|
|
|
static void ttwu_queue_remote(struct task_struct *p, int cpu)
|