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

[Xen-changelog] [xen-unstable] x86 hpet: Avoid use of cpu_possible_map



# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1273911426 -3600
# Node ID b9d57c3c01b91d6a675e8d9053318601f8cb435d
# Parent  b59663d61e825b33fde3e58325e23b5839c302e1
x86 hpet: Avoid use of cpu_possible_map

Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx>
---
 xen/arch/x86/hpet.c |   51 ++++++++++++++-------------------------------------
 1 files changed, 14 insertions(+), 37 deletions(-)

diff -r b59663d61e82 -r b9d57c3c01b9 xen/arch/x86/hpet.c
--- a/xen/arch/x86/hpet.c       Sat May 15 09:16:47 2010 +0100
+++ b/xen/arch/x86/hpet.c       Sat May 15 09:17:06 2010 +0100
@@ -428,16 +428,7 @@ static int hpet_fsb_cap_lookup(void)
         if ( hpet_assign_irq(ch) )
             continue;
 
-        /* set default irq affinity */
-        ch->cpu = num_chs_used;
-        per_cpu(cpu_bc_channel, ch->cpu) = ch;
-        irq_desc[ch->irq].handler->
-            set_affinity(ch->irq, cpumask_of_cpu(ch->cpu));
-
         num_chs_used++;
-
-        if ( num_chs_used == num_possible_cpus() )
-            break;
     }
 
     printk(XENLOG_INFO
@@ -455,6 +446,9 @@ static struct hpet_event_channel *hpet_g
     int i;
     int next;
     struct hpet_event_channel *ch;
+
+    if ( num_hpets_used == 0 )
+        return &legacy_hpet_event;
 
     spin_lock(&next_lock);
     next = next_channel = (next_channel + 1) % num_hpets_used;
@@ -479,8 +473,10 @@ static struct hpet_event_channel *hpet_g
     return ch;
 }
 
-static void hpet_attach_channel_share(int cpu, struct hpet_event_channel *ch)
-{
+static void hpet_attach_channel(int cpu, struct hpet_event_channel *ch)
+{
+    ASSERT(spin_is_locked(&ch->lock));
+
     per_cpu(cpu_bc_channel, cpu) = ch;
 
     /* try to be the channel owner again while holding the lock */
@@ -495,9 +491,10 @@ static void hpet_attach_channel_share(in
         set_affinity(ch->irq, cpumask_of_cpu(ch->cpu));
 }
 
-static void hpet_detach_channel_share(int cpu)
-{
-    struct hpet_event_channel *ch = per_cpu(cpu_bc_channel, cpu);
+static void hpet_detach_channel(int cpu, struct hpet_event_channel *ch)
+{
+    ASSERT(spin_is_locked(&ch->lock));
+    ASSERT(ch == per_cpu(cpu_bc_channel, cpu));
 
     per_cpu(cpu_bc_channel, cpu) = NULL;
 
@@ -516,9 +513,6 @@ static void hpet_detach_channel_share(in
     irq_desc[ch->irq].handler->
         set_affinity(ch->irq, cpumask_of_cpu(ch->cpu));
 }
-
-static void (*hpet_attach_channel)(int cpu, struct hpet_event_channel *ch);
-static void (*hpet_detach_channel)(int cpu);
 
 #include <asm/mc146818rtc.h>
 
@@ -587,12 +581,6 @@ void hpet_broadcast_init(void)
             spin_lock_init(&hpet_events[i].lock);
         }
 
-        if ( num_hpets_used < num_possible_cpus() )
-        {
-            hpet_attach_channel = hpet_attach_channel_share;
-            hpet_detach_channel = hpet_detach_channel_share;
-        }
-
         return;
     }
 
@@ -626,9 +614,6 @@ void hpet_broadcast_init(void)
     legacy_hpet_event.flags = 0;
     spin_lock_init(&legacy_hpet_event.lock);
 
-    for_each_possible_cpu(i)
-        per_cpu(cpu_bc_channel, i) = &legacy_hpet_event;
-
     if ( !force_hpet_broadcast )
         pv_rtc_handler = handle_rtc_once;
 }
@@ -667,16 +652,13 @@ void hpet_broadcast_enter(void)
 
     if ( !ch )
         ch = hpet_get_channel(cpu);
-    BUG_ON( !ch );
 
     ASSERT(!local_irq_is_enabled());
 
-    if ( hpet_attach_channel )
+    if ( ch != &legacy_hpet_event )
     {
         spin_lock(&ch->lock);
-
         hpet_attach_channel(cpu, ch);
-
         spin_unlock(&ch->lock);
     }
 
@@ -702,8 +684,6 @@ void hpet_broadcast_exit(void)
     if ( this_cpu(timer_deadline_start) == 0 )
         return;
 
-    BUG_ON( !ch );
-
     /* Reprogram the deadline; trigger timer work now if it has passed. */
     enable_APIC_timer();
     if ( !reprogram_timer(this_cpu(timer_deadline_start)) )
@@ -717,13 +697,10 @@ void hpet_broadcast_exit(void)
 
     spin_unlock_irq(&ch->lock);
 
-
-    if ( hpet_detach_channel )
+    if ( ch != &legacy_hpet_event )
     {
         spin_lock_irq(&ch->lock);
-
-        hpet_detach_channel(cpu);
-
+        hpet_detach_channel(cpu, ch);
         spin_unlock_irq(&ch->lock);
     }
 }

_______________________________________________
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®.