Date: Sat, 21 Dec 2002 19:24:19 +0100 From: Pierre Beyssac <pb@fasterix.frmug.org> To: freebsd-current@freebsd.org Cc: hsu@freebsd.org, jlemon@freebsd.org Subject: panic in netinet/tcp_syncache.c: syncache_timer Message-ID: <20021221182419.GA913@fasterix.frmug.org>
next in thread | raw e-mail | index | archive | help
I'd like a review of the following fix I'd like to commit. The syncache_timer() function seems to have a locking problem causing panics, even after yesterday's patches. This apparently occurs when there are unexpired syncache entries while the corresponding listening socket is closed. tcp_close() destroys the relevant lock in the inpcb structure, which causes INP_LOCK() on that structure in the next syncache_timer() call to panic. I'm testing the patch below, which simply removes the inpcb locking and avoids the panic. It seems safe to me since we're running splnet, but I'm not sure it's correct since I suppose the locking is there for a reason... --- tcp_syncache.c.old Sat Dec 21 03:03:22 2002 +++ tcp_syncache.c Sat Dec 21 17:50:10 2002 @@ -384,14 +384,12 @@ break; sc = nsc; inp = sc->sc_tp->t_inpcb; - INP_LOCK(inp); if (slot == SYNCACHE_MAXREXMTS || slot >= tcp_syncache.rexmt_limit || inp->inp_gencnt != sc->sc_inp_gencnt) { nsc = TAILQ_NEXT(sc, sc_timerq); syncache_drop(sc, NULL); tcpstat.tcps_sc_stale++; - INP_UNLOCK(inp); continue; } /* @@ -400,7 +398,6 @@ * entry on the timer chain until it has completed. */ (void) syncache_respond(sc, NULL); - INP_UNLOCK(inp); nsc = TAILQ_NEXT(sc, sc_timerq); tcpstat.tcps_sc_retransmitted++; TAILQ_REMOVE(&tcp_syncache.timerq[slot], sc, sc_timerq); -- Pierre Beyssac pb@fasterix.frmug.org pb@fasterix.freenix.org Free domains: http://www.eu.org/ or mail dns-manager@EU.org To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20021221182419.GA913>