Kernel: Expose process cpu time in proc filesystem
This commit is contained in:
@@ -234,6 +234,7 @@ namespace Kernel
|
|||||||
size_t proc_meminfo(off_t offset, BAN::ByteSpan) const;
|
size_t proc_meminfo(off_t offset, BAN::ByteSpan) const;
|
||||||
size_t proc_cmdline(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_environ(off_t offset, BAN::ByteSpan) const;
|
||||||
|
size_t proc_cputime(off_t offset, BAN::ByteSpan) const;
|
||||||
BAN::ErrorOr<BAN::String> proc_cwd() const;
|
BAN::ErrorOr<BAN::String> proc_cwd() const;
|
||||||
BAN::ErrorOr<BAN::String> proc_exe() const;
|
BAN::ErrorOr<BAN::String> proc_exe() const;
|
||||||
|
|
||||||
|
|||||||
@@ -16,12 +16,13 @@ namespace Kernel
|
|||||||
|
|
||||||
TRY(inode->link_inode(*inode, "."_sv));
|
TRY(inode->link_inode(*inode, "."_sv));
|
||||||
TRY(inode->link_inode(static_cast<TmpInode&>(*fs.root_inode()), ".."_sv));
|
TRY(inode->link_inode(static_cast<TmpInode&>(*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_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_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_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(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;
|
return inode;
|
||||||
}
|
}
|
||||||
@@ -38,6 +39,7 @@ namespace Kernel
|
|||||||
(void)TmpDirectoryInode::unlink_impl("meminfo"_sv);
|
(void)TmpDirectoryInode::unlink_impl("meminfo"_sv);
|
||||||
(void)TmpDirectoryInode::unlink_impl("cmdline"_sv);
|
(void)TmpDirectoryInode::unlink_impl("cmdline"_sv);
|
||||||
(void)TmpDirectoryInode::unlink_impl("environ"_sv);
|
(void)TmpDirectoryInode::unlink_impl("environ"_sv);
|
||||||
|
(void)TmpDirectoryInode::unlink_impl("cputime"_sv);
|
||||||
(void)TmpDirectoryInode::unlink_impl("cwd"_sv);
|
(void)TmpDirectoryInode::unlink_impl("cwd"_sv);
|
||||||
(void)TmpDirectoryInode::unlink_impl("exe"_sv);
|
(void)TmpDirectoryInode::unlink_impl("exe"_sv);
|
||||||
(void)TmpDirectoryInode::unlink_impl("fd"_sv);
|
(void)TmpDirectoryInode::unlink_impl("fd"_sv);
|
||||||
|
|||||||
@@ -574,6 +574,25 @@ namespace Kernel
|
|||||||
return read_from_vec_of_str(m_environ, offset, buffer);
|
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<size_t>(offset) >= data.size() + 1)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
const size_t to_copy = BAN::Math::min<size_t>(data.size() - offset + 1, buffer.size());
|
||||||
|
memcpy(buffer.data(), data.data(), to_copy);
|
||||||
|
return to_copy;
|
||||||
|
}
|
||||||
|
|
||||||
BAN::ErrorOr<BAN::String> Process::proc_cwd() const
|
BAN::ErrorOr<BAN::String> Process::proc_cwd() const
|
||||||
{
|
{
|
||||||
LockGuard _(m_process_lock);
|
LockGuard _(m_process_lock);
|
||||||
|
|||||||
Reference in New Issue
Block a user