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

[Xen-changelog] [xen-unstable] move register_cpu_notifier() into .init.text



# HG changeset patch
# User Jan Beulich <jbeulich@xxxxxxxxxx>
# Date 1301756223 -3600
# Node ID f5d33782a57b19ab33f8c980504597539edf78d9
# Parent  c80281a99feb5964427390f5cd7900db907b47ee
move register_cpu_notifier() into .init.text

With no modular drivers, all CPU notifier setup is supposed to happen
during boot. There also is a respective comment in the function.=20

Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx>
---


diff -r c80281a99feb -r f5d33782a57b xen/arch/x86/nmi.c
--- a/xen/arch/x86/nmi.c        Sat Apr 02 15:56:32 2011 +0100
+++ b/xen/arch/x86/nmi.c        Sat Apr 02 15:57:03 2011 +0100
@@ -389,13 +389,13 @@
 
 void watchdog_enable(void)
 {
-    static unsigned long heartbeat_initialised;
+    atomic_dec(&watchdog_disable_count);
+}
+
+void __init watchdog_setup(void)
+{
     unsigned int cpu;
 
-    if ( !atomic_dec_and_test(&watchdog_disable_count) ||
-         test_and_set_bit(0, &heartbeat_initialised) )
-        return;
-
     /*
      * Activate periodic heartbeats. We cannot do this earlier during 
      * setup because the timer infrastructure is not available.
@@ -403,6 +403,8 @@
     for_each_online_cpu ( cpu )
         cpu_nmi_callback(&cpu_nmi_nfb, CPU_UP_PREPARE, (void *)(long)cpu);
     register_cpu_notifier(&cpu_nmi_nfb);
+
+    watchdog_enable();
 }
 
 void nmi_watchdog_tick(struct cpu_user_regs * regs)
diff -r c80281a99feb -r f5d33782a57b xen/arch/x86/setup.c
--- a/xen/arch/x86/setup.c      Sat Apr 02 15:56:32 2011 +0100
+++ b/xen/arch/x86/setup.c      Sat Apr 02 15:57:03 2011 +0100
@@ -1259,7 +1259,7 @@
     do_initcalls();
 
     if ( opt_watchdog ) 
-        watchdog_enable();
+        watchdog_setup();
     
     if ( !tboot_protect_mem_regions() )
         panic("Could not protect TXT memory regions\n");
diff -r c80281a99feb -r f5d33782a57b xen/common/cpu.c
--- a/xen/common/cpu.c  Sat Apr 02 15:56:32 2011 +0100
+++ b/xen/common/cpu.c  Sat Apr 02 15:57:03 2011 +0100
@@ -2,6 +2,7 @@
 #include <xen/cpumask.h>
 #include <xen/cpu.h>
 #include <xen/event.h>
+#include <xen/init.h>
 #include <xen/sched.h>
 #include <xen/stop_machine.h>
 
@@ -53,7 +54,7 @@
 
 static NOTIFIER_HEAD(cpu_chain);
 
-void register_cpu_notifier(struct notifier_block *nb)
+void __init register_cpu_notifier(struct notifier_block *nb)
 {
     if ( !spin_trylock(&cpu_add_remove_lock) )
         BUG(); /* Should never fail as we are called only during boot. */
diff -r c80281a99feb -r f5d33782a57b xen/common/notifier.c
--- a/xen/common/notifier.c     Sat Apr 02 15:56:32 2011 +0100
+++ b/xen/common/notifier.c     Sat Apr 02 15:57:03 2011 +0100
@@ -19,7 +19,7 @@
  * Adds a notifier to a raw notifier chain.
  * All locking must be provided by the caller.
  */
-void notifier_chain_register(
+void __init notifier_chain_register(
     struct notifier_head *nh, struct notifier_block *n)
 {
     struct list_head *chain = &nh->head.chain;
@@ -44,7 +44,7 @@
  * Removes a notifier from a raw notifier chain.
  * All locking must be provided by the caller.
  */
-void notifier_chain_unregister(
+void __init notifier_chain_unregister(
     struct notifier_head *nh, struct notifier_block *n)
 {
     list_del(&n->chain);
diff -r c80281a99feb -r f5d33782a57b xen/common/sched_credit2.c
--- a/xen/common/sched_credit2.c        Sat Apr 02 15:56:32 2011 +0100
+++ b/xen/common/sched_credit2.c        Sat Apr 02 15:57:03 2011 +0100
@@ -2010,7 +2010,8 @@
     /* Hope this is safe from cpupools switching things around. :-) */
     ops = per_cpu(scheduler, cpu);
 
-    init_pcpu(ops, cpu);
+    if ( ops->alloc_pdata == csched_alloc_pdata )
+        init_pcpu(ops, cpu);
 
     return NOTIFY_DONE;
 }
@@ -2038,6 +2039,13 @@
 };
 
 static int
+csched_global_init(void)
+{
+    register_cpu_notifier(&cpu_credit2_nfb);
+    return 0;
+}
+
+static int
 csched_init(struct scheduler *ops)
 {
     int i;
@@ -2070,8 +2078,6 @@
     spin_lock_init(&prv->lock);
     INIT_LIST_HEAD(&prv->sdom);
 
-    register_cpu_notifier(&cpu_credit2_nfb);
-
     /* But un-initialize all runqueues */
     for ( i=0; i<NR_CPUS; i++)
     {
@@ -2120,6 +2126,7 @@
 
     .dump_cpu_state = csched_dump_pcpu,
     .dump_settings  = csched_dump,
+    .global_init    = csched_global_init,
     .init           = csched_init,
     .deinit         = csched_deinit,
     .alloc_vdata    = csched_alloc_vdata,
diff -r c80281a99feb -r f5d33782a57b xen/common/schedule.c
--- a/xen/common/schedule.c     Sat Apr 02 15:56:32 2011 +0100
+++ b/xen/common/schedule.c     Sat Apr 02 15:57:03 2011 +0100
@@ -66,7 +66,6 @@
     &sched_credit_def,
     &sched_credit2_def,
     &sched_arinc653_def,
-    NULL
 };
 
 static struct scheduler __read_mostly ops;
@@ -1324,17 +1323,25 @@
 
     open_softirq(SCHEDULE_SOFTIRQ, schedule);
 
-    for ( i = 0; schedulers[i] != NULL; i++ )
+    for ( i = 0; i < ARRAY_SIZE(schedulers); i++ )
     {
-        ops = *schedulers[i];
-        if ( strcmp(ops.opt_name, opt_sched) == 0 )
-            break;
+        if ( schedulers[i]->global_init && schedulers[i]->global_init() < 0 )
+            schedulers[i] = NULL;
+        else if ( !ops.name && !strcmp(schedulers[i]->opt_name, opt_sched) )
+            ops = *schedulers[i];
     }
 
-    if ( schedulers[i] == NULL )
+    if ( !ops.name )
     {
         printk("Could not find scheduler: %s\n", opt_sched);
-        ops = *schedulers[0];
+        for ( i = 0; i < ARRAY_SIZE(schedulers); i++ )
+            if ( schedulers[i] )
+            {
+                ops = *schedulers[i];
+                break;
+            }
+        BUG_ON(!ops.name);
+        printk("Using '%s' (%s)\n", ops.name, ops.opt_name);
     }
 
     if ( cpu_schedule_up(0) )
@@ -1407,8 +1414,8 @@
     int i;
     struct scheduler *sched;
 
-    for ( i = 0; schedulers[i] != NULL; i++ )
-        if ( schedulers[i]->sched_id == sched_id )
+    for ( i = 0; i < ARRAY_SIZE(schedulers); i++ )
+        if ( schedulers[i] && schedulers[i]->sched_id == sched_id )
             goto found;
     *perr = -ENOENT;
     return NULL;
diff -r c80281a99feb -r f5d33782a57b xen/include/asm-x86/config.h
--- a/xen/include/asm-x86/config.h      Sat Apr 02 15:56:32 2011 +0100
+++ b/xen/include/asm-x86/config.h      Sat Apr 02 15:57:03 2011 +0100
@@ -393,6 +393,7 @@
 #ifndef __ASSEMBLY__
 extern void watchdog_disable(void);
 extern void watchdog_enable(void);
+extern void watchdog_setup(void);
 #endif
 
 #endif /* __X86_CONFIG_H__ */
diff -r c80281a99feb -r f5d33782a57b xen/include/xen/sched-if.h
--- a/xen/include/xen/sched-if.h        Sat Apr 02 15:56:32 2011 +0100
+++ b/xen/include/xen/sched-if.h        Sat Apr 02 15:57:03 2011 +0100
@@ -141,6 +141,8 @@
     unsigned int sched_id;  /* ID for this scheduler             */
     void *sched_data;       /* global data pointer               */
 
+    int          (*global_init)    (void);
+
     int          (*init)           (struct scheduler *);
     void         (*deinit)         (const struct scheduler *);
 

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