summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--AK/Format.cpp12
-rw-r--r--Kernel/API/Syscall.h4
-rw-r--r--Kernel/FileSystem/SysFS/Subsystems/Kernel/Processes.cpp2
-rw-r--r--Kernel/Memory/MemoryManager.cpp14
-rw-r--r--Kernel/PerformanceEventBuffer.cpp9
-rw-r--r--Kernel/Process.cpp48
-rw-r--r--Kernel/Process.h10
-rw-r--r--Kernel/Syscalls/execve.cpp2
-rw-r--r--Kernel/Syscalls/fork.cpp2
-rw-r--r--Kernel/Syscalls/kill.cpp4
-rw-r--r--Kernel/Syscalls/process.cpp16
-rw-r--r--Kernel/Syscalls/thread.cpp4
-rw-r--r--Kernel/Thread.cpp17
13 files changed, 102 insertions, 42 deletions
diff --git a/AK/Format.cpp b/AK/Format.cpp
index 20c08ac1be..10b18c0e63 100644
--- a/AK/Format.cpp
+++ b/AK/Format.cpp
@@ -905,7 +905,9 @@ void vdbgln(StringView fmtstr, TypeErasedFormatParams& params)
struct timespec ts = TimeManagement::the().monotonic_time(TimePrecision::Coarse).to_timespec();
if (Kernel::Thread::current()) {
auto& thread = *Kernel::Thread::current();
- builder.appendff("{}.{:03} \033[34;1m[#{} {}({}:{})]\033[0m: ", ts.tv_sec, ts.tv_nsec / 1000000, Kernel::Processor::current_id(), thread.process().name(), thread.pid().value(), thread.tid().value());
+ thread.process().name().with([&](auto& process_name) {
+ builder.appendff("{}.{:03} \033[34;1m[#{} {}({}:{})]\033[0m: ", ts.tv_sec, ts.tv_nsec / 1000000, Kernel::Processor::current_id(), process_name->view(), thread.pid().value(), thread.tid().value());
+ });
} else {
builder.appendff("{}.{:03} \033[34;1m[#{} Kernel]\033[0m: ", ts.tv_sec, ts.tv_nsec / 1000000, Kernel::Processor::current_id());
}
@@ -958,7 +960,9 @@ void vdmesgln(StringView fmtstr, TypeErasedFormatParams& params)
if (Kernel::Processor::is_initialized() && Kernel::Thread::current()) {
auto& thread = *Kernel::Thread::current();
- builder.appendff("{}.{:03} \033[34;1m[{}({}:{})]\033[0m: ", ts.tv_sec, ts.tv_nsec / 1000000, thread.process().name(), thread.pid().value(), thread.tid().value());
+ thread.process().name().with([&](auto& process_name) {
+ builder.appendff("{}.{:03} \033[34;1m[{}({}:{})]\033[0m: ", ts.tv_sec, ts.tv_nsec / 1000000, process_name->view(), thread.pid().value(), thread.tid().value());
+ });
} else {
builder.appendff("{}.{:03} \033[34;1m[Kernel]\033[0m: ", ts.tv_sec, ts.tv_nsec / 1000000);
}
@@ -983,7 +987,9 @@ void v_critical_dmesgln(StringView fmtstr, TypeErasedFormatParams& params)
# ifdef AK_OS_SERENITY
if (Kernel::Processor::is_initialized() && Kernel::Thread::current()) {
auto& thread = *Kernel::Thread::current();
- builder.appendff("[{}({}:{})]: ", thread.process().name(), thread.pid().value(), thread.tid().value());
+ thread.process().name().with([&](auto& process_name) {
+ builder.appendff("[{}({}:{})]: ", process_name->view(), thread.pid().value(), thread.tid().value());
+ });
} else {
builder.appendff("[Kernel]: ");
}
diff --git a/Kernel/API/Syscall.h b/Kernel/API/Syscall.h
index 2de0b8f337..eff0fadc4f 100644
--- a/Kernel/API/Syscall.h
+++ b/Kernel/API/Syscall.h
@@ -82,7 +82,7 @@ enum class NeedsBigProcessLock {
S(ftruncate, NeedsBigProcessLock::No) \
S(futex, NeedsBigProcessLock::Yes) \
S(get_dir_entries, NeedsBigProcessLock::Yes) \
- S(get_process_name, NeedsBigProcessLock::Yes) \
+ S(get_process_name, NeedsBigProcessLock::No) \
S(get_root_session_id, NeedsBigProcessLock::No) \
S(get_stack_bounds, NeedsBigProcessLock::No) \
S(get_thread_name, NeedsBigProcessLock::Yes) \
@@ -157,7 +157,7 @@ enum class NeedsBigProcessLock {
S(sendmsg, NeedsBigProcessLock::Yes) \
S(set_coredump_metadata, NeedsBigProcessLock::No) \
S(set_mmap_name, NeedsBigProcessLock::Yes) \
- S(set_process_name, NeedsBigProcessLock::Yes) \
+ S(set_process_name, NeedsBigProcessLock::No) \
S(set_thread_name, NeedsBigProcessLock::Yes) \
S(setegid, NeedsBigProcessLock::No) \
S(seteuid, NeedsBigProcessLock::No) \
diff --git a/Kernel/FileSystem/SysFS/Subsystems/Kernel/Processes.cpp b/Kernel/FileSystem/SysFS/Subsystems/Kernel/Processes.cpp
index 10500a3608..e53d1047b7 100644
--- a/Kernel/FileSystem/SysFS/Subsystems/Kernel/Processes.cpp
+++ b/Kernel/FileSystem/SysFS/Subsystems/Kernel/Processes.cpp
@@ -79,7 +79,7 @@ ErrorOr<void> SysFSOverallProcesses::try_generate(KBufferBuilder& builder)
TRY(process_object.add("tty"sv, ""));
}
TRY(process_object.add("nfds"sv, process.fds().with_shared([](auto& fds) { return fds.open_count(); })));
- TRY(process_object.add("name"sv, process.name()));
+ TRY(process.name().with([&](auto& process_name) { return process_object.add("name"sv, process_name->view()); }));
TRY(process_object.add("executable"sv, process.executable() ? TRY(process.executable()->try_serialize_absolute_path())->view() : ""sv));
size_t amount_virtual = 0;
diff --git a/Kernel/Memory/MemoryManager.cpp b/Kernel/Memory/MemoryManager.cpp
index c54e7e3d3d..8dd49c1b99 100644
--- a/Kernel/Memory/MemoryManager.cpp
+++ b/Kernel/Memory/MemoryManager.cpp
@@ -864,12 +864,14 @@ ErrorOr<CommittedPhysicalPageSet> MemoryManager::commit_physical_pages(size_t pa
amount_shared = space->amount_shared();
amount_virtual = space->amount_virtual();
});
- dbgln("{}({}) resident:{}, shared:{}, virtual:{}",
- process.name(),
- process.pid(),
- amount_resident / PAGE_SIZE,
- amount_shared / PAGE_SIZE,
- amount_virtual / PAGE_SIZE);
+ process.name().with([&](auto& process_name) {
+ dbgln("{}({}) resident:{}, shared:{}, virtual:{}",
+ process_name->view(),
+ process.pid(),
+ amount_resident / PAGE_SIZE,
+ amount_shared / PAGE_SIZE,
+ amount_virtual / PAGE_SIZE);
+ });
return IterationDecision::Continue;
});
}
diff --git a/Kernel/PerformanceEventBuffer.cpp b/Kernel/PerformanceEventBuffer.cpp
index 123cb26013..71781b8b77 100644
--- a/Kernel/PerformanceEventBuffer.cpp
+++ b/Kernel/PerformanceEventBuffer.cpp
@@ -335,10 +335,13 @@ OwnPtr<PerformanceEventBuffer> PerformanceEventBuffer::try_create_with_size(size
ErrorOr<void> PerformanceEventBuffer::add_process(Process const& process, ProcessEventType event_type)
{
OwnPtr<KString> executable;
- if (process.executable())
+ if (process.executable()) {
executable = TRY(process.executable()->try_serialize_absolute_path());
- else
- executable = TRY(KString::formatted("<{}>", process.name()));
+ } else {
+ executable = TRY(process.name().with([&](auto& process_name) {
+ return KString::formatted("<{}>", process_name->view());
+ }));
+ }
TRY(append_with_ip_and_bp(process.pid(), 0, 0, 0,
event_type == ProcessEventType::Create ? PERF_EVENT_PROCESS_CREATE : PERF_EVENT_PROCESS_EXEC,
diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp
index 4662821b98..400a7bdab4 100644
--- a/Kernel/Process.cpp
+++ b/Kernel/Process.cpp
@@ -334,7 +334,11 @@ Process::Process(NonnullOwnPtr<KString> name, NonnullRefPtr<Credentials> credent
protected_data.credentials = move(credentials);
});
- dbgln_if(PROCESS_DEBUG, "Created new process {}({})", m_name, this->pid().value());
+ if constexpr (PROCESS_DEBUG) {
+ this->name().with([&](auto& process_name) {
+ dbgln("Created new process {}({})", process_name->view(), this->pid().value());
+ });
+ }
}
ErrorOr<void> Process::attach_resources(NonnullOwnPtr<Memory::AddressSpace>&& preallocated_space, LockRefPtr<Thread>& first_thread, Process* fork_parent)
@@ -671,7 +675,9 @@ ErrorOr<void> Process::dump_core()
dbgln("Generating coredump for pid {} failed because coredump directory was not set.", pid().value());
return {};
}
- auto coredump_path = TRY(KString::formatted("{}/{}_{}_{}", coredump_directory_path->view(), name(), pid().value(), kgettimeofday().to_truncated_seconds()));
+ auto coredump_path = TRY(name().with([&](auto& process_name) {
+ return KString::formatted("{}/{}_{}_{}", coredump_directory_path->view(), process_name->view(), pid().value(), kgettimeofday().to_truncated_seconds());
+ }));
auto coredump = TRY(Coredump::try_create(*this, coredump_path->view()));
return coredump->write();
}
@@ -683,7 +689,9 @@ ErrorOr<void> Process::dump_perfcore()
dbgln("Generating perfcore for pid: {}", pid().value());
// Try to generate a filename which isn't already used.
- auto base_filename = TRY(KString::formatted("{}_{}", name(), pid().value()));
+ auto base_filename = TRY(name().with([&](auto& process_name) {
+ return KString::formatted("{}_{}", process_name->view(), pid().value());
+ }));
auto perfcore_filename = TRY(KString::formatted("{}.profile", base_filename));
LockRefPtr<OpenFileDescription> description;
auto credentials = this->credentials();
@@ -721,8 +729,11 @@ void Process::finalize()
dbgln_if(PROCESS_DEBUG, "Finalizing process {}", *this);
- if (veil_state() == VeilState::Dropped)
- dbgln("\x1b[01;31mProcess '{}' exited with the veil left open\x1b[0m", name());
+ if (veil_state() == VeilState::Dropped) {
+ name().with([&](auto& process_name) {
+ dbgln("\x1b[01;31mProcess '{}' exited with the veil left open\x1b[0m", process_name->view());
+ });
+ }
if (g_init_pid != 0 && pid() == g_init_pid)
PANIC("Init process quit unexpectedly. Exit code: {}", termination_status());
@@ -831,11 +842,20 @@ void Process::die()
auto& process = *it;
++it;
if (process.has_tracee_thread(pid())) {
- dbgln_if(PROCESS_DEBUG, "Process {} ({}) is attached by {} ({}) which will exit", process.name(), process.pid(), name(), pid());
+ if constexpr (PROCESS_DEBUG) {
+ process.name().with([&](auto& process_name) {
+ name().with([&](auto& name) {
+ dbgln("Process {} ({}) is attached by {} ({}) which will exit", process_name->view(), process.pid(), name->view(), pid());
+ });
+ });
+ }
process.stop_tracing();
auto err = process.send_signal(SIGSTOP, this);
- if (err.is_error())
- dbgln("Failed to send the SIGSTOP signal to {} ({})", process.name(), process.pid());
+ if (err.is_error()) {
+ process.name().with([&](auto& process_name) {
+ dbgln("Failed to send the SIGSTOP signal to {} ({})", process_name->view(), process.pid());
+ });
+ }
}
}
});
@@ -1077,4 +1097,16 @@ ErrorOr<NonnullRefPtr<Custody>> Process::custody_for_dirfd(int dirfd)
return *base_description->custody();
}
+SpinlockProtected<NonnullOwnPtr<KString>, LockRank::None> const& Process::name() const
+{
+ return m_name;
+}
+
+void Process::set_name(NonnullOwnPtr<KString> name)
+{
+ m_name.with([&](auto& this_name) {
+ this_name = move(name);
+ });
+}
+
}
diff --git a/Kernel/Process.h b/Kernel/Process.h
index 3916e4d257..6b9e0cd605 100644
--- a/Kernel/Process.h
+++ b/Kernel/Process.h
@@ -220,7 +220,9 @@ public:
static LockRefPtr<Process> from_pid_ignoring_jails(ProcessID);
static SessionID get_sid_from_pgid(ProcessGroupID pgid);
- StringView name() const { return m_name->view(); }
+ SpinlockProtected<NonnullOwnPtr<KString>, LockRank::None> const& name() const;
+ void set_name(NonnullOwnPtr<KString>);
+
ProcessID pid() const
{
return with_protected_data([](auto& protected_data) { return protected_data.pid; });
@@ -669,7 +671,7 @@ private:
IntrusiveListNode<Process> m_list_node;
- NonnullOwnPtr<KString> m_name;
+ SpinlockProtected<NonnullOwnPtr<KString>, LockRank::None> m_name;
SpinlockProtected<OwnPtr<Memory::AddressSpace>, LockRank::None> m_space;
@@ -1027,7 +1029,9 @@ template<>
struct AK::Formatter<Kernel::Process> : AK::Formatter<FormatString> {
ErrorOr<void> format(FormatBuilder& builder, Kernel::Process const& value)
{
- return AK::Formatter<FormatString>::format(builder, "{}({})"sv, value.name(), value.pid().value());
+ return value.name().with([&](auto& process_name) {
+ return AK::Formatter<FormatString>::format(builder, "{}({})"sv, process_name->view(), value.pid().value());
+ });
}
};
diff --git a/Kernel/Syscalls/execve.cpp b/Kernel/Syscalls/execve.cpp
index c7414b1b35..9d8fcf16dc 100644
--- a/Kernel/Syscalls/execve.cpp
+++ b/Kernel/Syscalls/execve.cpp
@@ -647,7 +647,7 @@ ErrorOr<void> Process::do_exec(NonnullLockRefPtr<OpenFileDescription> main_progr
// and we don't want to deal with faults after this point.
auto new_userspace_sp = TRY(make_userspace_context_for_main_thread(new_main_thread->regs(), *load_result.stack_region.unsafe_ptr(), m_arguments, m_environment, move(auxv)));
- m_name = move(new_process_name);
+ set_name(move(new_process_name));
new_main_thread->set_name(move(new_main_thread_name));
if (wait_for_tracer_at_next_execve()) {
diff --git a/Kernel/Syscalls/fork.cpp b/Kernel/Syscalls/fork.cpp
index 0135ee4cf4..148926e3e9 100644
--- a/Kernel/Syscalls/fork.cpp
+++ b/Kernel/Syscalls/fork.cpp
@@ -27,7 +27,7 @@ ErrorOr<FlatPtr> Process::sys$fork(RegisterState& regs)
}
};
- auto child_name = TRY(m_name->try_clone());
+ auto child_name = TRY(name().with([](auto& name) { return name->try_clone(); }));
auto credentials = this->credentials();
auto child = TRY(Process::try_create(child_first_thread, move(child_name), credentials->uid(), credentials->gid(), pid(), m_is_kernel_process, current_directory(), executable(), m_tty, this));
diff --git a/Kernel/Syscalls/kill.cpp b/Kernel/Syscalls/kill.cpp
index a9b72d2e37..77d8ba24c8 100644
--- a/Kernel/Syscalls/kill.cpp
+++ b/Kernel/Syscalls/kill.cpp
@@ -22,7 +22,9 @@ ErrorOr<void> Process::do_kill(Process& process, int signal)
if (!can_send_signal)
return EPERM;
if (process.is_kernel_process()) {
- dbgln("Attempted to send signal {} to kernel process {} ({})", signal, process.name(), process.pid());
+ process.name().with([&](auto& process_name) {
+ dbgln("Attempted to send signal {} to kernel process {} ({})", signal, process_name->view(), process.pid());
+ });
return EPERM;
}
if (signal != 0)
diff --git a/Kernel/Syscalls/process.cpp b/Kernel/Syscalls/process.cpp
index 612e8d8e67..e2922dec9d 100644
--- a/Kernel/Syscalls/process.cpp
+++ b/Kernel/Syscalls/process.cpp
@@ -25,18 +25,22 @@ ErrorOr<FlatPtr> Process::sys$getppid()
ErrorOr<FlatPtr> Process::sys$get_process_name(Userspace<char*> buffer, size_t buffer_size)
{
- VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this);
+ VERIFY_NO_PROCESS_BIG_LOCK(this);
TRY(require_promise(Pledge::stdio));
- if (m_name->length() + 1 > buffer_size)
- return ENAMETOOLONG;
- TRY(copy_to_user(buffer, m_name->characters(), m_name->length() + 1));
+ TRY(m_name.with([&buffer, buffer_size](auto& name) -> ErrorOr<void> {
+ if (name->length() + 1 > buffer_size)
+ return ENAMETOOLONG;
+
+ return copy_to_user(buffer, name->characters(), name->length() + 1);
+ }));
+
return 0;
}
ErrorOr<FlatPtr> Process::sys$set_process_name(Userspace<char const*> user_name, size_t user_name_length)
{
- VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this);
+ VERIFY_NO_PROCESS_BIG_LOCK(this);
TRY(require_promise(Pledge::proc));
if (user_name_length > 256)
return ENAMETOOLONG;
@@ -44,7 +48,7 @@ ErrorOr<FlatPtr> Process::sys$set_process_name(Userspace<char const*> user_name,
// Empty and whitespace-only names only exist to confuse users.
if (name->view().is_whitespace())
return EINVAL;
- m_name = move(name);
+ set_name(move(name));
return 0;
}
diff --git a/Kernel/Syscalls/thread.cpp b/Kernel/Syscalls/thread.cpp
index e3da9f0a99..1093f48fca 100644
--- a/Kernel/Syscalls/thread.cpp
+++ b/Kernel/Syscalls/thread.cpp
@@ -47,7 +47,9 @@ ErrorOr<FlatPtr> Process::sys$create_thread(void* (*entry)(void*), Userspace<Sys
// We know this thread is not the main_thread,
// So give it a unique name until the user calls $set_thread_name on it
- auto new_thread_name = TRY(KString::formatted("{} [{}]", m_name, thread->tid().value()));
+ auto new_thread_name = TRY(name().with([&](auto& process_name) {
+ return KString::formatted("{} [{}]", process_name->view(), thread->tid().value());
+ }));
thread->set_name(move(new_thread_name));
if (!is_thread_joinable)
diff --git a/Kernel/Thread.cpp b/Kernel/Thread.cpp
index c92a7bfd67..0c047e4df8 100644
--- a/Kernel/Thread.cpp
+++ b/Kernel/Thread.cpp
@@ -47,7 +47,7 @@ ErrorOr<NonnullLockRefPtr<Thread>> Thread::try_create(NonnullLockRefPtr<Process>
auto block_timer = TRY(try_make_lock_ref_counted<Timer>());
- auto name = TRY(KString::try_create(process->name()));
+ auto name = TRY(process->name().with([](auto& name) { return name->try_clone(); }));
return adopt_nonnull_lock_ref_or_enomem(new (nothrow) Thread(move(process), move(kernel_stack_region), move(block_timer), move(name)));
}
@@ -72,8 +72,11 @@ Thread::Thread(NonnullLockRefPtr<Process> process, NonnullOwnPtr<Memory::Region>
list.append(*this);
});
- if constexpr (THREAD_DEBUG)
- dbgln("Created new thread {}({}:{})", m_process->name(), m_process->pid().value(), m_tid.value());
+ if constexpr (THREAD_DEBUG) {
+ m_process->name().with([&](auto& process_name) {
+ dbgln("Created new thread {}({}:{})", process_name->view(), m_process->pid().value(), m_tid.value());
+ });
+ }
reset_fpu_state();
@@ -1467,7 +1470,9 @@ void Thread::track_lock_release(LockRank rank)
ErrorOr<void> AK::Formatter<Kernel::Thread>::format(FormatBuilder& builder, Kernel::Thread const& value)
{
- return AK::Formatter<FormatString>::format(
- builder,
- "{}({}:{})"sv, value.process().name(), value.pid().value(), value.tid().value());
+ return value.process().name().with([&](auto& process_name) {
+ return AK::Formatter<FormatString>::format(
+ builder,
+ "{}({}:{})"sv, process_name->view(), value.pid().value(), value.tid().value());
+ });
}