From c56e1c53783ae0f2c7388160cf88c0c6b7c09081 Mon Sep 17 00:00:00 2001 From: Liav A Date: Mon, 20 Feb 2023 17:51:18 +0200 Subject: [PATCH] Kernel/FileSystem: Simplify the ProcFS significantly Since the ProcFS doesn't hold many global objects within it, the need for a fully-structured design of backing components and a registry like with the SysFS is no longer true. To acommodate this, let's remove all backing store and components of the ProcFS, so now it resembles what we had in the early days of ProcFS in the project - a mostly-static filesystem, with very small amount of kmalloc allocations needed. We still use the inode index mechanism to understand the role of each inode, but this is done in a much "static"ier way than before. --- Kernel/Arch/aarch64/init.cpp | 1 - Kernel/Arch/x86_64/init.cpp | 2 - Kernel/Bus/PCI/Access.cpp | 1 - Kernel/CMakeLists.txt | 5 +- .../FileSystem/ProcFS/ComponentRegistry.cpp | 33 -- Kernel/FileSystem/ProcFS/Definitions.h | 64 +++ Kernel/FileSystem/ProcFS/FileSystem.cpp | 10 +- Kernel/FileSystem/ProcFS/FileSystem.h | 3 + Kernel/FileSystem/ProcFS/Inode.cpp | 486 +++++++----------- Kernel/FileSystem/ProcFS/Inode.h | 85 ++- .../ProcFS/ProcessExposed.cpp} | 92 ++-- Kernel/Forward.h | 6 - Kernel/Process.cpp | 3 - Kernel/Process.h | 39 +- Kernel/ProcessExposed.cpp | 245 --------- Kernel/ProcessExposed.h | 165 ------ Kernel/ProcessProcFSTraits.cpp | 73 --- Kernel/Thread.cpp | 1 - 18 files changed, 362 insertions(+), 952 deletions(-) delete mode 100644 Kernel/FileSystem/ProcFS/ComponentRegistry.cpp create mode 100644 Kernel/FileSystem/ProcFS/Definitions.h rename Kernel/{ProcessSpecificExposed.cpp => FileSystem/ProcFS/ProcessExposed.cpp} (69%) delete mode 100644 Kernel/ProcessExposed.cpp delete mode 100644 Kernel/ProcessExposed.h delete mode 100644 Kernel/ProcessProcFSTraits.cpp diff --git a/Kernel/Arch/aarch64/init.cpp b/Kernel/Arch/aarch64/init.cpp index 78ad3c91ce..7a690cce94 100644 --- a/Kernel/Arch/aarch64/init.cpp +++ b/Kernel/Arch/aarch64/init.cpp @@ -175,7 +175,6 @@ extern "C" [[noreturn]] void init() Processor::disable_interrupts(); TimeManagement::initialize(0); - ProcFSComponentRegistry::initialize(); JailManagement::the(); Process::initialize(); diff --git a/Kernel/Arch/x86_64/init.cpp b/Kernel/Arch/x86_64/init.cpp index 4e62011afc..cc2b2757c2 100644 --- a/Kernel/Arch/x86_64/init.cpp +++ b/Kernel/Arch/x86_64/init.cpp @@ -47,7 +47,6 @@ #include #include #include -#include #include #include #include @@ -232,7 +231,6 @@ extern "C" [[noreturn]] UNMAP_AFTER_INIT void init(BootInfo const& boot_info) __stack_chk_guard = get_fast_random(); - ProcFSComponentRegistry::initialize(); JailManagement::the(); Process::initialize(); diff --git a/Kernel/Bus/PCI/Access.cpp b/Kernel/Bus/PCI/Access.cpp index 507e968145..322471a929 100644 --- a/Kernel/Bus/PCI/Access.cpp +++ b/Kernel/Bus/PCI/Access.cpp @@ -18,7 +18,6 @@ #include #include #include -#include #include namespace Kernel::PCI { diff --git a/Kernel/CMakeLists.txt b/Kernel/CMakeLists.txt index 8d1734e923..f880747190 100644 --- a/Kernel/CMakeLists.txt +++ b/Kernel/CMakeLists.txt @@ -141,9 +141,9 @@ set(KERNEL_SOURCES FileSystem/Plan9FS/FileSystem.cpp FileSystem/Plan9FS/Inode.cpp FileSystem/Plan9FS/Message.cpp - FileSystem/ProcFS/ComponentRegistry.cpp FileSystem/ProcFS/FileSystem.cpp FileSystem/ProcFS/Inode.cpp + FileSystem/ProcFS/ProcessExposed.cpp FileSystem/RAMFS/FileSystem.cpp FileSystem/RAMFS/Inode.cpp FileSystem/SysFS/Component.cpp @@ -255,10 +255,7 @@ set(KERNEL_SOURCES Net/UDPSocket.cpp PerformanceEventBuffer.cpp Process.cpp - ProcessExposed.cpp - ProcessSpecificExposed.cpp ProcessGroup.cpp - ProcessProcFSTraits.cpp Random.cpp Scheduler.cpp ScopedCritical.cpp diff --git a/Kernel/FileSystem/ProcFS/ComponentRegistry.cpp b/Kernel/FileSystem/ProcFS/ComponentRegistry.cpp deleted file mode 100644 index d0437ad302..0000000000 --- a/Kernel/FileSystem/ProcFS/ComponentRegistry.cpp +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2018-2021, Andreas Kling - * Copyright (c) 2021, Spencer Dixon - * Copyright (c) 2021, Liav A. - * - * SPDX-License-Identifier: BSD-2-Clause - */ - -#include -#include -#include - -namespace Kernel { - -static Singleton s_the; - -ProcFSComponentRegistry& ProcFSComponentRegistry::the() -{ - return *s_the; -} - -UNMAP_AFTER_INIT void ProcFSComponentRegistry::initialize() -{ - VERIFY(!s_the.is_initialized()); - s_the.ensure_instance(); -} - -UNMAP_AFTER_INIT ProcFSComponentRegistry::ProcFSComponentRegistry() - : m_root_directory(ProcFSRootDirectory::must_create()) -{ -} - -} diff --git a/Kernel/FileSystem/ProcFS/Definitions.h b/Kernel/FileSystem/ProcFS/Definitions.h new file mode 100644 index 0000000000..d47ddf0563 --- /dev/null +++ b/Kernel/FileSystem/ProcFS/Definitions.h @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2023, Liav A. + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include + +namespace Kernel { + +struct segmented_global_inode_index { + StringView name; + u8 file_type; + u32 primary; + u16 subdirectory; + u32 property; +}; + +constexpr segmented_global_inode_index global_inode_ids[] = { + { "."sv, DT_DIR, 0, 0, 1 }, // NOTE: This is here for the root directory + { "self"sv, DT_DIR, 0, 0, 2 } +}; + +struct segmented_process_directory_entry { + StringView name; + u8 file_type; + u16 subdirectory; + u32 property; +}; + +constexpr segmented_process_directory_entry main_process_directory_root_entry = { "."sv, DT_DIR, 0, 0 }; +constexpr segmented_process_directory_entry process_fd_subdirectory_root_entry = { "."sv, DT_DIR, 1, 0 }; +constexpr segmented_process_directory_entry process_stacks_subdirectory_root_entry = { "."sv, DT_DIR, 2, 0 }; +constexpr segmented_process_directory_entry process_children_subdirectory_root_entry = { "."sv, DT_DIR, 3, 0 }; + +constexpr segmented_process_directory_entry process_fd_directory_entry = { "fd"sv, DT_DIR, 1, 0 }; +constexpr segmented_process_directory_entry process_stacks_directory_entry = { "stacks"sv, DT_DIR, 2, 0 }; +constexpr segmented_process_directory_entry process_children_directory_entry = { "children"sv, DT_DIR, 3, 0 }; +constexpr segmented_process_directory_entry process_unveil_list_entry = { "unveil"sv, DT_REG, 0, 1 }; +constexpr segmented_process_directory_entry process_pledge_list_entry = { "pledge"sv, DT_REG, 0, 2 }; +constexpr segmented_process_directory_entry process_fds_list_entry = { "fds"sv, DT_REG, 0, 3 }; +constexpr segmented_process_directory_entry process_exe_symlink_entry = { "exe"sv, DT_LNK, 0, 4 }; +constexpr segmented_process_directory_entry process_cwd_symlink_entry = { "cwd"sv, DT_LNK, 0, 5 }; +constexpr segmented_process_directory_entry process_perf_events_entry = { "perf_events"sv, DT_REG, 0, 6 }; +constexpr segmented_process_directory_entry process_vm_entry = { "vm"sv, DT_REG, 0, 7 }; +constexpr segmented_process_directory_entry process_cmdline_entry = { "cmdline"sv, DT_REG, 0, 8 }; +constexpr segmented_process_directory_entry main_process_directory_entries[] = { + process_fd_directory_entry, + process_stacks_directory_entry, + process_children_directory_entry, + process_unveil_list_entry, + process_pledge_list_entry, + process_fds_list_entry, + process_exe_symlink_entry, + process_cwd_symlink_entry, + process_perf_events_entry, + process_vm_entry, + process_cmdline_entry, +}; + +} diff --git a/Kernel/FileSystem/ProcFS/FileSystem.cpp b/Kernel/FileSystem/ProcFS/FileSystem.cpp index e573c3ff37..1423424327 100644 --- a/Kernel/FileSystem/ProcFS/FileSystem.cpp +++ b/Kernel/FileSystem/ProcFS/FileSystem.cpp @@ -8,7 +8,6 @@ #include #include -#include namespace Kernel { @@ -20,9 +19,16 @@ ErrorOr> ProcFS::try_create() ProcFS::ProcFS() = default; ProcFS::~ProcFS() = default; +ErrorOr> ProcFS::get_inode(InodeIdentifier inode_id) const +{ + if (inode_id.index() == 1) + return *m_root_inode; + return TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) ProcFSInode(const_cast(*this), inode_id.index()))); +} + ErrorOr ProcFS::initialize() { - m_root_inode = TRY(ProcFSComponentRegistry::the().root_directory().to_inode(*this)); + m_root_inode = TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) ProcFSInode(const_cast(*this), 1))); return {}; } diff --git a/Kernel/FileSystem/ProcFS/FileSystem.h b/Kernel/FileSystem/ProcFS/FileSystem.h index 217ab7b7e2..fbec219017 100644 --- a/Kernel/FileSystem/ProcFS/FileSystem.h +++ b/Kernel/FileSystem/ProcFS/FileSystem.h @@ -16,6 +16,7 @@ namespace Kernel { class ProcFSInode; class ProcFS final : public FileSystem { friend class ProcFSInode; + friend class Process; public: virtual ~ProcFS() override; @@ -29,6 +30,8 @@ public: private: ProcFS(); + ErrorOr> get_inode(InodeIdentifier) const; + LockRefPtr m_root_inode; }; diff --git a/Kernel/FileSystem/ProcFS/Inode.cpp b/Kernel/FileSystem/ProcFS/Inode.cpp index 536b275c83..11ff289b24 100644 --- a/Kernel/FileSystem/ProcFS/Inode.cpp +++ b/Kernel/FileSystem/ProcFS/Inode.cpp @@ -1,189 +1,125 @@ /* * Copyright (c) 2018-2021, Andreas Kling * Copyright (c) 2021, Spencer Dixon - * Copyright (c) 2021-2022, Liav A. + * Copyright (c) 2021-2023, Liav A. * * SPDX-License-Identifier: BSD-2-Clause */ #include #include -#include +#include namespace Kernel { ProcFSInode::~ProcFSInode() = default; -ErrorOr ProcFSInode::flush_metadata() +static mode_t determine_procfs_process_inode_mode(u32 subdirectory, u32 property) { - return {}; -} - -ErrorOr ProcFSInode::add_child(Inode&, StringView, mode_t) -{ - return EROFS; -} - -ErrorOr> ProcFSInode::create_child(StringView, mode_t, dev_t, UserID, GroupID) -{ - return EROFS; -} - -ErrorOr ProcFSInode::remove_child(StringView) -{ - return EROFS; -} - -ErrorOr ProcFSInode::chmod(mode_t) -{ - return EPERM; -} - -ErrorOr ProcFSInode::chown(UserID, GroupID) -{ - return EPERM; -} - -ErrorOr ProcFSInode::replace_child(StringView, Inode&) -{ - return EROFS; -} - -ErrorOr ProcFSInode::write_bytes_locked(off_t, size_t, UserOrKernelBuffer const&, OpenFileDescription*) -{ - return EROFS; -} - -ErrorOr ProcFSInode::truncate(u64) -{ - return EROFS; -} - -ErrorOr ProcFSInode::update_timestamps(Optional