diff options
| author | Felix Morgner <felix.morgner@ost.ch> | 2026-07-29 08:22:12 +0200 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@ost.ch> | 2026-07-29 08:22:12 +0200 |
| commit | 7e382391f32b1133c646a0184e2f426dbfc9f1d9 (patch) | |
| tree | 4230aabf844e3b09348eda4f75bacd9807fe7f5a | |
| parent | 044083a8d5b3fe94c4b9f9b066f25c81915fd4c1 (diff) | |
| download | kernel-7e382391f32b1133c646a0184e2f426dbfc9f1d9.tar.xz kernel-7e382391f32b1133c646a0184e2f426dbfc9f1d9.zip | |
kernel: improve minor number allocation
| -rw-r--r-- | arch/x86_64/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | arch/x86_64/kapi/devices.cpp | 4 | ||||
| -rw-r--r-- | kernel/kernel/filesystem/device_number_registry.cpp | 37 | ||||
| -rw-r--r-- | kernel/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<arch::bus::cpu>(); - cpu_bus->facet<kapi::devices::bus_protocol>()->enumerate(*cpu_bus); + // cpu_bus = kstd::make_shared<arch::bus::cpu>(); + // cpu_bus->facet<kapi::devices::bus_protocol>()->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<std::uint8_t>{}; + 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<kapi::devices::facet_registry> m_facet_registry; mutable kstd::vector<entry> m_entries{}; - kstd::flat_map<kapi::devices::driver const *, std::uint8_t> m_next_minor; kstd::vector<kstd::weak_ptr<device_number_registry_observer>> m_observers{}; }; |
