mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 10:42:45 +00:00 
			
		
		
		
	Kernel: Protect network adapter list with spinlock instead of mutex
This commit is contained in:
		
							parent
							
								
									0899153170
								
							
						
					
					
						commit
						3becff9eae
					
				
					 2 changed files with 23 additions and 23 deletions
				
			
		|  | @ -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; | ||||
| } | ||||
| 
 | ||||
| } | ||||
|  |  | |||
|  | @ -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" }; | ||||
| }; | ||||
| 
 | ||||
| } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Andreas Kling
						Andreas Kling