From 00f2a986760c7720fac58c365f427720bd71b755 Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Thu, 10 Sep 2026 10:03:46 +0200 Subject: kernel/vfs: reduce number registry pruning Previously, the number registry did a pruning pass whenever elements, either all or a filtered subset, were queried by a consumer. This meant, that every access to elements did an additional O(n) scan of the entire registry, to ensure no expired devices were still registered. This used to be necessary, when the ownership model for devices was still in flux. With the established device ownership model, this has become obsolete. Additionally, devices get numbered automatically when a device gains a facet the is observed by the device number registry. Since registering this type of facet is the responsibility of the device driver, since only a driver can know how to implement that facet for any given device, it also becomes the responsibility of the driver to revoke that facet if and when a device is detached from the system. Any device is always owned by the bus it is attached to. This means it is the bus' responsibility to inform drivers about devices disappearing. This closes the chain of responsibility cleanly, meaning the device number registry will never have to prune itself in any accessors. Instead, it will be informed by the facet registry that a facet for a device has been revoked, allowing it to un-number that device if applicable. --- kernel/kernel/vfs/device_number_registry.cpp | 7 ------- kernel/kernel/vfs/device_number_registry.hpp | 2 +- 2 files changed, 1 insertion(+), 8 deletions(-) (limited to 'kernel') diff --git a/kernel/kernel/vfs/device_number_registry.cpp b/kernel/kernel/vfs/device_number_registry.cpp index 738ce043..b423a5b0 100644 --- a/kernel/kernel/vfs/device_number_registry.cpp +++ b/kernel/kernel/vfs/device_number_registry.cpp @@ -59,8 +59,6 @@ namespace kernel::vfs { auto guard = kstd::lock_guard{m_lock}; - erase_if(m_entries, [&](auto entry) { return entry.device.expired(); }); - auto found = std::ranges::find_if(m_entries, [&](auto entry) { return entry.number == number && entry.type == type; }); @@ -82,8 +80,6 @@ namespace kernel::vfs { auto guard = kstd::lock_guard{m_lock}; - erase_if(m_entries, [&](auto entry) { return entry.device.expired(); }); - auto found = std::ranges::find_if(m_entries, [&](auto entry) { auto locked = entry.device.lock(); return locked.get() == &device; @@ -100,9 +96,6 @@ namespace kernel::vfs auto device_number_registry::all() const -> kstd::vector { auto guard = kstd::lock_guard{m_lock}; - - erase_if(m_entries, [&](auto entry) { return entry.device.expired(); }); - return m_entries; } diff --git a/kernel/kernel/vfs/device_number_registry.hpp b/kernel/kernel/vfs/device_number_registry.hpp index 734da498..a9c12ad1 100644 --- a/kernel/kernel/vfs/device_number_registry.hpp +++ b/kernel/kernel/vfs/device_number_registry.hpp @@ -91,7 +91,7 @@ namespace kernel::vfs mutable kapi::tracked_mutex m_lock{}; kstd::observer_ptr m_facet_registry; - mutable kstd::vector m_entries{}; + kstd::vector m_entries{}; kstd::vector> m_observers{}; }; -- cgit v1.2.3