diff options
author | Tim Schumacher <timschumi@gmx.de> | 2022-08-19 10:41:38 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2022-08-19 14:51:58 +0200 |
commit | 9e7faff181ce4f60372114cb1df601d0f1629fab (patch) | |
tree | fc2068104c3e07d6c0ffbbd72c44936bf23fa1cf /Kernel/Net | |
parent | 766bf5c89ec356699dff88f7d9ddd74e62d208b4 (diff) | |
download | serenity-9e7faff181ce4f60372114cb1df601d0f1629fab.zip |
Kernel: Protect the list of unused network packets with a Spinlock
Diffstat (limited to 'Kernel/Net')
-rw-r--r-- | Kernel/Net/NetworkAdapter.cpp | 32 | ||||
-rw-r--r-- | 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<PacketWithTimestamp> 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<PacketWithTimestamp> { + 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<PacketWithTimestamp> 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<PacketList> m_unused_packets; NonnullOwnPtr<KString> m_name; u32 m_packets_in { 0 }; u32 m_bytes_in { 0 }; |