* Andrew Morton <[EMAIL PROTECTED]> wrote: > > This would be done totally serialized and while holding the hotplug > > lock, so no CPU could go away or arrive while this operation is > > going on. > > You said "the hotplug lock". That is the problem.
maybe i'm too dense today but i still dont see the fundamental problem. Even with complex inter-subsystem interactions, hotplugging could be effectively and scalably controlled via a self-recursive per-CPU mutex, and a pointer to it embedded in task_struct: struct task_struct { ... int hotplug_depth; struct mutex *hotplug_lock; } ... DEFINE_PER_CPU(struct mutex, hotplug_lock); void cpu_hotplug_lock(void) { int cpu = raw_smp_processor_id(); /* * Interrupts/softirqs are hotplug-safe: */ if (in_interrupt()) return; if (current->hotplug_depth++) return; current->hotplug_lock = &per_cpu(hotplug_lock, cpu); mutex_lock(current->hotplug_lock); } void cpu_hotplug_unlock(void) { int cpu; if (in_interrupt()) return; if (DEBUG_LOCKS_WARN_ON(!current->hotplug_depth)) return; if (--current->hotplug_depth) return; mutex_unlock(current->hotplug_lock); current->hotplug_lock = NULL; } ... void do_exit(void) { ... DEBUG_LOCKS_WARN_ON(current->hotplug_depth); ... } ... copy_process(void) { ... p->hotplug_depth = 0; p->hotplug_lock = NULL; ... } 50 lines of code at most. The only rule is to not use cpu_hotplug_lock() in process-context non-preemptible code [interrupt contexts are automatically ignored]. What am i missing? Ingo - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/