From 706330302289e7cd50f6c42a637f79a5b21a8911 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sun, 15 Aug 2021 15:46:35 +0200 Subject: [PATCH] Kernel: Convert IPv4 socket list from HashTable to IntrusiveList There was no reason whatsoever to use a HashTable here. IntrusiveList removes all the heap allocations and does everything more efficiently. --- Kernel/Net/IPv4Socket.cpp | 10 +++++----- Kernel/Net/IPv4Socket.h | 9 +++++++-- Kernel/Net/NetworkTask.cpp | 8 +++++--- 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/Kernel/Net/IPv4Socket.cpp b/Kernel/Net/IPv4Socket.cpp index b64bf47547..9ca1731153 100644 --- a/Kernel/Net/IPv4Socket.cpp +++ b/Kernel/Net/IPv4Socket.cpp @@ -26,13 +26,13 @@ namespace Kernel { -static Singleton>> s_table; +static Singleton> s_all_sockets; using BlockFlags = Thread::FileDescriptionBlocker::BlockFlags; -ProtectedValue>& IPv4Socket::all_sockets() +ProtectedValue& IPv4Socket::all_sockets() { - return *s_table; + return *s_all_sockets; } OwnPtr IPv4Socket::create_receive_buffer() @@ -79,14 +79,14 @@ IPv4Socket::IPv4Socket(int type, int protocol, NonnullOwnPtr recei } all_sockets().with_exclusive([&](auto& table) { - table.set(this); + table.append(*this); }); } IPv4Socket::~IPv4Socket() { all_sockets().with_exclusive([&](auto& table) { - table.remove(this); + table.remove(*this); }); } diff --git a/Kernel/Net/IPv4Socket.h b/Kernel/Net/IPv4Socket.h index 318a43f558..0b01fa3784 100644 --- a/Kernel/Net/IPv4Socket.h +++ b/Kernel/Net/IPv4Socket.h @@ -31,8 +31,6 @@ public: static KResultOr> create(int type, int protocol); virtual ~IPv4Socket() override; - static ProtectedValue>& all_sockets(); - virtual KResult close() override; virtual KResult bind(Userspace, socklen_t) override; virtual KResult connect(FileDescription&, Userspace, socklen_t, ShouldBlock = ShouldBlock::Yes) override; @@ -131,6 +129,13 @@ private: BufferMode m_buffer_mode { BufferMode::Packets }; OwnPtr m_scratch_buffer; + + IntrusiveListNode m_list_node; + +public: + using List = IntrusiveList, &IPv4Socket::m_list_node>; + + static ProtectedValue& all_sockets(); }; } diff --git a/Kernel/Net/NetworkTask.cpp b/Kernel/Net/NetworkTask.cpp index 620e52a006..d1184e329b 100644 --- a/Kernel/Net/NetworkTask.cpp +++ b/Kernel/Net/NetworkTask.cpp @@ -224,9 +224,11 @@ void handle_icmp(EthernetFrameHeader const& eth, IPv4Packet const& ipv4_packet, { NonnullRefPtrVector icmp_sockets; - IPv4Socket::all_sockets().for_each_shared([&](const auto& socket) { - if (socket->protocol() == (unsigned)IPv4Protocol::ICMP) - icmp_sockets.append(*socket); + IPv4Socket::all_sockets().with_exclusive([&](auto& sockets) { + for (auto& socket : sockets) { + if (socket.protocol() == (unsigned)IPv4Protocol::ICMP) + icmp_sockets.append(socket); + } }); for (auto& socket : icmp_sockets) socket.did_receive(ipv4_packet.source(), 0, { &ipv4_packet, sizeof(IPv4Packet) + ipv4_packet.payload_size() }, packet_timestamp);