Paul E. McKenney wrote: > OK, good point! I do need to think about this. > > In the meantime, where do you see a need to run > synchronize_sched_expedited() from within a hotplug CPU notifier? > > Thanx, Paul > I don't worry about synchronize_sched_expedited() called from within a hotplug CPU notifier: 1st synchronize_sched_expedited() is newly, nobody calls it before current. 2nd get_online_cpus() will not cause DEADLOCK in CPU notifier: get_online_cpus() finds itself owns the cpu_hotplug.lock, it will not take it again. I worry DEADLOCK like this:(ABBA DEADLOCK) > get_online_cpus() is a large lock, a lot's of lock in kernel is required > after cpu_hotplug.lock. > > _cpu_down() > cpu_hotplug_begin() > mutex_lock(&cpu_hotplug.lock) > __raw_notifier_call_chain(CPU_DOWN_PREPARE) > Lock a-kernel-lock. > > It means when we have held a-kernel-lock, we can not call > synchronize_sched_expedited(). get_online_cpus() narrows > synchronize_sched_expedited()'s usages. One thread calls _cpu_down() which do "mutex_lock(&cpu_hotplug.lock)" and then do "Lock a-kernel-lock", other thread calls synchronize_sched_expedited() with a-kernel-lock held, ABBA DEADLOCK would happen: thread 1 | thread 2 _cpu_down() | Lock a-kernel-lock. mutex_lock(&cpu_hotplug.lock) | synchronize_sched_expedited() ------------------------------------------------------------------------ Lock a-kernel-lock.(wait thread2) | mutex_lock(&cpu_hotplug.lock) (wait thread 1) cpuset_lock() is an example of a-kernel-lock as described before. cpuset_lock() is required in CPU notifier. But some work in cpuset need get_online_cpus(). (cpuset_lock() and then get_online_cpus(), we can not release cpuset_lock() temporarily) The fix is putting this work done in workqueue. (get_online_cpus() and then cpuset_lock()); Thanx. Lai -- To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html