|
@@ -702,7 +702,7 @@ struct rq {
|
|
|
#endif
|
|
|
|
|
|
#ifdef CONFIG_SMP
|
|
|
- struct task_struct *wake_list;
|
|
|
+ struct llist_head wake_list;
|
|
|
#endif
|
|
|
};
|
|
|
|
|
@@ -2698,42 +2698,26 @@ static int ttwu_remote(struct task_struct *p, int wake_flags)
|
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_SMP
|
|
|
-static void sched_ttwu_do_pending(struct task_struct *list)
|
|
|
+static void sched_ttwu_pending(void)
|
|
|
{
|
|
|
struct rq *rq = this_rq();
|
|
|
+ struct llist_node *llist = llist_del_all(&rq->wake_list);
|
|
|
+ struct task_struct *p;
|
|
|
|
|
|
raw_spin_lock(&rq->lock);
|
|
|
|
|
|
- while (list) {
|
|
|
- struct task_struct *p = list;
|
|
|
- list = list->wake_entry;
|
|
|
+ while (llist) {
|
|
|
+ p = llist_entry(llist, struct task_struct, wake_entry);
|
|
|
+ llist = llist_next(llist);
|
|
|
ttwu_do_activate(rq, p, 0);
|
|
|
}
|
|
|
|
|
|
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)
|
|
|
{
|
|
|
- struct rq *rq = this_rq();
|
|
|
- struct task_struct *list = xchg(&rq->wake_list, NULL);
|
|
|
-
|
|
|
- if (!list)
|
|
|
+ if (llist_empty(&this_rq()->wake_list))
|
|
|
return;
|
|
|
|
|
|
/*
|
|
@@ -2750,25 +2734,13 @@ void scheduler_ipi(void)
|
|
|
* somewhat pessimize the simple resched case.
|
|
|
*/
|
|
|
irq_enter();
|
|
|
- sched_ttwu_do_pending(list);
|
|
|
+ sched_ttwu_pending();
|
|
|
irq_exit();
|
|
|
}
|
|
|
|
|
|
static void ttwu_queue_remote(struct task_struct *p, int cpu)
|
|
|
{
|
|
|
- struct rq *rq = cpu_rq(cpu);
|
|
|
- struct task_struct *next = rq->wake_list;
|
|
|
-
|
|
|
- for (;;) {
|
|
|
- struct task_struct *old = next;
|
|
|
-
|
|
|
- p->wake_entry = next;
|
|
|
- next = cmpxchg(&rq->wake_list, old, p);
|
|
|
- if (next == old)
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- if (!next)
|
|
|
+ if (llist_add(&p->wake_entry, &cpu_rq(cpu)->wake_list))
|
|
|
smp_send_reschedule(cpu);
|
|
|
}
|
|
|
|