Browse Source

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.
Idan Horowitz 4 years ago
parent
commit
efeb01e35f
2 changed files with 2 additions and 2 deletions
  1. 1 1
      Kernel/API/Syscall.h
  2. 1 1
      Kernel/Syscalls/get_stack_bounds.cpp

+ 1 - 1
Kernel/API/Syscall.h

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

+ 1 - 1
Kernel/Syscalls/get_stack_bounds.cpp

@@ -11,7 +11,7 @@ namespace Kernel {
 
 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();
     FlatPtr stack_pointer = regs.userspace_sp();
     auto* stack_region = address_space().find_region_containing(Memory::VirtualRange { VirtualAddress(stack_pointer), 1 });