From e103c5fe2d29e7c867c34095e14dbbc3b9d9e6ad Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sun, 3 Apr 2022 22:20:34 +0200 Subject: [PATCH] Kernel: Don't hog file descriptor table lock in sys$bind() We don't need to hold the lock across the entire syscall. Once we've fetched the open file description we're interested in, we can let go. --- Kernel/Syscalls/socket.cpp | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/Kernel/Syscalls/socket.cpp b/Kernel/Syscalls/socket.cpp index 4f3b0f0286..57d742e668 100644 --- a/Kernel/Syscalls/socket.cpp +++ b/Kernel/Syscalls/socket.cpp @@ -51,15 +51,13 @@ ErrorOr Process::sys$socket(int domain, int type, int protocol) ErrorOr Process::sys$bind(int sockfd, Userspace address, socklen_t address_length) { VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this) - return m_fds.with_exclusive([&](auto& fds) -> ErrorOr { - auto description = TRY(fds.open_file_description(sockfd)); - if (!description->is_socket()) - return ENOTSOCK; - auto& socket = *description->socket(); - REQUIRE_PROMISE_FOR_SOCKET_DOMAIN(socket.domain()); - TRY(socket.bind(address, address_length)); - return 0; - }); + auto description = TRY(open_file_description(sockfd)); + if (!description->is_socket()) + return ENOTSOCK; + auto& socket = *description->socket(); + REQUIRE_PROMISE_FOR_SOCKET_DOMAIN(socket.domain()); + TRY(socket.bind(address, address_length)); + return 0; } ErrorOr Process::sys$listen(int sockfd, int backlog)