From 1486ad7aa53c16f6e938c30ece182b2b4318d1a0 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Mon, 27 Apr 2026 19:42:40 +0300 Subject: [PATCH] Kernel: Don't map NIC buffers as uncached There is no need for them to be uncached. Having them as uncached killed the networking performance, over 90% time was spent in kernel out of which 80% was in checksum calculation and memcpy, half each (measured in qemu with e1000e) --- kernel/kernel/Networking/E1000/E1000.cpp | 6 +++--- kernel/kernel/Networking/RTL8169/RTL8169.cpp | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/kernel/kernel/Networking/E1000/E1000.cpp b/kernel/kernel/Networking/E1000/E1000.cpp index 607bbe51..7534e76c 100644 --- a/kernel/kernel/Networking/E1000/E1000.cpp +++ b/kernel/kernel/Networking/E1000/E1000.cpp @@ -173,7 +173,7 @@ namespace Kernel BAN::ErrorOr E1000::initialize_rx() { - m_rx_buffer_region = TRY(DMARegion::create(E1000_RX_BUFFER_SIZE * E1000_RX_DESCRIPTOR_COUNT)); + m_rx_buffer_region = TRY(DMARegion::create(E1000_RX_BUFFER_SIZE * E1000_RX_DESCRIPTOR_COUNT, PageTable::MemoryType::Normal)); m_rx_descriptor_region = TRY(DMARegion::create(sizeof(e1000_rx_desc) * E1000_RX_DESCRIPTOR_COUNT)); auto* rx_descriptors = reinterpret_cast(m_rx_descriptor_region->vaddr()); @@ -207,7 +207,7 @@ namespace Kernel BAN::ErrorOr E1000::initialize_tx() { - m_tx_buffer_region = TRY(DMARegion::create(E1000_TX_BUFFER_SIZE * E1000_TX_DESCRIPTOR_COUNT)); + m_tx_buffer_region = TRY(DMARegion::create(E1000_TX_BUFFER_SIZE * E1000_TX_DESCRIPTOR_COUNT, PageTable::MemoryType::Normal)); m_tx_descriptor_region = TRY(DMARegion::create(sizeof(e1000_tx_desc) * E1000_TX_DESCRIPTOR_COUNT)); auto* tx_descriptors = reinterpret_cast(m_tx_descriptor_region->vaddr()); @@ -304,7 +304,7 @@ namespace Kernel // FIXME: there isnt really any reason to wait for transmission write32(REG_TDT, (tx_current + 1) % E1000_TX_DESCRIPTOR_COUNT); while (descriptor.status == 0) - continue; + Processor::pause(); dprintln_if(DEBUG_E1000, "sent {} bytes", packet_size); diff --git a/kernel/kernel/Networking/RTL8169/RTL8169.cpp b/kernel/kernel/Networking/RTL8169/RTL8169.cpp index 8b6a6342..e4701d19 100644 --- a/kernel/kernel/Networking/RTL8169/RTL8169.cpp +++ b/kernel/kernel/Networking/RTL8169/RTL8169.cpp @@ -107,7 +107,7 @@ namespace Kernel BAN::ErrorOr RTL8169::initialize_rx() { - m_rx_buffer_region = TRY(DMARegion::create(m_rx_descriptor_count * s_buffer_size)); + m_rx_buffer_region = TRY(DMARegion::create(m_rx_descriptor_count * s_buffer_size, PageTable::MemoryType::Normal)); m_rx_descriptor_region = TRY(DMARegion::create(m_rx_descriptor_count * sizeof(RTL8169Descriptor))); for (size_t i = 0; i < m_rx_descriptor_count; i++) @@ -144,7 +144,7 @@ namespace Kernel BAN::ErrorOr RTL8169::initialize_tx() { - m_tx_buffer_region = TRY(DMARegion::create(m_tx_descriptor_count * s_buffer_size)); + m_tx_buffer_region = TRY(DMARegion::create(m_tx_descriptor_count * s_buffer_size, PageTable::MemoryType::Normal)); m_tx_descriptor_region = TRY(DMARegion::create(m_tx_descriptor_count * sizeof(RTL8169Descriptor))); for (size_t i = 0; i < m_tx_descriptor_count; i++)