diff options
author | rwatson <rwatson@FreeBSD.org> | 2006-04-22 19:23:24 +0000 |
---|---|---|
committer | rwatson <rwatson@FreeBSD.org> | 2006-04-22 19:23:24 +0000 |
commit | 50a8765b0e43141314192d80110085aa5e9a8f1b (patch) | |
tree | 9c44dabe682b514f18b273aece1bb26a130fadcf | |
parent | 935d16472d8127aa61a9f26885d070c361bb1523 (diff) | |
download | FreeBSD-src-50a8765b0e43141314192d80110085aa5e9a8f1b.zip FreeBSD-src-50a8765b0e43141314192d80110085aa5e9a8f1b.tar.gz |
Introduce a new TCP mutex, isn_mtx, which protects the initial sequence
number state, rather than re-using pcbinfo. This introduces some
additional mutex operations during isn query, but avoids hitting the TCP
pcbinfo lock out of yet another frequently firing TCP timer.
MFC after: 3 months
-rw-r--r-- | sys/netinet/tcp_subr.c | 9 | ||||
-rw-r--r-- | sys/netinet/tcp_timewait.c | 9 |
2 files changed, 12 insertions, 6 deletions
diff --git a/sys/netinet/tcp_subr.c b/sys/netinet/tcp_subr.c index 92da5c5..bab6248 100644 --- a/sys/netinet/tcp_subr.c +++ b/sys/netinet/tcp_subr.c @@ -244,6 +244,7 @@ struct tcpcb_mem { static uma_zone_t tcpcb_zone; static uma_zone_t tcptw_zone; struct callout isn_callout; +static struct mtx isn_mtx; /* * TCP initialization. @@ -313,6 +314,7 @@ tcp_init(void) syncache_init(); tcp_hc_init(); tcp_reass_init(); + mtx_init(&isn_mtx, "isn_mtx", NULL, MTX_DEF); callout_init(&isn_callout, CALLOUT_MPSAFE); tcp_isn_tick(NULL); EVENTHANDLER_REGISTER(shutdown_pre_sync, tcp_fini, NULL, @@ -1392,9 +1394,9 @@ tcp_new_isn(struct tcpcb *tp) u_int32_t md5_buffer[4]; tcp_seq new_isn; - INP_INFO_WLOCK_ASSERT(&tcbinfo); INP_LOCK_ASSERT(tp->t_inpcb); + mtx_lock(&isn_mtx); /* Seed if this is the first use, reseed if requested. */ if ((isn_last_reseed == 0) || ((tcp_isn_reseed_interval > 0) && (((u_int)isn_last_reseed + (u_int)tcp_isn_reseed_interval*hz) @@ -1427,6 +1429,7 @@ tcp_new_isn(struct tcpcb *tp) isn_offset += ISN_STATIC_INCREMENT + (arc4random() & ISN_RANDOM_INCREMENT); new_isn += isn_offset; + mtx_unlock(&isn_mtx); return (new_isn); } @@ -1440,7 +1443,7 @@ tcp_isn_tick(void *xtp) { u_int32_t projected_offset; - INP_INFO_WLOCK(&tcbinfo); + mtx_lock(&isn_mtx); projected_offset = isn_offset_old + ISN_BYTES_PER_SECOND / 100; if (projected_offset > isn_offset) @@ -1448,7 +1451,7 @@ tcp_isn_tick(void *xtp) isn_offset_old = isn_offset; callout_reset(&isn_callout, hz/100, tcp_isn_tick, NULL); - INP_INFO_WUNLOCK(&tcbinfo); + mtx_unlock(&isn_mtx); } /* diff --git a/sys/netinet/tcp_timewait.c b/sys/netinet/tcp_timewait.c index 92da5c5..bab6248 100644 --- a/sys/netinet/tcp_timewait.c +++ b/sys/netinet/tcp_timewait.c @@ -244,6 +244,7 @@ struct tcpcb_mem { static uma_zone_t tcpcb_zone; static uma_zone_t tcptw_zone; struct callout isn_callout; +static struct mtx isn_mtx; /* * TCP initialization. @@ -313,6 +314,7 @@ tcp_init(void) syncache_init(); tcp_hc_init(); tcp_reass_init(); + mtx_init(&isn_mtx, "isn_mtx", NULL, MTX_DEF); callout_init(&isn_callout, CALLOUT_MPSAFE); tcp_isn_tick(NULL); EVENTHANDLER_REGISTER(shutdown_pre_sync, tcp_fini, NULL, @@ -1392,9 +1394,9 @@ tcp_new_isn(struct tcpcb *tp) u_int32_t md5_buffer[4]; tcp_seq new_isn; - INP_INFO_WLOCK_ASSERT(&tcbinfo); INP_LOCK_ASSERT(tp->t_inpcb); + mtx_lock(&isn_mtx); /* Seed if this is the first use, reseed if requested. */ if ((isn_last_reseed == 0) || ((tcp_isn_reseed_interval > 0) && (((u_int)isn_last_reseed + (u_int)tcp_isn_reseed_interval*hz) @@ -1427,6 +1429,7 @@ tcp_new_isn(struct tcpcb *tp) isn_offset += ISN_STATIC_INCREMENT + (arc4random() & ISN_RANDOM_INCREMENT); new_isn += isn_offset; + mtx_unlock(&isn_mtx); return (new_isn); } @@ -1440,7 +1443,7 @@ tcp_isn_tick(void *xtp) { u_int32_t projected_offset; - INP_INFO_WLOCK(&tcbinfo); + mtx_lock(&isn_mtx); projected_offset = isn_offset_old + ISN_BYTES_PER_SECOND / 100; if (projected_offset > isn_offset) @@ -1448,7 +1451,7 @@ tcp_isn_tick(void *xtp) isn_offset_old = isn_offset; callout_reset(&isn_callout, hz/100, tcp_isn_tick, NULL); - INP_INFO_WUNLOCK(&tcbinfo); + mtx_unlock(&isn_mtx); } /* |