瀏覽代碼

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.
Andreas Kling 3 年之前
父節點
當前提交
e103c5fe2d
共有 1 個文件被更改,包括 7 次插入9 次删除
  1. 7 9
      Kernel/Syscalls/socket.cpp

+ 7 - 9
Kernel/Syscalls/socket.cpp

@@ -51,15 +51,13 @@ ErrorOr<FlatPtr> Process::sys$socket(int domain, int type, int protocol)
 ErrorOr<FlatPtr> Process::sys$bind(int sockfd, Userspace<sockaddr const*> address, socklen_t address_length)
 ErrorOr<FlatPtr> Process::sys$bind(int sockfd, Userspace<sockaddr const*> address, socklen_t address_length)
 {
 {
     VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this)
     VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this)
-    return m_fds.with_exclusive([&](auto& fds) -> ErrorOr<FlatPtr> {
-        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<FlatPtr> Process::sys$listen(int sockfd, int backlog)
 ErrorOr<FlatPtr> Process::sys$listen(int sockfd, int backlog)