[haiku-commits] haiku: hrev45240 - src/add-ons/kernel/network/stack

  • From: stefano.ceccherini@xxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Wed, 6 Feb 2013 08:29:43 +0100 (CET)

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);
 


Other related posts:

  • » [haiku-commits] haiku: hrev45240 - src/add-ons/kernel/network/stack - stefano . ceccherini