Re: [Patch] bonding: fix potential deadlock in bond_uninit()

From: Cong Wang
Date: Wed Mar 31 2010 - 22:45:37 EST


Eric W. Biederman wrote:
Amerigo Wang <amwang@xxxxxxxxxx> writes:

bond_uninit() is invoked with rtnl_lock held, when it does destroy_workqueue()
which will potentially flush all works in this workqueue, if we hold rtnl_lock
again in the work function, it will deadlock.

So unlock rtnl_lock before calling destroy_workqueue().

Ouch. That seems rather rude to our caller, and likely very
dangerous.


This is reasonable, because workqueue flush functions will potentially
call all the work functions which could take the same lock taken before
the flush call, thus deadlock.


Is this a deadlock you actually hit, or is this something lockdep
warned about?

It's only a lockdep warning.


My gut feel says we need to move the destroy_workqueue into
the network device destructor.


Oh, this seems a better idea, as long as the destructor are not called
with any locks holding.

Thanks!
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/