diff options
author | Kacheong Poon <Kacheong.Poon@Sun.COM> | 2010-04-01 10:24:19 -0700 |
---|---|---|
committer | Kacheong Poon <Kacheong.Poon@Sun.COM> | 2010-04-01 10:24:19 -0700 |
commit | 66cd0f60c3182913d379abb730ae755bf6367126 (patch) | |
tree | cbdacc4e58656d42e7d3416641c7988a743eb17b /usr/src/uts/common/inet/tcp/tcp.c | |
parent | f32a9dd17a38682f8ac7fe31d66bdfaa0e68748d (diff) | |
download | illumos-joyent-66cd0f60c3182913d379abb730ae755bf6367126.tar.gz |
6935348 tcp_sack_info should always be there
6924317 TCP time wait processing is called unnecessarily
6924089 TCP Timer code does double time conversion
Diffstat (limited to 'usr/src/uts/common/inet/tcp/tcp.c')
-rw-r--r-- | usr/src/uts/common/inet/tcp/tcp.c | 64 |
1 files changed, 15 insertions, 49 deletions
diff --git a/usr/src/uts/common/inet/tcp/tcp.c b/usr/src/uts/common/inet/tcp/tcp.c index 2cc0377fd4..f0a86e257c 100644 --- a/usr/src/uts/common/inet/tcp/tcp.c +++ b/usr/src/uts/common/inet/tcp/tcp.c @@ -20,8 +20,7 @@ */ /* - * Copyright 2010 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. + * Copyright (c) 1991, 2010, Oracle and/or its affiliates. All rights reserved. */ /* Copyright (c) 1990 Mentat Inc. */ @@ -226,8 +225,6 @@ int tcp_squeue_wput = 2; /* /etc/systems */ int tcp_squeue_flag; -kmem_cache_t *tcp_sack_info_cache; - /* * To prevent memory hog, limit the number of entries in tcp_free_list * to 1% of available memory / number of cpus @@ -502,7 +499,6 @@ void tcp_cleanup(tcp_t *tcp) { mblk_t *mp; - tcp_sack_info_t *tcp_sack_info; conn_t *connp = tcp->tcp_connp; tcp_stack_t *tcps = tcp->tcp_tcps; netstack_t *ns = tcps->tcps_netstack; @@ -557,7 +553,6 @@ tcp_cleanup(tcp_t *tcp) /* Save some state */ mp = tcp->tcp_timercache; - tcp_sack_info = tcp->tcp_sack_info; tcp_rsrv_mp = tcp->tcp_rsrv_mp; if (connp->conn_cred != NULL) { @@ -583,7 +578,6 @@ tcp_cleanup(tcp_t *tcp) /* restore the state */ tcp->tcp_timercache = mp; - tcp->tcp_sack_info = tcp_sack_info; tcp->tcp_rsrv_mp = tcp_rsrv_mp; tcp->tcp_connp = connp; @@ -1376,13 +1370,8 @@ tcp_free(tcp_t *tcp) tcp->tcp_ordrel_mp = NULL; } - if (tcp->tcp_sack_info != NULL) { - if (tcp->tcp_notsack_list != NULL) { - TCP_NOTSACK_REMOVE_ALL(tcp->tcp_notsack_list, - tcp); - } - bzero(tcp->tcp_sack_info, sizeof (tcp_sack_info_t)); - } + TCP_NOTSACK_REMOVE_ALL(tcp->tcp_notsack_list, tcp); + bzero(&tcp->tcp_sack_info, sizeof (tcp_sack_info_t)); if (tcp->tcp_hopopts != NULL) { mi_free(tcp->tcp_hopopts); @@ -2133,14 +2122,8 @@ tcp_reinit_values(tcp) tcp->tcp_ecn_echo_on = B_FALSE; tcp->tcp_is_wnd_shrnk = B_FALSE; - if (tcp->tcp_sack_info != NULL) { - if (tcp->tcp_notsack_list != NULL) { - TCP_NOTSACK_REMOVE_ALL(tcp->tcp_notsack_list, - tcp); - } - kmem_cache_free(tcp_sack_info_cache, tcp->tcp_sack_info); - tcp->tcp_sack_info = NULL; - } + TCP_NOTSACK_REMOVE_ALL(tcp->tcp_notsack_list, tcp); + bzero(&tcp->tcp_sack_info, sizeof (tcp_sack_info_t)); tcp->tcp_rcv_ws = 0; tcp->tcp_snd_ws = 0; @@ -3338,7 +3321,7 @@ tcp_accept_finish(void *arg, mblk_t *mp, void *arg2, ip_recv_attr_t *dummy) if (connp->conn_keepalive) { tcp->tcp_ka_last_intrvl = 0; tcp->tcp_ka_tid = TCP_TIMER(tcp, tcp_keepalive_timer, - MSEC_TO_TICK(tcp->tcp_ka_interval)); + tcp->tcp_ka_interval); } /* @@ -4008,14 +3991,6 @@ tcp_iss_key_init(uint8_t *phrase, int len, tcp_stack_t *tcps) mutex_exit(&tcps->tcps_iss_key_lock); } -/* ARGSUSED */ -static int -tcp_sack_info_constructor(void *buf, void *cdrarg, int kmflags) -{ - bzero(buf, sizeof (tcp_sack_info_t)); - return (0); -} - /* * Called by IP when IP is loaded into the kernel */ @@ -4026,9 +4001,8 @@ tcp_ddi_g_init(void) sizeof (tcp_timer_t) + sizeof (mblk_t), 0, NULL, NULL, NULL, NULL, NULL, 0); - tcp_sack_info_cache = kmem_cache_create("tcp_sack_info_cache", - sizeof (tcp_sack_info_t), 0, - tcp_sack_info_constructor, NULL, NULL, NULL, NULL, 0); + tcp_notsack_blk_cache = kmem_cache_create("tcp_notsack_blk_cache", + sizeof (notsack_blk_t), 0, NULL, NULL, NULL, NULL, NULL, 0); mutex_init(&tcp_random_lock, NULL, MUTEX_DEFAULT, NULL); @@ -4184,7 +4158,7 @@ tcp_ddi_g_destroy(void) mutex_destroy(&tcp_random_lock); kmem_cache_destroy(tcp_timercache); - kmem_cache_destroy(tcp_sack_info_cache); + kmem_cache_destroy(tcp_notsack_blk_cache); netstack_unregister(NS_TCP); } @@ -4363,11 +4337,6 @@ tcp_squeue_add(squeue_t *sqp) sizeof (tcp_squeue_priv_t), KM_SLEEP); *squeue_getprivate(sqp, SQPRIVATE_TCP) = (intptr_t)tcp_time_wait; - /* Kick start the periodic TIME WAIT collector. */ - tcp_time_wait->tcp_time_wait_tid = - timeout_generic(CALLOUT_NORMAL, tcp_time_wait_collector, sqp, - (hrtime_t)10 * NANOSEC, CALLOUT_TCP_RESOLUTION, - CALLOUT_FLAG_ROUNDUP); if (tcp_free_list_max_cnt == 0) { int tcp_ncpus = ((boot_max_ncpus == -1) ? max_ncpus : boot_max_ncpus); @@ -4584,16 +4553,13 @@ tcp_do_connect(conn_t *connp, const struct sockaddr *sa, socklen_t len, } /* - * tcp_snd_sack_ok can be set in - * tcp_set_destination() if the sack metric - * is set. So check it here also. + * Note that tcp_snd_sack_ok can be set in tcp_set_destination() if + * the SACK metric is set. So here we just check the per stack SACK + * permitted param. */ - if (tcps->tcps_sack_permitted == 2 || - tcp->tcp_snd_sack_ok) { - if (tcp->tcp_sack_info == NULL) { - tcp->tcp_sack_info = kmem_cache_alloc( - tcp_sack_info_cache, KM_SLEEP); - } + if (tcps->tcps_sack_permitted == 2) { + ASSERT(tcp->tcp_num_sack_blk == 0); + ASSERT(tcp->tcp_notsack_list == NULL); tcp->tcp_snd_sack_ok = B_TRUE; } |