Linux Headquarters
[ Register ]
[ About us ] [ Home Page ]

Advertisement
[ Kernel ] [ Documentation ] [ Links ] [ Books ]

Advertisement

Kernel v2.6.26-rc1 /kernel/cpu.c

Filename:/kernel/cpu.c
Lines Added:20
Lines Deleted:30
Also changed in: (Previous) 2.6.25-git20  2.6.25-git19  2.6.25-git18  2.6.25-git17  2.6.25-git16  2.6.25-git15 
(Following) 2.6.26-rc2  2.6.26-rc3  2.6.26-rc4  2.6.26-rc5  2.6.26-rc6  2.6.26-rc7 

Location
[  2.6.26-rc1
  [  kernel
     o  cpu.c

Patch

diff --git a/kernel/cpu.c b/kernel/cpu.c
index 2eff3f6..c77bc3a 100644
--- a/kernel/cpu.c
+++ b/kernel/cpu.c
@@ -33,17 +33,13 @@ static struct {
     * an ongoing cpu hotplug operation.
     */
    int refcount;
-   wait_queue_head_t writer_queue;
 } cpu_hotplug;
 
-#define writer_exists() (cpu_hotplug.active_writer != NULL)
-
 void __init cpu_hotplug_init(void)
 {
    cpu_hotplug.active_writer = NULL;
    mutex_init(&cpu_hotplug.lock);
    cpu_hotplug.refcount = 0;
-   init_waitqueue_head(&cpu_hotplug.writer_queue);
 }
 
 #ifdef CONFIG_HOTPLUG_CPU
@@ -65,11 +61,8 @@ void put_online_cpus(void)
    if (cpu_hotplug.active_writer == current)
       return;
    mutex_lock(&cpu_hotplug.lock);
-   cpu_hotplug.refcount--;
-
-   if (unlikely(writer_exists()) && !cpu_hotplug.refcount)
-      wake_up(&cpu_hotplug.writer_queue);
-
+   if (!--cpu_hotplug.refcount && unlikely(cpu_hotplug.active_writer))
+      wake_up_process(cpu_hotplug.active_writer);
    mutex_unlock(&cpu_hotplug.lock);
 
 }
@@ -98,8 +91,8 @@ void cpu_maps_update_done(void)
  * Note that during a cpu-hotplug operation, the new readers, if any,
  * will be blocked by the cpu_hotplug.lock
  *
- * Since cpu_maps_update_begin is always called after invoking
- * cpu_maps_update_begin, we can be sure that only one writer is active.
+ * Since cpu_hotplug_begin() is always called after invoking
+ * cpu_maps_update_begin(), we can be sure that only one writer is active.
  *
  * Note that theoretically, there is a possibility of a livelock:
  * - Refcount goes to zero, last reader wakes up the sleeping
@@ -115,19 +108,16 @@ void cpu_maps_update_done(void)
  */
 static void cpu_hotplug_begin(void)
 {
-   DECLARE_WAITQUEUE(wait, current);
-
-   mutex_lock(&cpu_hotplug.lock);
-
    cpu_hotplug.active_writer = current;
-   add_wait_queue_exclusive(&cpu_hotplug.writer_queue, &wait);
-   while (cpu_hotplug.refcount) {
-      set_current_state(TASK_UNINTERRUPTIBLE);
+
+   for (;;) {
+      mutex_lock(&cpu_hotplug.lock);
+      if (likely(!cpu_hotplug.refcount))
+         break;
+      __set_current_state(TASK_UNINTERRUPTIBLE);
       mutex_unlock(&cpu_hotplug.lock);
       schedule();
-      mutex_lock(&cpu_hotplug.lock);
    }
-   remove_wait_queue_locked(&cpu_hotplug.writer_queue, &wait);
 }
 
 static void cpu_hotplug_done(void)
@@ -136,7 +126,7 @@ static void cpu_hotplug_done(void)
    mutex_unlock(&cpu_hotplug.lock);
 }
 /* Need to know about CPUs going up/down? */
-int __cpuinit register_cpu_notifier(struct notifier_block *nb)
+int __ref register_cpu_notifier(struct notifier_block *nb)
 {
    int ret;
    cpu_maps_update_begin();
@@ -149,7 +139,7 @@ int __cpuinit register_cpu_notifier(struct notifier_block *nb)
 
 EXPORT_SYMBOL(register_cpu_notifier);
 
-void unregister_cpu_notifier(struct notifier_block *nb)
+void __ref unregister_cpu_notifier(struct notifier_block *nb)
 {
    cpu_maps_update_begin();
    raw_notifier_chain_unregister(&cpu_chain, nb);
@@ -180,7 +170,7 @@ struct take_cpu_down_param {
 };
 
 /* Take this CPU down. */
-static int take_cpu_down(void *_param)
+static int __ref take_cpu_down(void *_param)
 {
    struct take_cpu_down_param *param = _param;
    int err;
@@ -199,7 +189,7 @@ static int take_cpu_down(void *_param)
 }
 
 /* Requires cpu_add_remove_lock to be held */
-static int _cpu_down(unsigned int cpu, int tasks_frozen)
+static int __ref _cpu_down(unsigned int cpu, int tasks_frozen)
 {
    int err, nr_calls = 0;
    struct task_struct *p;
@@ -225,16 +215,16 @@ static int _cpu_down(unsigned int cpu, int tasks_frozen)
       __raw_notifier_call_chain(&cpu_chain, CPU_DOWN_FAILED | mod,
                  hcpu, nr_calls, NULL);
       printk("%s: attempt to take down CPU %u failed\n",
-            __FUNCTION__, cpu);
+            __func__, cpu);
       err = -EINVAL;
       goto out_release;
    }
 
    /* Ensure that we are not runnable on dying cpu */
    old_allowed = current->cpus_allowed;
-   tmp = CPU_MASK_ALL;
+   cpus_setall(tmp);
    cpu_clear(cpu, tmp);
-   set_cpus_allowed(current, tmp);
+   set_cpus_allowed_ptr(current, &tmp);
 
    p = __stop_machine_run(take_cpu_down, &tcd_param, cpu);
 
@@ -268,13 +258,13 @@ static int _cpu_down(unsigned int cpu, int tasks_frozen)
 out_thread:
    err = kthread_stop(p);
 out_allowed:
-   set_cpus_allowed(current, old_allowed);
+   set_cpus_allowed_ptr(current, &old_allowed);
 out_release:
    cpu_hotplug_done();
    return err;
 }
 
-int cpu_down(unsigned int cpu)
+int __ref cpu_down(unsigned int cpu)
 {
    int err = 0;
 
@@ -305,7 +295,7 @@ static int __cpuinit _cpu_up(unsigned int cpu, int tasks_frozen)
    if (ret == NOTIFY_BAD) {
       nr_calls--;
       printk("%s: attempt to bring up CPU %u failed\n",
-            __FUNCTION__, cpu);
+            __func__, cpu);
       ret = -EINVAL;
       goto out_notify;
    }


Comments: webmaster (at) linuxhq.com.
Advertising: banners (at) linuxhq.com.
Compilation ©1998-2008 Linux Headquarters, Inc.