summaryrefslogtreecommitdiff
path: root/Kernel/Net
diff options
context:
space:
mode:
authorTim Schumacher <timschumi@gmx.de>2022-08-19 10:41:38 +0200
committerAndreas Kling <kling@serenityos.org>2022-08-19 14:51:58 +0200
commit9e7faff181ce4f60372114cb1df601d0f1629fab (patch)
treefc2068104c3e07d6c0ffbbd72c44936bf23fa1cf /Kernel/Net
parent766bf5c89ec356699dff88f7d9ddd74e62d208b4 (diff)
downloadserenity-9e7faff181ce4f60372114cb1df601d0f1629fab.zip
Kernel: Protect the list of unused network packets with a Spinlock
Diffstat (limited to 'Kernel/Net')
-rw-r--r--Kernel/Net/NetworkAdapter.cpp32
-rw-r--r--Kernel/Net/NetworkAdapter.h2
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 };