]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/commit
Implement cycle-detecting garbage collector for AF_UNIX sockets
authorJason A. Harmening <jah@FreeBSD.org>
Sat, 25 Jan 2020 08:57:26 +0000 (08:57 +0000)
committerJason A. Harmening <jah@FreeBSD.org>
Sat, 25 Jan 2020 08:57:26 +0000 (08:57 +0000)
commita9aa06f7b1c607cd2410886aee467a8e79b74461
tree6dffe34e90fd0a45ab0e2ed60e296851aa2bc0fa
parent0db2ca0c31983b2ca94e57b695a0b29277ab2daf
Implement cycle-detecting garbage collector for AF_UNIX sockets

The existing AF_UNIX socket garbage collector destroys any socket
which may potentially be in a cycle, as indicated by its file reference
count being equal to its enqueue count. However, this can produce false
positives for in-flight sockets which aren't part of a cycle but are
part of one or more SCM_RIGHTS mssages and which have been closed
on the sending side. If the garbage collector happens to run at
exactly the wrong time, destruction of these sockets will render them
unusable on the receiving side, such that no previously-written data
may be read.

This change rewrites the garbage collector to precisely detect cycles:

1. The existing check of msgcount==f_count is still used to determine
   whether the socket is potentially in a cycle.
2. The socket is now placed on a local "dead list", which is used to
   reduce iteration time (and therefore contention on the global
   unp_link_rwlock).
3. The first pass through the dead list removes each potentially-dead
   socket's outgoing references from the graph of potentially-dead
   sockets, using a gc-specific copy of the original reference count.
4. The second series of passes through the dead list removes from the
   list any socket whose remaining gc refcount is non-zero, as this
   indicates the socket is actually accessible outside of any possible
   cycle.  Iteration is repeated until no further sockets are removed
   from the dead list.
5. Sockets remaining in the dead list are destroyed as before.

PR: 227285
Submitted by: jan.kokemueller@gmail.com (prior version)
Reviewed by: markj
Differential Revision: https://reviews.freebsd.org/D23142
sys/kern/uipc_usrreq.c
sys/sys/unpcb.h