* 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/

Reply via email to