[RFC][PATCH 18/18] sched: Sort hotplug vs ttwu queueing

From: Peter Zijlstra
Date: Tue Jan 04 2011 - 10:13:34 EST


On hot-unplug flush the pending wakeup queue by selecting a new rq for
each of them and requeueing them appropriately.

Signed-off-by: Peter Zijlstra <a.p.zijlstra@xxxxxxxxx>
---
kernel/sched.c | 28 ++++++++++++++++++++++++++++
1 file changed, 28 insertions(+)

Index: linux-2.6/kernel/sched.c
===================================================================
--- linux-2.6.orig/kernel/sched.c
+++ linux-2.6/kernel/sched.c
@@ -2526,6 +2526,29 @@ static void ttwu_queue(struct task_struc
raw_spin_unlock(&rq->lock);
}

+#ifdef CONFIG_HOTPLUG_CPU
+static void ttwu_queue_unplug(struct rq *rq)
+{
+ struct task_struct *p, *list = xchg(&rq->wake_list, NULL);
+ unsigned long flags;
+ int cpu;
+
+ if (!list)
+ return;
+
+ while (list) {
+ p = list;
+ list = list->wake_entry;
+
+ raw_spin_lock_irqsave(&p->pi_lock, flags);
+ cpu = select_task_rq(p, SD_BALANCE_WAKE, 0);
+ set_task_cpu(p, cpu);
+ ttwu_queue(p, cpu);
+ raw_spin_unlock_irqrestore(&p->pi_lock, flags);
+ }
+}
+#endif
+
/**
* try_to_wake_up - wake up a thread
* @p: the thread to be awakened
@@ -6151,6 +6174,11 @@ migration_call(struct notifier_block *nf
migrate_nr_uninterruptible(rq);
calc_global_load_remove(rq);
break;
+
+ case CPU_DEAD:
+ ttwu_queue_unplug(cpu_rq(cpu));
+ break;
+
#endif
}
return NOTIFY_OK;


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/