From 7e382391f32b1133c646a0184e2f426dbfc9f1d9 Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Wed, 29 Jul 2026 08:22:12 +0200 Subject: kernel: improve minor number allocation --- arch/x86_64/CMakeLists.txt | 2 +- arch/x86_64/kapi/devices.cpp | 4 +-- .../kernel/filesystem/device_number_registry.cpp | 37 ++++++++++++++++------ .../kernel/filesystem/device_number_registry.hpp | 3 +- 4 files changed, 32 insertions(+), 14 deletions(-) diff --git a/arch/x86_64/CMakeLists.txt b/arch/x86_64/CMakeLists.txt index 30c84b16..19022b5f 100644 --- a/arch/x86_64/CMakeLists.txt +++ b/arch/x86_64/CMakeLists.txt @@ -51,7 +51,7 @@ target_sources("x86_64" PRIVATE # Drivers "arch/drivers/init.cpp" - "arch/drivers/lapic.cpp" + "arch/drivers/cpu/lapic.cpp" "arch/drivers/pit.cpp" # Memory management diff --git a/arch/x86_64/kapi/devices.cpp b/arch/x86_64/kapi/devices.cpp index 62754f08..eb84bc1f 100644 --- a/arch/x86_64/kapi/devices.cpp +++ b/arch/x86_64/kapi/devices.cpp @@ -46,8 +46,8 @@ namespace kapi::devices kapi::devices::get_root_bus()->add_child(cpu_bus); - cpu_bus = kstd::make_shared(); - cpu_bus->facet()->enumerate(*cpu_bus); + // cpu_bus = kstd::make_shared(); + // cpu_bus->facet()->enumerate(*cpu_bus); } } // namespace kapi::devices \ No newline at end of file diff --git a/kernel/kernel/filesystem/device_number_registry.cpp b/kernel/kernel/filesystem/device_number_registry.cpp index 0292ff94..cced66e0 100644 --- a/kernel/kernel/filesystem/device_number_registry.cpp +++ b/kernel/kernel/filesystem/device_number_registry.cpp @@ -202,16 +202,7 @@ namespace kernel::filesystem { auto guard = kstd::lock_guard{m_lock}; - auto next_minor = m_next_minor.find(driver); - auto minor = std::uint8_t{}; - if (next_minor != m_next_minor.end()) - { - minor = next_minor->second++; - } - else - { - m_next_minor.emplace(driver, std::uint8_t{1}); - } + auto minor = allocate_minor(binding->posix_type, *driver_major); numbered = entry{ .number = {.major = *driver_major, .minor = minor}, @@ -237,6 +228,32 @@ namespace kernel::filesystem } }); } + + auto device_number_registry::allocate_minor(file_type type, std::uint8_t major) const -> std::uint8_t + { + auto used = kstd::vector{}; + for (auto const & entry : m_entries) + { + if (entry.type == type && entry.number.major == major) + { + used.push_back(entry.number.minor); + } + } + std::ranges::sort(used); + + auto candidate = std::uint8_t{}; + for (auto minor : used) + { + if (minor != candidate) + { + break; + } + ++candidate; + } + + return candidate; + } + } // namespace kernel::filesystem namespace kernel::tests::filesystem::device_number_registry diff --git a/kernel/kernel/filesystem/device_number_registry.hpp b/kernel/kernel/filesystem/device_number_registry.hpp index 43f30f72..2391f179 100644 --- a/kernel/kernel/filesystem/device_number_registry.hpp +++ b/kernel/kernel/filesystem/device_number_registry.hpp @@ -86,11 +86,12 @@ namespace kernel::filesystem auto try_number(kapi::capabilities::facet_id facet, kapi::devices::facet_registry::entry const & published) -> void; + auto allocate_minor(file_type type, std::uint8_t major) const -> std::uint8_t; + mutable kapi::tracked_mutex m_lock{}; kstd::observer_ptr m_facet_registry; mutable kstd::vector m_entries{}; - kstd::flat_map m_next_minor; kstd::vector> m_observers{}; }; -- cgit v1.2.3