Browse Source

Kernel: Protect network adapter list with spinlock instead of mutex

Andreas Kling 3 years ago
parent
commit
3becff9eae
2 changed files with 23 additions and 23 deletions
  1. 21 20
      Kernel/Net/NetworkingManagement.cpp
  2. 2 3
      Kernel/Net/NetworkingManagement.h

+ 21 - 20
Kernel/Net/NetworkingManagement.cpp

@@ -45,33 +45,35 @@ NonnullRefPtr<NetworkAdapter> NetworkingManagement::loopback_adapter() const
 
 void NetworkingManagement::for_each(Function<void(NetworkAdapter&)> callback)
 {
-    MutexLocker locker(m_lock);
-    for (auto& it : m_adapters)
-        callback(it);
+    m_adapters.for_each([&](auto& adapter) {
+        callback(adapter);
+    });
 }
 
-RefPtr<NetworkAdapter> NetworkingManagement::from_ipv4_address(const IPv4Address& address) const
+RefPtr<NetworkAdapter> NetworkingManagement::from_ipv4_address(IPv4Address const& address) const
 {
-    MutexLocker locker(m_lock);
-    for (auto& adapter : m_adapters) {
-        if (adapter.ipv4_address() == address || adapter.ipv4_broadcast() == address)
-            return adapter;
-    }
     if (address[0] == 0 && address[1] == 0 && address[2] == 0 && address[3] == 0)
         return m_loopback_adapter;
     if (address[0] == 127)
         return m_loopback_adapter;
-    return {};
+    return m_adapters.with([&](auto& adapters) -> RefPtr<NetworkAdapter> {
+        for (auto& adapter : adapters) {
+            if (adapter.ipv4_address() == address || adapter.ipv4_broadcast() == address)
+                return adapter;
+        }
+        return nullptr;
+    });
 }
+
 RefPtr<NetworkAdapter> NetworkingManagement::lookup_by_name(StringView name) const
 {
-    MutexLocker locker(m_lock);
-    RefPtr<NetworkAdapter> found_adapter;
-    for (auto& it : m_adapters) {
-        if (it.name() == name)
-            found_adapter = it;
-    }
-    return found_adapter;
+    return m_adapters.with([&](auto& adapters) -> RefPtr<NetworkAdapter> {
+        for (auto& adapter : adapters) {
+            if (adapter.name() == name)
+                return adapter;
+        }
+        return nullptr;
+    });
 }
 
 ErrorOr<NonnullOwnPtr<KString>> NetworkingManagement::generate_interface_name_from_pci_address(PCI::DeviceIdentifier const& device_identifier)
@@ -106,14 +108,13 @@ bool NetworkingManagement::initialize()
             if (device_identifier.class_code().value() != 0x02)
                 return;
             if (auto adapter = determine_network_device(device_identifier); !adapter.is_null())
-                m_adapters.append(adapter.release_nonnull());
+                m_adapters.with([&](auto& adapters) { adapters.append(adapter.release_nonnull()); });
         });
     }
     auto loopback = LoopbackAdapter::try_create();
     VERIFY(loopback);
-    m_adapters.append(*loopback);
+    m_adapters.with([&](auto& adapters) { adapters.append(*loopback); });
     m_loopback_adapter = loopback;
     return true;
 }
-
 }

+ 2 - 3
Kernel/Net/NetworkingManagement.h

@@ -12,7 +12,7 @@
 #include <AK/NonnullRefPtrVector.h>
 #include <AK/Types.h>
 #include <Kernel/Bus/PCI/Definitions.h>
-#include <Kernel/Locking/Mutex.h>
+#include <Kernel/Locking/SpinlockProtected.h>
 #include <Kernel/Memory/Region.h>
 
 namespace Kernel {
@@ -40,9 +40,8 @@ public:
 private:
     RefPtr<NetworkAdapter> determine_network_device(PCI::DeviceIdentifier const&) const;
 
-    NonnullRefPtrVector<NetworkAdapter> m_adapters;
+    SpinlockProtected<NonnullRefPtrVector<NetworkAdapter>> m_adapters;
     RefPtr<NetworkAdapter> m_loopback_adapter;
-    mutable Mutex m_lock { "Networking" };
 };
 
 }