From 9e7faff181ce4f60372114cb1df601d0f1629fab Mon Sep 17 00:00:00 2001 From: Tim Schumacher Date: Fri, 19 Aug 2022 10:41:38 +0200 Subject: [PATCH] Kernel: Protect the list of unused network packets with a Spinlock --- Kernel/Net/NetworkAdapter.cpp | 32 ++++++++++++++++---------------- Kernel/Net/NetworkAdapter.h | 2 +- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/Kernel/Net/NetworkAdapter.cpp b/Kernel/Net/NetworkAdapter.cpp index a9d97bc5a7..4ba93ca6e0 100644 --- a/Kernel/Net/NetworkAdapter.cpp +++ b/Kernel/Net/NetworkAdapter.cpp @@ -113,21 +113,20 @@ size_t NetworkAdapter::dequeue_packet(u8* buffer, size_t buffer_size, Time& pack RefPtr NetworkAdapter::acquire_packet_buffer(size_t size) { - InterruptDisabler disabler; - if (m_unused_packets.is_empty()) { - auto buffer_or_error = KBuffer::try_create_with_size("NetworkAdapter: Packet buffer"sv, size, Memory::Region::Access::ReadWrite, AllocationStrategy::AllocateNow); - if (buffer_or_error.is_error()) - return {}; - auto buffer = buffer_or_error.release_value(); - auto packet = adopt_ref_if_nonnull(new (nothrow) PacketWithTimestamp { move(buffer), kgettimeofday() }); - if (!packet) - return {}; - packet->buffer->set_size(size); - return packet; - } + auto packet = m_unused_packets.with([size](auto& unused_packets) -> RefPtr { + if (unused_packets.is_empty()) + return nullptr; - auto packet = m_unused_packets.take_first(); - if (packet->buffer->capacity() >= size) { + auto unused_packet = unused_packets.take_first(); + + if (unused_packet->buffer->capacity() >= size) + return unused_packet; + + // FIXME: Shouldn't we put existing buffers that are too small back into the list? + return nullptr; + }); + + if (packet) { packet->timestamp = kgettimeofday(); packet->buffer->set_size(size); return packet; @@ -145,8 +144,9 @@ RefPtr NetworkAdapter::acquire_packet_buffer(size_t size) void NetworkAdapter::release_packet_buffer(PacketWithTimestamp& packet) { - InterruptDisabler disabler; - m_unused_packets.append(packet); + m_unused_packets.with([&packet](auto& unused_packets) { + unused_packets.append(packet); + }); } void NetworkAdapter::set_ipv4_address(IPv4Address const& address) diff --git a/Kernel/Net/NetworkAdapter.h b/Kernel/Net/NetworkAdapter.h index 99c4ed6027..f2da877383 100644 --- a/Kernel/Net/NetworkAdapter.h +++ b/Kernel/Net/NetworkAdapter.h @@ -109,7 +109,7 @@ private: PacketList m_packet_queue; size_t m_packet_queue_size { 0 }; - PacketList m_unused_packets; + SpinlockProtected m_unused_packets; NonnullOwnPtr m_name; u32 m_packets_in { 0 }; u32 m_bytes_in { 0 };