Date: Tue, 16 Aug 2016 13:08:03 +0000 (UTC) From: Randall Stewart <rrs@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r304219 - head/sys/netinet Message-ID: <201608161308.u7GD83Nx093050@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: rrs Date: Tue Aug 16 13:08:03 2016 New Revision: 304219 URL: https://svnweb.freebsd.org/changeset/base/304219 Log: Comments describing how to properly use the new lock_add functions and its respective companion. Sponsored by: Netflix Inc. Modified: head/sys/netinet/tcp_timer.c Modified: head/sys/netinet/tcp_timer.c ============================================================================== --- head/sys/netinet/tcp_timer.c Tue Aug 16 12:40:56 2016 (r304218) +++ head/sys/netinet/tcp_timer.c Tue Aug 16 13:08:03 2016 (r304219) @@ -301,6 +301,25 @@ tcp_timer_delack(void *xtp) CURVNET_RESTORE(); } +/* + * When a timer wants to remove a TCB it must + * hold the INP_INFO_RLOCK(). The timer function + * should only have grabbed the INP_WLOCK() when + * it entered. To safely switch to holding both the + * INP_INFO_RLOCK() and the INP_WLOCK() we must first + * grab a reference on the inp, this will hold the inp + * so that it can't be removed. We then unlock and grab + * the info-read lock. Once we have the INP_INFO_RLOCK() we + * proceed again to get the INP_WLOCK() but after that + * we must check if someone else deleted the pcb i.e. + * the inp_flags check. If so we return 1 otherwise + * we return 0. + * + * No matter which the tcp_inpinfo_lock_add() function + * returns the caller must afterwards call tcp_inpinfo_lock_del() + * to drop the locks and reference properly. + */ + int tcp_inpinfo_lock_add(struct inpcb *inp) {
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201608161308.u7GD83Nx093050>