#define CPU_DOWN_PREPARE       0x0005 /* CPU (unsigned)v going down */
 #define CPU_DOWN_FAILED                0x0006 /* CPU (unsigned)v NOT going down */
 #define CPU_DEAD               0x0007 /* CPU (unsigned)v dead */
+#define CPU_LOCK_ACQUIRE       0x0008 /* Acquire all hotcpu locks */
+#define CPU_LOCK_RELEASE       0x0009 /* Release all hotcpu locks */
 
 #endif /* __KERNEL__ */
 #endif /* _LINUX_NOTIFIER_H */
 
        if (!cpu_online(cpu))
                return -EINVAL;
 
+       raw_notifier_call_chain(&cpu_chain, CPU_LOCK_ACQUIRE,
+                                               (void *)(long)cpu);
        err = raw_notifier_call_chain(&cpu_chain, CPU_DOWN_PREPARE,
                                                (void *)(long)cpu);
        if (err == NOTIFY_BAD) {
                printk("%s: attempt to take down CPU %u failed\n",
                                __FUNCTION__, cpu);
-               return -EINVAL;
+               err = -EINVAL;
+               goto out_release;
        }
 
        /* Ensure that we are not runnable on dying cpu */
        err = kthread_stop(p);
 out_allowed:
        set_cpus_allowed(current, old_allowed);
+out_release:
+       raw_notifier_call_chain(&cpu_chain, CPU_LOCK_RELEASE,
+                                               (void *)(long)cpu);
        return err;
 }
 
 /* Requires cpu_add_remove_lock to be held */
 static int __cpuinit _cpu_up(unsigned int cpu)
 {
-       int ret;
+       int ret, nr_calls = 0;
        void *hcpu = (void *)(long)cpu;
 
        if (cpu_online(cpu) || !cpu_present(cpu))
                return -EINVAL;
 
-       ret = raw_notifier_call_chain(&cpu_chain, CPU_UP_PREPARE, hcpu);
+       raw_notifier_call_chain(&cpu_chain, CPU_LOCK_ACQUIRE, hcpu);
+       ret = __raw_notifier_call_chain(&cpu_chain, CPU_UP_PREPARE, hcpu,
+                                                       -1, &nr_calls);
        if (ret == NOTIFY_BAD) {
                printk("%s: attempt to bring up CPU %u failed\n",
                                __FUNCTION__, cpu);
 
 out_notify:
        if (ret != 0)
-               raw_notifier_call_chain(&cpu_chain,
-                               CPU_UP_CANCELED, hcpu);
+               __raw_notifier_call_chain(&cpu_chain,
+                               CPU_UP_CANCELED, hcpu, nr_calls, NULL);
+       raw_notifier_call_chain(&cpu_chain, CPU_LOCK_RELEASE, hcpu);
 
        return ret;
 }