aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@ost.ch>2026-07-29 08:22:12 +0200
committerFelix Morgner <felix.morgner@ost.ch>2026-07-29 08:22:12 +0200
commit7e382391f32b1133c646a0184e2f426dbfc9f1d9 (patch)
tree4230aabf844e3b09348eda4f75bacd9807fe7f5a
parent044083a8d5b3fe94c4b9f9b066f25c81915fd4c1 (diff)
downloadkernel-7e382391f32b1133c646a0184e2f426dbfc9f1d9.tar.xz
kernel-7e382391f32b1133c646a0184e2f426dbfc9f1d9.zip
kernel: improve minor number allocation
-rw-r--r--arch/x86_64/CMakeLists.txt2
-rw-r--r--arch/x86_64/kapi/devices.cpp4
-rw-r--r--kernel/kernel/filesystem/device_number_registry.cpp37
-rw-r--r--kernel/kernel/filesystem/device_number_registry.hpp3
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{};
};