Kernel: Disable big process lock for sys$get_stack_bounds

This syscall only reads from the shared m_space field, but that field
is only over written to by Process::attach_resources, before the
process was initialized (aka, before syscalls can happen), by
Process::finalize which is only called after all the process' threads
have exited (aka, syscalls can not happen anymore), and by
Process::do_exec which calls all other syscall-capable threads before
doing so. Space's find_region_containing already holds its own lock,
and as such there's no need to hold the big lock.
This commit is contained in:
Idan Horowitz 2021-08-06 15:21:08 +03:00 committed by Andreas Kling
parent d40038a04f
commit efeb01e35f
Notes: sideshowbarker 2024-07-18 07:23:26 +09:00
2 changed files with 2 additions and 2 deletions

View File

@ -177,7 +177,7 @@ enum class NeedsBigProcessLock {
S(unveil, NeedsBigProcessLock::Yes) \ S(unveil, NeedsBigProcessLock::Yes) \
S(perf_event, NeedsBigProcessLock::Yes) \ S(perf_event, NeedsBigProcessLock::Yes) \
S(shutdown, NeedsBigProcessLock::Yes) \ S(shutdown, NeedsBigProcessLock::Yes) \
S(get_stack_bounds, NeedsBigProcessLock::Yes) \ S(get_stack_bounds, NeedsBigProcessLock::No) \
S(ptrace, NeedsBigProcessLock::Yes) \ S(ptrace, NeedsBigProcessLock::Yes) \
S(sendfd, NeedsBigProcessLock::Yes) \ S(sendfd, NeedsBigProcessLock::Yes) \
S(recvfd, NeedsBigProcessLock::Yes) \ S(recvfd, NeedsBigProcessLock::Yes) \

View File

@ -11,7 +11,7 @@ namespace Kernel {
KResultOr<FlatPtr> Process::sys$get_stack_bounds(Userspace<FlatPtr*> user_stack_base, Userspace<size_t*> user_stack_size) KResultOr<FlatPtr> Process::sys$get_stack_bounds(Userspace<FlatPtr*> user_stack_base, Userspace<size_t*> user_stack_size)
{ {
VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this); VERIFY_NO_PROCESS_BIG_LOCK(this);
auto& regs = Thread::current()->get_register_dump_from_stack(); auto& regs = Thread::current()->get_register_dump_from_stack();
FlatPtr stack_pointer = regs.userspace_sp(); FlatPtr stack_pointer = regs.userspace_sp();
auto* stack_region = address_space().find_region_containing(Memory::VirtualRange { VirtualAddress(stack_pointer), 1 }); auto* stack_region = address_space().find_region_containing(Memory::VirtualRange { VirtualAddress(stack_pointer), 1 });