lkml.org 
[lkml]   [2006]   [Nov]   [30]   [last100]   RSS Feed
Views: [more markup]  [less markup]  [headers]  [forward] 
 
Messages in this thread
/
DateThu, 30 Nov 2006 12:46:17 +0100
FromIngo Molnar <>
SubjectRe: CPUFREQ-CPUHOTPLUG: Possible circular locking dependency
* Andrew Morton <akpm@osdl.org> 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 majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

\
 
 \ /
  Last update: 2006-11-30 12:49    [from the cache]
©2003-2008