[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-unstable] timer: Don't hardcode cpu0 in migrate_timers_from_cpu().



# HG changeset patch
# User Keir Fraser <keir@xxxxxxx>
# Date 1294483381 0
# Node ID 1a64415c959f264ec324e589060fab6417039705
# Parent  0e49e25904623af4b03b614c10c54fce77f05909
timer: Don't hardcode cpu0 in migrate_timers_from_cpu().

Although we don't allow cpu0 to be offlined, there's no need to
hardcode that assumption in the timer subsystem.

Signed-off-by: Keir Fraser <keir@xxxxxxx>
---
 xen/common/timer.c |   56 ++++++++++++++++++++++++++++++++---------------------
 1 files changed, 34 insertions(+), 22 deletions(-)

diff -r 0e49e2590462 -r 1a64415c959f xen/common/timer.c
--- a/xen/common/timer.c        Sat Jan 08 10:09:44 2011 +0000
+++ b/xen/common/timer.c        Sat Jan 08 10:43:01 2011 +0000
@@ -546,39 +546,51 @@ static struct keyhandler dump_timerq_key
     .desc = "dump timer queues"
 };
 
-static void migrate_timers_from_cpu(unsigned int cpu)
-{
-    struct timers *ts;
+static void migrate_timers_from_cpu(unsigned int old_cpu)
+{
+    unsigned int new_cpu = first_cpu(cpu_online_map);
+    struct timers *old_ts, *new_ts;
     struct timer *t;
     bool_t notify = 0;
 
-    ASSERT((cpu != 0) && cpu_online(0));
-
-    ts = &per_cpu(timers, cpu);
-
-    spin_lock_irq(&per_cpu(timers, 0).lock);
-    spin_lock(&ts->lock);
-
-    while ( (t = GET_HEAP_SIZE(ts->heap) ? ts->heap[1] : ts->list) != NULL )
+    ASSERT(!cpu_online(old_cpu) && cpu_online(new_cpu));
+
+    old_ts = &per_cpu(timers, old_cpu);
+    new_ts = &per_cpu(timers, new_cpu);
+
+    if ( old_cpu < new_cpu )
+    {
+        spin_lock_irq(&old_ts->lock);
+        spin_lock(&new_ts->lock);
+    }
+    else
+    {
+        spin_lock_irq(&new_ts->lock);
+        spin_lock(&old_ts->lock);
+    }
+
+    while ( (t = GET_HEAP_SIZE(old_ts->heap)
+             ? old_ts->heap[1] : old_ts->list) != NULL )
     {
         remove_entry(t);
-        atomic_write16(&t->cpu, 0);
+        atomic_write16(&t->cpu, new_cpu);
         notify |= add_entry(t);
     }
 
-    while ( !list_empty(&ts->inactive) )
-    {
-        t = list_entry(ts->inactive.next, struct timer, inactive);
+    while ( !list_empty(&old_ts->inactive) )
+    {
+        t = list_entry(old_ts->inactive.next, struct timer, inactive);
         list_del(&t->inactive);
-        atomic_write16(&t->cpu, 0);
-        list_add(&t->inactive, &per_cpu(timers, 0).inactive);
-    }
-
-    spin_unlock(&ts->lock);
-    spin_unlock_irq(&per_cpu(timers, 0).lock);
+        atomic_write16(&t->cpu, new_cpu);
+        list_add(&t->inactive, &new_ts->inactive);
+    }
+
+    spin_unlock(&old_ts->lock);
+    spin_unlock_irq(&new_ts->lock);
+    local_irq_enable();
 
     if ( notify )
-        cpu_raise_softirq(0, TIMER_SOFTIRQ);
+        cpu_raise_softirq(new_cpu, TIMER_SOFTIRQ);
 }
 
 static struct timer *dummy_heap;

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.