use of V_tcbinfo lock for TCP syncache
Karim Fodil-Lemelin
fodillemlinkarim at gmail.com
Wed Dec 19 19:50:34 UTC 2012
On 19/12/2012 2:31 PM, Vijay Singh wrote:
> As it is today, a socket upcall on a listener socket is made with the
> V_tcbinfo lock held. [tcp_input -> syncache_socket -> sonewconn ->
> sowakeup].
>
> I feel that the use of the V_tcbinfo is not consistent in the syncache code.
>
> In syncache_add(), we drop the lock before doing the lookup:
>
> INP_WUNLOCK(inp);
> INP_INFO_WUNLOCK(&V_tcbinfo);
> [..snip..]
> sc = syncache_lookup(inc, &sch); /* returns locked entry */
>
> However, when going through syncache_expand() or syncache_chkrst() we
> keep the V_tcbinfo lock.
>
> Since the syncache has its own lock, do we need to hold the V_tcbinfo
> lock when calling syncache_socket()?
>
>
Every time the list of TCP control blocks (tcbinfo) is manipulated, a
write lock must be held to protect it. syncache_expand() is responsible
for 'expanding' the listening socket into a full blown accepted socket,
including creating its associated control block in the process.
By the way I don't think V_tcbinfo lock is held for syncache_chkrst() or
needed for that matter but I could be wrong since I'm looking at 7.x code.
Karim.
More information about the freebsd-net
mailing list