From 3f63be949a90c9e6d4d0dcccc2c2d34ceb1bcbcc Mon Sep 17 00:00:00 2001 From: Liav A Date: Sat, 12 Aug 2023 00:41:18 +0300 Subject: [PATCH] Kernel/Net: Don't allocate memory for adapters' names Instead, use a FixedStringBuffer to store a string with up to 16 chars. --- Kernel/Net/Intel/E1000ENetworkAdapter.cpp | 16 ++++++++-------- Kernel/Net/Intel/E1000ENetworkAdapter.h | 4 ++-- Kernel/Net/Intel/E1000NetworkAdapter.cpp | 13 +++++++------ Kernel/Net/Intel/E1000NetworkAdapter.h | 4 ++-- Kernel/Net/LoopbackAdapter.cpp | 7 +++---- Kernel/Net/LoopbackAdapter.h | 2 +- Kernel/Net/NetworkAdapter.cpp | 4 ++-- Kernel/Net/NetworkAdapter.h | 6 +++--- Kernel/Net/NetworkingManagement.cpp | 6 +++--- Kernel/Net/NetworkingManagement.h | 2 +- Kernel/Net/Realtek/RTL8168NetworkAdapter.cpp | 6 +++--- Kernel/Net/Realtek/RTL8168NetworkAdapter.h | 2 +- Kernel/Net/VirtIO/VirtIONetworkAdapter.cpp | 6 +++--- Kernel/Net/VirtIO/VirtIONetworkAdapter.h | 2 +- 14 files changed, 40 insertions(+), 40 deletions(-) diff --git a/Kernel/Net/Intel/E1000ENetworkAdapter.cpp b/Kernel/Net/Intel/E1000ENetworkAdapter.cpp index 3b42f759fe6..13f37af1c15 100644 --- a/Kernel/Net/Intel/E1000ENetworkAdapter.cpp +++ b/Kernel/Net/Intel/E1000ENetworkAdapter.cpp @@ -199,13 +199,13 @@ UNMAP_AFTER_INIT ErrorOr> E1000ENetworkAdapter::cr auto rx_descriptors_region = TRY(MM.allocate_contiguous_kernel_region(TRY(Memory::page_round_up(sizeof(e1000_rx_desc) * number_of_rx_descriptors)), "E1000 RX Descriptors"sv, Memory::Region::Access::ReadWrite)); auto tx_descriptors_region = TRY(MM.allocate_contiguous_kernel_region(TRY(Memory::page_round_up(sizeof(e1000_tx_desc) * number_of_tx_descriptors)), "E1000 TX Descriptors"sv, Memory::Region::Access::ReadWrite)); - return TRY(adopt_nonnull_ref_or_enomem(new (nothrow) E1000ENetworkAdapter(pci_device_identifier, + return TRY(adopt_nonnull_ref_or_enomem(new (nothrow) E1000ENetworkAdapter(interface_name.representable_view(), + pci_device_identifier, irq, move(registers_io_window), move(rx_buffer_region), move(tx_buffer_region), move(rx_descriptors_region), - move(tx_descriptors_region), - move(interface_name)))); + move(tx_descriptors_region)))); } UNMAP_AFTER_INIT ErrorOr E1000ENetworkAdapter::initialize(Badge) @@ -229,16 +229,16 @@ UNMAP_AFTER_INIT ErrorOr E1000ENetworkAdapter::initialize(Badge registers_io_window, NonnullOwnPtr rx_buffer_region, NonnullOwnPtr tx_buffer_region, NonnullOwnPtr rx_descriptors_region, - NonnullOwnPtr tx_descriptors_region, NonnullOwnPtr interface_name) - : E1000NetworkAdapter(device_identifier, irq, move(registers_io_window), + NonnullOwnPtr tx_descriptors_region) + : E1000NetworkAdapter(interface_name, device_identifier, irq, move(registers_io_window), move(rx_buffer_region), move(tx_buffer_region), move(rx_descriptors_region), - move(tx_descriptors_region), - move(interface_name)) + move(tx_descriptors_region)) { } diff --git a/Kernel/Net/Intel/E1000ENetworkAdapter.h b/Kernel/Net/Intel/E1000ENetworkAdapter.h index 0de34aee565..e6598cf6911 100644 --- a/Kernel/Net/Intel/E1000ENetworkAdapter.h +++ b/Kernel/Net/Intel/E1000ENetworkAdapter.h @@ -29,10 +29,10 @@ public: virtual StringView purpose() const override { return class_name(); } private: - E1000ENetworkAdapter(PCI::DeviceIdentifier const&, u8 irq, + E1000ENetworkAdapter(StringView interface_name, PCI::DeviceIdentifier const&, u8 irq, NonnullOwnPtr registers_io_window, NonnullOwnPtr rx_buffer_region, NonnullOwnPtr tx_buffer_region, NonnullOwnPtr rx_descriptors_region, - NonnullOwnPtr tx_descriptors_region, NonnullOwnPtr); + NonnullOwnPtr tx_descriptors_region); virtual StringView class_name() const override { return "E1000ENetworkAdapter"sv; } diff --git a/Kernel/Net/Intel/E1000NetworkAdapter.cpp b/Kernel/Net/Intel/E1000NetworkAdapter.cpp index 547fab5b00b..1f13e622553 100644 --- a/Kernel/Net/Intel/E1000NetworkAdapter.cpp +++ b/Kernel/Net/Intel/E1000NetworkAdapter.cpp @@ -177,13 +177,13 @@ UNMAP_AFTER_INIT ErrorOr> E1000NetworkAdapter::cre auto rx_descriptors_region = TRY(MM.allocate_contiguous_kernel_region(TRY(Memory::page_round_up(sizeof(e1000_rx_desc) * number_of_rx_descriptors)), "E1000 RX Descriptors"sv, Memory::Region::Access::ReadWrite)); auto tx_descriptors_region = TRY(MM.allocate_contiguous_kernel_region(TRY(Memory::page_round_up(sizeof(e1000_tx_desc) * number_of_tx_descriptors)), "E1000 TX Descriptors"sv, Memory::Region::Access::ReadWrite)); - return TRY(adopt_nonnull_ref_or_enomem(new (nothrow) E1000NetworkAdapter(pci_device_identifier, + return TRY(adopt_nonnull_ref_or_enomem(new (nothrow) E1000NetworkAdapter(interface_name.representable_view(), + pci_device_identifier, irq, move(registers_io_window), move(rx_buffer_region), move(tx_buffer_region), move(rx_descriptors_region), - move(tx_descriptors_region), - move(interface_name)))); + move(tx_descriptors_region)))); } UNMAP_AFTER_INIT ErrorOr E1000NetworkAdapter::initialize(Badge) @@ -225,11 +225,12 @@ UNMAP_AFTER_INIT void E1000NetworkAdapter::setup_interrupts() enable_irq(); } -UNMAP_AFTER_INIT E1000NetworkAdapter::E1000NetworkAdapter(PCI::DeviceIdentifier const& device_identifier, u8 irq, +UNMAP_AFTER_INIT E1000NetworkAdapter::E1000NetworkAdapter(StringView interface_name, + PCI::DeviceIdentifier const& device_identifier, u8 irq, NonnullOwnPtr registers_io_window, NonnullOwnPtr rx_buffer_region, NonnullOwnPtr tx_buffer_region, NonnullOwnPtr rx_descriptors_region, - NonnullOwnPtr tx_descriptors_region, NonnullOwnPtr interface_name) - : NetworkAdapter(move(interface_name)) + NonnullOwnPtr tx_descriptors_region) + : NetworkAdapter(interface_name) , PCI::Device(device_identifier) , IRQHandler(irq) , m_registers_io_window(move(registers_io_window)) diff --git a/Kernel/Net/Intel/E1000NetworkAdapter.h b/Kernel/Net/Intel/E1000NetworkAdapter.h index bc42e485033..4d133ade7c5 100644 --- a/Kernel/Net/Intel/E1000NetworkAdapter.h +++ b/Kernel/Net/Intel/E1000NetworkAdapter.h @@ -42,10 +42,10 @@ protected: void setup_interrupts(); void setup_link(); - E1000NetworkAdapter(PCI::DeviceIdentifier const&, u8 irq, + E1000NetworkAdapter(StringView, PCI::DeviceIdentifier const&, u8 irq, NonnullOwnPtr registers_io_window, NonnullOwnPtr rx_buffer_region, NonnullOwnPtr tx_buffer_region, NonnullOwnPtr rx_descriptors_region, - NonnullOwnPtr tx_descriptors_region, NonnullOwnPtr); + NonnullOwnPtr tx_descriptors_region); virtual bool handle_irq(RegisterState const&) override; virtual StringView class_name() const override { return "E1000NetworkAdapter"sv; } diff --git a/Kernel/Net/LoopbackAdapter.cpp b/Kernel/Net/LoopbackAdapter.cpp index 14c0ce0f503..f1dbc0a27fb 100644 --- a/Kernel/Net/LoopbackAdapter.cpp +++ b/Kernel/Net/LoopbackAdapter.cpp @@ -13,12 +13,11 @@ static bool s_loopback_initialized = false; ErrorOr> LoopbackAdapter::try_create() { - auto interface_name = TRY(KString::try_create("loop"sv)); - return TRY(adopt_nonnull_ref_or_enomem(new (nothrow) LoopbackAdapter(move(interface_name)))); + return TRY(adopt_nonnull_ref_or_enomem(new (nothrow) LoopbackAdapter("loop"sv))); } -LoopbackAdapter::LoopbackAdapter(NonnullOwnPtr interface_name) - : NetworkAdapter(move(interface_name)) +LoopbackAdapter::LoopbackAdapter(StringView interface_name) + : NetworkAdapter(interface_name) { VERIFY(!s_loopback_initialized); s_loopback_initialized = true; diff --git a/Kernel/Net/LoopbackAdapter.h b/Kernel/Net/LoopbackAdapter.h index 384f4b82ff4..f1fbda008fc 100644 --- a/Kernel/Net/LoopbackAdapter.h +++ b/Kernel/Net/LoopbackAdapter.h @@ -12,7 +12,7 @@ namespace Kernel { class LoopbackAdapter final : public NetworkAdapter { private: - LoopbackAdapter(NonnullOwnPtr); + LoopbackAdapter(StringView); public: static ErrorOr> try_create(); diff --git a/Kernel/Net/NetworkAdapter.cpp b/Kernel/Net/NetworkAdapter.cpp index 452da1a091e..eac82148842 100644 --- a/Kernel/Net/NetworkAdapter.cpp +++ b/Kernel/Net/NetworkAdapter.cpp @@ -14,9 +14,9 @@ namespace Kernel { -NetworkAdapter::NetworkAdapter(NonnullOwnPtr interface_name) - : m_name(move(interface_name)) +NetworkAdapter::NetworkAdapter(StringView interface_name) { + m_name.store_characters(interface_name); } NetworkAdapter::~NetworkAdapter() = default; diff --git a/Kernel/Net/NetworkAdapter.h b/Kernel/Net/NetworkAdapter.h index 27bb1eece44..ddf9d69118a 100644 --- a/Kernel/Net/NetworkAdapter.h +++ b/Kernel/Net/NetworkAdapter.h @@ -60,7 +60,7 @@ public: virtual Type adapter_type() const = 0; virtual ErrorOr initialize(Badge) = 0; - StringView name() const { return m_name->view(); } + StringView name() const { return m_name.representable_view(); } MACAddress mac_address() { return m_mac_address; } IPv4Address ipv4_address() const { return m_ipv4_address; } IPv4Address ipv4_netmask() const { return m_ipv4_netmask; } @@ -102,7 +102,7 @@ public: void send_packet(ReadonlyBytes); protected: - NetworkAdapter(NonnullOwnPtr); + NetworkAdapter(StringView); void set_mac_address(MACAddress const& mac_address) { m_mac_address = mac_address; } void did_receive(ReadonlyBytes); virtual void send_raw(ReadonlyBytes) = 0; @@ -120,7 +120,7 @@ private: PacketList m_packet_queue; size_t m_packet_queue_size { 0 }; SpinlockProtected m_unused_packets {}; - NonnullOwnPtr m_name; + FixedStringBuffer m_name; u32 m_packets_in { 0 }; u32 m_bytes_in { 0 }; u32 m_packets_out { 0 }; diff --git a/Kernel/Net/NetworkingManagement.cpp b/Kernel/Net/NetworkingManagement.cpp index b3dc2167046..f81a036cdc3 100644 --- a/Kernel/Net/NetworkingManagement.cpp +++ b/Kernel/Net/NetworkingManagement.cpp @@ -83,12 +83,12 @@ RefPtr NetworkingManagement::lookup_by_name(StringView name) con }); } -ErrorOr> NetworkingManagement::generate_interface_name_from_pci_address(PCI::DeviceIdentifier const& device_identifier) +ErrorOr> NetworkingManagement::generate_interface_name_from_pci_address(PCI::DeviceIdentifier const& device_identifier) { VERIFY(device_identifier.class_code().value() == 0x2); // Note: This stands for e - "Ethernet", p - "Port" as for PCI bus, "s" for slot as for PCI slot - auto name = TRY(KString::formatted("ep{}s{}", device_identifier.address().bus(), device_identifier.address().device())); - VERIFY(!NetworkingManagement::the().lookup_by_name(name->view())); + auto name = TRY(FixedStringBuffer::formatted("ep{}s{}", device_identifier.address().bus(), device_identifier.address().device())); + VERIFY(!NetworkingManagement::the().lookup_by_name(name.representable_view())); return name; } diff --git a/Kernel/Net/NetworkingManagement.h b/Kernel/Net/NetworkingManagement.h index ad18a7513ed..19cfdc9edaf 100644 --- a/Kernel/Net/NetworkingManagement.h +++ b/Kernel/Net/NetworkingManagement.h @@ -26,7 +26,7 @@ public: static bool is_initialized(); bool initialize(); - static ErrorOr> generate_interface_name_from_pci_address(PCI::DeviceIdentifier const&); + static ErrorOr> generate_interface_name_from_pci_address(PCI::DeviceIdentifier const&); NetworkingManagement(); diff --git a/Kernel/Net/Realtek/RTL8168NetworkAdapter.cpp b/Kernel/Net/Realtek/RTL8168NetworkAdapter.cpp index f7b96fa41fd..7b078bfb4c0 100644 --- a/Kernel/Net/Realtek/RTL8168NetworkAdapter.cpp +++ b/Kernel/Net/Realtek/RTL8168NetworkAdapter.cpp @@ -196,7 +196,7 @@ UNMAP_AFTER_INIT ErrorOr> RTL8168NetworkAdapter::c u8 irq = pci_device_identifier.interrupt_line().value(); auto interface_name = TRY(NetworkingManagement::generate_interface_name_from_pci_address(pci_device_identifier)); auto registers_io_window = TRY(IOWindow::create_for_pci_device_bar(pci_device_identifier, PCI::HeaderType0BaseRegister::BAR0)); - return TRY(adopt_nonnull_ref_or_enomem(new (nothrow) RTL8168NetworkAdapter(pci_device_identifier, irq, move(registers_io_window), move(interface_name)))); + return TRY(adopt_nonnull_ref_or_enomem(new (nothrow) RTL8168NetworkAdapter(interface_name.representable_view(), pci_device_identifier, irq, move(registers_io_window)))); } bool RTL8168NetworkAdapter::determine_supported_version() const @@ -244,8 +244,8 @@ bool RTL8168NetworkAdapter::determine_supported_version() const } } -UNMAP_AFTER_INIT RTL8168NetworkAdapter::RTL8168NetworkAdapter(PCI::DeviceIdentifier const& device_identifier, u8 irq, NonnullOwnPtr registers_io_window, NonnullOwnPtr interface_name) - : NetworkAdapter(move(interface_name)) +UNMAP_AFTER_INIT RTL8168NetworkAdapter::RTL8168NetworkAdapter(StringView interface_name, PCI::DeviceIdentifier const& device_identifier, u8 irq, NonnullOwnPtr registers_io_window) + : NetworkAdapter(interface_name) , PCI::Device(device_identifier) , IRQHandler(irq) , m_registers_io_window(move(registers_io_window)) diff --git a/Kernel/Net/Realtek/RTL8168NetworkAdapter.h b/Kernel/Net/Realtek/RTL8168NetworkAdapter.h index 8b25fbfbd57..0d27b97e5a2 100644 --- a/Kernel/Net/Realtek/RTL8168NetworkAdapter.h +++ b/Kernel/Net/Realtek/RTL8168NetworkAdapter.h @@ -41,7 +41,7 @@ private: static constexpr size_t number_of_rx_descriptors = 64; static constexpr size_t number_of_tx_descriptors = 16; - RTL8168NetworkAdapter(PCI::DeviceIdentifier const&, u8 irq, NonnullOwnPtr registers_io_window, NonnullOwnPtr); + RTL8168NetworkAdapter(StringView, PCI::DeviceIdentifier const&, u8 irq, NonnullOwnPtr registers_io_window); virtual bool handle_irq(RegisterState const&) override; virtual StringView class_name() const override { return "RTL8168NetworkAdapter"sv; } diff --git a/Kernel/Net/VirtIO/VirtIONetworkAdapter.cpp b/Kernel/Net/VirtIO/VirtIONetworkAdapter.cpp index 959c35211f2..e933e1be106 100644 --- a/Kernel/Net/VirtIO/VirtIONetworkAdapter.cpp +++ b/Kernel/Net/VirtIO/VirtIONetworkAdapter.cpp @@ -102,12 +102,12 @@ UNMAP_AFTER_INIT ErrorOr VirtIONetworkAdapter::probe(PCI::DeviceIdentifier UNMAP_AFTER_INIT ErrorOr> VirtIONetworkAdapter::create(PCI::DeviceIdentifier const& pci_device_identifier) { auto interface_name = TRY(NetworkingManagement::generate_interface_name_from_pci_address(pci_device_identifier)); - return TRY(adopt_nonnull_ref_or_enomem(new (nothrow) VirtIONetworkAdapter(pci_device_identifier, move(interface_name)))); + return TRY(adopt_nonnull_ref_or_enomem(new (nothrow) VirtIONetworkAdapter(interface_name.representable_view(), pci_device_identifier))); } -UNMAP_AFTER_INIT VirtIONetworkAdapter::VirtIONetworkAdapter(PCI::DeviceIdentifier const& pci_device_identifier, NonnullOwnPtr interface_name) +UNMAP_AFTER_INIT VirtIONetworkAdapter::VirtIONetworkAdapter(StringView interface_name, PCI::DeviceIdentifier const& pci_device_identifier) : VirtIO::Device(pci_device_identifier) - , NetworkAdapter(move(interface_name)) + , NetworkAdapter(interface_name) { } diff --git a/Kernel/Net/VirtIO/VirtIONetworkAdapter.h b/Kernel/Net/VirtIO/VirtIONetworkAdapter.h index 1d7aff62183..07321ce0d75 100644 --- a/Kernel/Net/VirtIO/VirtIONetworkAdapter.h +++ b/Kernel/Net/VirtIO/VirtIONetworkAdapter.h @@ -35,7 +35,7 @@ public: virtual i32 link_speed() override { return m_link_speed; } private: - explicit VirtIONetworkAdapter(PCI::DeviceIdentifier const&, NonnullOwnPtr interface_name); + explicit VirtIONetworkAdapter(StringView interface_name, PCI::DeviceIdentifier const&); // VirtIO::Device virtual bool handle_device_config_change() override;