af_unix: Try not to hold unix_gc_lock during accept().
commit fd863448 upstream. Commit dcf70df2 ("af_unix: Fix up unix_edge.successor for embryo socket.") added spin_lock(&unix_gc_lock) in accept() path, and it caused regression in a stress test as reported by kernel test robot. If the embryo socket is not part of the inflight graph, we need not hold the lock. To decide that in O(1) time and avoid the regression in the normal use case, 1. add a new stat unix_sk(sk)->scm_stat.nr_unix_fds 2. count the number of inflight AF_UNIX sockets in the receive queue under unix_state_lock() 3. move unix_update_edges() call under unix_state_lock() 4. avoid locking if nr_unix_fds is 0 in unix_update_edges() Reported-by:kernel test robot <oliver.sang@intel.com> Closes: https://lore.kernel.org/oe-lkp/202404101427.92a08551-oliver.sang@intel.com Signed-off-by:
Kuniyuki Iwashima <kuniyu@amazon.com> Link: https://lore.kernel.org/r/20240413021928.20946-1-kuniyu@amazon.com Signed-off-by:
Paolo Abeni <pabeni@redhat.com> Signed-off-by:
Lee Jones <lee@kernel.org> Signed-off-by:
Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Loading
-
mentioned in commit 4b5bf4eb
-
mentioned in commit 36ff5620
-
mentioned in commit 9c2e963f
-
mentioned in commit cfababf4
-
mentioned in commit f3f8d02e
-
mentioned in commit 86e3b411
-
mentioned in commit 6e8c3043
-
mentioned in commit 206c2f4b
-
mentioned in commit f9a2bd69
-
mentioned in commit 561fd8ad
-
mentioned in commit 43cbbeb1
-
mentioned in commit a130d07d
-
mentioned in commit 98aebd30
Please sign in to comment