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 f301ca1e
-
mentioned in commit f8deba0c
-
mentioned in commit 7c4fc96c
-
mentioned in commit 3bea431f
-
mentioned in commit a74600c6
-
mentioned in commit 2cab8cd9
-
mentioned in commit 4b80874c
-
mentioned in commit 70aebcec
-
mentioned in commit d3d077c2
-
mentioned in commit 45f502a3
-
mentioned in commit 917a1250
-
mentioned in commit 9ad91610
-
mentioned in commit 45271a2c
Please sign in to comment