hrev45240 adds 2 changesets to branch 'master' old head: afa494c44e4b6472ae9c187069ff3bb8b75edc37 new head: 8cf4ba89b647baa3f243c132c0b210f8312d8cc9 overview: http://cgit.haiku-os.org/haiku/log/?qt=range&q=8cf4ba8+%5Eafa494c ---------------------------------------------------------------------------- 8a6337d: Converted the "net_interfaces" mutex into a recursive locker, and acquire it in Interface::SetDown(). 8cf4ba8: Add a TODO comment [ Stefano Ceccherini <stefano.ceccherini@xxxxxxxxx> ] ---------------------------------------------------------------------------- 1 file changed, 22 insertions(+), 16 deletions(-) src/add-ons/kernel/network/stack/interfaces.cpp | 38 ++++++++++++--------- ############################################################################ Commit: 8a6337d0f894976df77421ac6f98df8a76bff1d5 URL: http://cgit.haiku-os.org/haiku/commit/?id=8a6337d Author: Stefano Ceccherini <stefano.ceccherini@xxxxxxxxx> Date: Mon Feb 4 10:30:55 2013 UTC Converted the "net_interfaces" mutex into a recursive locker, and acquire it in Interface::SetDown(). ---------------------------------------------------------------------------- diff --git a/src/add-ons/kernel/network/stack/interfaces.cpp b/src/add-ons/kernel/network/stack/interfaces.cpp index 9a3c73b..54e7046 100644 --- a/src/add-ons/kernel/network/stack/interfaces.cpp +++ b/src/add-ons/kernel/network/stack/interfaces.cpp @@ -79,7 +79,7 @@ struct AddressHashDefinition { typedef BOpenHashTable<AddressHashDefinition, true, false> AddressTable; -static mutex sLock; +static recursive_lock sLock; static InterfaceList sInterfaces; static mutex sHashLock; static AddressTable sAddressTable; @@ -91,7 +91,7 @@ static uint32 sInterfaceIndex; void dump_interface_refs(void) { - MutexLocker locker(sLock); + RecursiveLocker locker(sLock); InterfaceList::Iterator iterator = sInterfaces.GetIterator(); while (Interface* interface = iterator.Next()) { @@ -933,6 +933,7 @@ Interface::SetDown() if ((flags & IFF_UP) == 0) return; + RecursiveLocker interfacesLocker(sLock); RecursiveLocker locker(fLock); DatalinkTable::Iterator iterator = fDatalinkTable.GetIterator(); @@ -1173,7 +1174,7 @@ Interface::_ChangeAddress(RecursiveLocker& locker, InterfaceAddress* address, static struct Interface* find_interface(const char* name) { - ASSERT_LOCKED_MUTEX(&sLock); + ASSERT_LOCKED_RECURSIVE(&sLock); InterfaceList::Iterator iterator = sInterfaces.GetIterator(); while (Interface* interface = iterator.Next()) { @@ -1208,7 +1209,7 @@ status_t add_interface(const char* name, net_domain_private* domain, const ifaliasreq& request, net_device_interface* deviceInterface) { - MutexLocker locker(sLock); + RecursiveLocker locker(sLock); if (find_interface(name) != NULL) return B_NAME_IN_USE; @@ -1249,7 +1250,7 @@ remove_interface(Interface* interface) interface->SetDown(); interface->RemoveAddresses(); - MutexLocker locker(sLock); + RecursiveLocker locker(sLock); sInterfaces.Remove(interface); locker.Unlock(); @@ -1265,7 +1266,7 @@ remove_interface(Interface* interface) void interface_removed_device_interface(net_device_interface* deviceInterface) { - MutexLocker locker(sLock); + RecursiveLocker locker(sLock); Interface* interface = find_interface(deviceInterface->device->name); if (interface != NULL) @@ -1396,7 +1397,7 @@ update_interface_address(InterfaceAddress* interfaceAddress, int32 option, Interface* get_interface(net_domain* domain, uint32 index) { - MutexLocker locker(sLock); + RecursiveLocker locker(sLock); Interface* interface; if (index == 0) @@ -1417,7 +1418,7 @@ get_interface(net_domain* domain, uint32 index) Interface* get_interface(net_domain* domain, const char* name) { - MutexLocker locker(sLock); + RecursiveLocker locker(sLock); Interface* interface = find_interface(name); if (interface == NULL) @@ -1434,7 +1435,7 @@ get_interface(net_domain* domain, const char* name) Interface* get_interface_for_device(net_domain* domain, uint32 index) { - MutexLocker locker(sLock); + RecursiveLocker locker(sLock); InterfaceList::Iterator iterator = sInterfaces.GetIterator(); while (Interface* interface = iterator.Next()) { @@ -1460,7 +1461,7 @@ get_interface_for_link(net_domain* domain, const sockaddr* _linkAddress) { sockaddr_dl& linkAddress = *(sockaddr_dl*)_linkAddress; - MutexLocker locker(sLock); + RecursiveLocker locker(sLock); InterfaceList::Iterator iterator = sInterfaces.GetIterator(); while (Interface* interface = iterator.Next()) { @@ -1506,7 +1507,7 @@ InterfaceAddress* get_interface_address_for_destination(net_domain* domain, const sockaddr* destination) { - MutexLocker locker(sLock); + RecursiveLocker locker(sLock); InterfaceList::Iterator iterator = sInterfaces.GetIterator(); while (Interface* interface = iterator.Next()) { @@ -1533,7 +1534,7 @@ get_interface_address_for_link(net_domain* domain, const sockaddr* address, { sockaddr_dl& linkAddress = *(sockaddr_dl*)address; - MutexLocker locker(sLock); + RecursiveLocker locker(sLock); InterfaceList::Iterator iterator = sInterfaces.GetIterator(); while (Interface* interface = iterator.Next()) { @@ -1558,7 +1559,7 @@ get_interface_address_for_link(net_domain* domain, const sockaddr* address, uint32 count_interfaces() { - MutexLocker locker(sLock); + RecursiveLocker locker(sLock); return sInterfaces.Count(); } @@ -1571,7 +1572,7 @@ count_interfaces() status_t list_interfaces(int family, void* _buffer, size_t* bufferSize) { - MutexLocker locker(sLock); + RecursiveLocker locker(sLock); UserBuffer buffer(_buffer, *bufferSize); @@ -1619,7 +1620,7 @@ list_interfaces(int family, void* _buffer, size_t* bufferSize) status_t init_interfaces() { - mutex_init(&sLock, "net interfaces"); + recursive_lock_init(&sLock, "net interfaces"); mutex_init(&sHashLock, "net local addresses"); new (&sInterfaces) InterfaceList; @@ -1650,7 +1651,7 @@ uninit_interfaces() remove_debugger_command("net_route", &dump_route); #endif - mutex_destroy(&sLock); + recursive_lock_destroy(&sLock); mutex_destroy(&sHashLock); return B_OK; } ############################################################################ Revision: hrev45240 Commit: 8cf4ba89b647baa3f243c132c0b210f8312d8cc9 URL: http://cgit.haiku-os.org/haiku/commit/?id=8cf4ba8 Author: Stefano Ceccherini <stefano.ceccherini@xxxxxxxxx> Date: Wed Feb 6 07:20:29 2013 UTC Add a TODO comment ---------------------------------------------------------------------------- diff --git a/src/add-ons/kernel/network/stack/interfaces.cpp b/src/add-ons/kernel/network/stack/interfaces.cpp index 54e7046..20b4110 100644 --- a/src/add-ons/kernel/network/stack/interfaces.cpp +++ b/src/add-ons/kernel/network/stack/interfaces.cpp @@ -933,6 +933,11 @@ Interface::SetDown() if ((flags & IFF_UP) == 0) return; + // TODO: We acquire also the net_interfaces lock here + // to avoid a lock inversion in the ipv6 protocol implementation + // (see ticket #9377). + // A better solution would be to avoid locking the interface lock (fLock) + // when calling the lower layers. RecursiveLocker interfacesLocker(sLock); RecursiveLocker locker(fLock);