From c3f668a758addcf80154d42e95a701edce4bbe59 Mon Sep 17 00:00:00 2001 From: Idan Horowitz Date: Fri, 6 Aug 2021 15:12:33 +0300 Subject: [PATCH] Kernel: Make Process's m_promises & m_execpromises fields atomic This is essentially free on x86 and allows us to not hold the big process lock just to check the required promises for a syscall. --- Kernel/Process.h | 8 ++++---- Kernel/Syscalls/execve.cpp | 4 ++-- Kernel/Syscalls/fork.cpp | 8 ++++---- Kernel/Syscalls/pledge.cpp | 4 ++-- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Kernel/Process.h b/Kernel/Process.h index a7deaef04e..9a197e5ce1 100644 --- a/Kernel/Process.h +++ b/Kernel/Process.h @@ -92,10 +92,10 @@ protected: gid_t m_sgid { 0 }; Vector m_extra_gids; bool m_dumpable { false }; - bool m_has_promises { false }; - u32 m_promises { 0 }; - bool m_has_execpromises { false }; - u32 m_execpromises { 0 }; + Atomic m_has_promises { false }; + Atomic m_promises { 0 }; + Atomic m_has_execpromises { false }; + Atomic m_execpromises { 0 }; mode_t m_umask { 022 }; VirtualAddress m_signal_trampoline; Atomic m_thread_count { 0 }; diff --git a/Kernel/Syscalls/execve.cpp b/Kernel/Syscalls/execve.cpp index ec4991a493..5ee3589dab 100644 --- a/Kernel/Syscalls/execve.cpp +++ b/Kernel/Syscalls/execve.cpp @@ -639,8 +639,8 @@ KResult Process::do_exec(NonnullRefPtr main_program_description { ProtectedDataMutationScope scope { *this }; - m_promises = m_execpromises; - m_has_promises = m_has_execpromises; + m_promises = m_execpromises.load(); + m_has_promises = m_has_execpromises.load(); m_execpromises = 0; m_has_execpromises = false; diff --git a/Kernel/Syscalls/fork.cpp b/Kernel/Syscalls/fork.cpp index 038d48b666..cab53f8a19 100644 --- a/Kernel/Syscalls/fork.cpp +++ b/Kernel/Syscalls/fork.cpp @@ -30,10 +30,10 @@ KResultOr Process::sys$fork(RegisterState& regs) { ProtectedDataMutationScope scope { *child }; - child->m_promises = m_promises; - child->m_execpromises = m_execpromises; - child->m_has_promises = m_has_promises; - child->m_has_execpromises = m_has_execpromises; + child->m_promises = m_promises.load(); + child->m_execpromises = m_execpromises.load(); + child->m_has_promises = m_has_promises.load(); + child->m_has_execpromises = m_has_execpromises.load(); child->m_sid = m_sid; child->m_extra_gids = m_extra_gids; child->m_umask = m_umask; diff --git a/Kernel/Syscalls/pledge.cpp b/Kernel/Syscalls/pledge.cpp index 885b1317a1..f021f718b1 100644 --- a/Kernel/Syscalls/pledge.cpp +++ b/Kernel/Syscalls/pledge.cpp @@ -74,13 +74,13 @@ KResultOr Process::sys$pledge(Userspace