From 579cd071093f0fd42906752d8c81a5bf740a8b00 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Fri, 26 Jun 2026 01:42:35 +0300 Subject: [PATCH] Kernel: Expose process cpu time in proc filesystem --- kernel/include/kernel/Process.h | 1 + kernel/kernel/FS/ProcFS/Inode.cpp | 6 ++++-- kernel/kernel/Process.cpp | 19 +++++++++++++++++++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/kernel/include/kernel/Process.h b/kernel/include/kernel/Process.h index 707c164c..531504b8 100644 --- a/kernel/include/kernel/Process.h +++ b/kernel/include/kernel/Process.h @@ -234,6 +234,7 @@ namespace Kernel size_t proc_meminfo(off_t offset, BAN::ByteSpan) const; size_t proc_cmdline(off_t offset, BAN::ByteSpan) const; size_t proc_environ(off_t offset, BAN::ByteSpan) const; + size_t proc_cputime(off_t offset, BAN::ByteSpan) const; BAN::ErrorOr proc_cwd() const; BAN::ErrorOr proc_exe() const; diff --git a/kernel/kernel/FS/ProcFS/Inode.cpp b/kernel/kernel/FS/ProcFS/Inode.cpp index d199fcf8..3f79c410 100644 --- a/kernel/kernel/FS/ProcFS/Inode.cpp +++ b/kernel/kernel/FS/ProcFS/Inode.cpp @@ -16,12 +16,13 @@ namespace Kernel TRY(inode->link_inode(*inode, "."_sv)); TRY(inode->link_inode(static_cast(*fs.root_inode()), ".."_sv)); - TRY(inode->link_inode(*MUST(ProcROProcessInode::create_new(process, &Process::proc_meminfo, fs, 0400)), "meminfo"_sv)); + TRY(inode->link_inode(*MUST(ProcROProcessInode::create_new(process, &Process::proc_meminfo, fs, 0444)), "meminfo"_sv)); TRY(inode->link_inode(*MUST(ProcROProcessInode::create_new(process, &Process::proc_cmdline, fs, 0444)), "cmdline"_sv)); TRY(inode->link_inode(*MUST(ProcROProcessInode::create_new(process, &Process::proc_environ, fs, 0400)), "environ"_sv)); + TRY(inode->link_inode(*MUST(ProcROProcessInode::create_new(process, &Process::proc_cputime, fs, 0444)), "cputime"_sv)); TRY(inode->link_inode(*MUST(ProcSymlinkProcessInode::create_new(process, &Process::proc_cwd, fs, 0777)), "cwd"_sv)); TRY(inode->link_inode(*MUST(ProcSymlinkProcessInode::create_new(process, &Process::proc_exe, fs, 0777)), "exe"_sv)); - TRY(inode->link_inode(*MUST(ProcFDDirectoryInode::create_new(process, fs, 0777)), "fd"_sv)); + TRY(inode->link_inode(*MUST(ProcFDDirectoryInode::create_new(process, fs, 0500)), "fd"_sv)); return inode; } @@ -38,6 +39,7 @@ namespace Kernel (void)TmpDirectoryInode::unlink_impl("meminfo"_sv); (void)TmpDirectoryInode::unlink_impl("cmdline"_sv); (void)TmpDirectoryInode::unlink_impl("environ"_sv); + (void)TmpDirectoryInode::unlink_impl("cputime"_sv); (void)TmpDirectoryInode::unlink_impl("cwd"_sv); (void)TmpDirectoryInode::unlink_impl("exe"_sv); (void)TmpDirectoryInode::unlink_impl("fd"_sv); diff --git a/kernel/kernel/Process.cpp b/kernel/kernel/Process.cpp index b1d07397..33e910cf 100644 --- a/kernel/kernel/Process.cpp +++ b/kernel/kernel/Process.cpp @@ -574,6 +574,25 @@ namespace Kernel return read_from_vec_of_str(m_environ, offset, buffer); } + size_t Process::proc_cputime(off_t offset, BAN::ByteSpan buffer) const + { + const uint64_t cpu_time_ns = [this] { + uint64_t cpu_time_ns { 0 }; + LockGuard _(m_process_lock); + for (auto* thread : m_threads) + cpu_time_ns += thread->cpu_time_ns(); + return cpu_time_ns; + }(); + + auto data = MUST(BAN::String::formatted("{}", cpu_time_ns)); + if (static_cast(offset) >= data.size() + 1) + return 0; + + const size_t to_copy = BAN::Math::min(data.size() - offset + 1, buffer.size()); + memcpy(buffer.data(), data.data(), to_copy); + return to_copy; + } + BAN::ErrorOr Process::proc_cwd() const { LockGuard _(m_process_lock);