lkml.org 
[lkml]   [2011]   [Jan]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
Subject[RFC][PATCH 18/18] sched: Sort hotplug vs ttwu queueing
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@chello.nl>
---
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;



\
 
 \ /
  Last update: 2011-01-04 16:15    [W:0.179 / U:0.596 seconds]
©2003-2018 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site