Messages in this thread | | | Date | Mon, 14 Apr 2008 21:16:42 +0530 | From | Gautham R Shenoy <> | Subject | Re: 2.6.25-rc9 -- INFO: possible circular locking dependency detected |
| |
On Mon, Apr 14, 2008 at 05:19:46PM +0200, Heiko Carstens wrote: > On Mon, Apr 14, 2008 at 08:18:01PM +0530, Gautham R Shenoy wrote: > > On Mon, Apr 14, 2008 at 02:42:27PM +0200, Peter Zijlstra wrote: > > While you're fixing the cpu hotplug stuff anyway, there's still a bug > present in a few modules init code: > > Usually they do something like: > > register_hotcpu_notifier(...); > for_each_online_cpu(i) > ... > > A module's init functions gets called from sys_init_module and there is nothing > that would protect from cpu hotplug. > Therefore the sequence of for_each_online_cpu() and register_hotcpu_notifier() > better should be protected by a surrounding get/put_online_cpus() like this: > > get_online_cpus(); > register_hotcpu_notifier(...); > for_each_online_cpu(i) > ... > put_online_cpus();
But shouldn't this be: register_hotcpu_notifier(...); get_online_cpus(); for_each_online_cpus() ... put_online_cpus();
What's the problem with this ordering?
> > But as far as I can see that can lead to a deadlock if e.g. cpu 0 would > execute the code above whild cpu 1 is executing some cpu hotplug code: > > cpu0: get_online_cpus() > -> increase cpu_hotplug.refcount > cpu1: cpu_down() > -> cpu_maps_update_begin() > -> grab cpu_add_remove_lock > -> wait for cpu_hotplug.refcount to drop to zero again > cpu0: register_hotcpu_notifier() > -> cpu_maps_update_begin > -> tries to grab cpu_add_remove_lock that cpu 1 holds already > -> dead
-- Thanks and Regards gautham
| |