diff options
Diffstat (limited to 'usr/src')
-rw-r--r-- | usr/src/uts/common/inet/ip/ipclassifier.c | 9 | ||||
-rw-r--r-- | usr/src/uts/common/inet/tcp.h | 28 | ||||
-rw-r--r-- | usr/src/uts/common/inet/tcp/tcp.c | 64 | ||||
-rw-r--r-- | usr/src/uts/common/inet/tcp/tcp_fusion.c | 7 | ||||
-rw-r--r-- | usr/src/uts/common/inet/tcp/tcp_input.c | 61 | ||||
-rw-r--r-- | usr/src/uts/common/inet/tcp/tcp_opt_data.c | 8 | ||||
-rw-r--r-- | usr/src/uts/common/inet/tcp/tcp_output.c | 12 | ||||
-rw-r--r-- | usr/src/uts/common/inet/tcp/tcp_sack.c | 36 | ||||
-rw-r--r-- | usr/src/uts/common/inet/tcp/tcp_time_wait.c | 74 | ||||
-rw-r--r-- | usr/src/uts/common/inet/tcp/tcp_timers.c | 22 | ||||
-rw-r--r-- | usr/src/uts/common/inet/tcp_impl.h | 12 | ||||
-rw-r--r-- | usr/src/uts/common/inet/tcp_sack.h | 35 | ||||
-rw-r--r-- | usr/src/uts/intel/ip/ip.global-objs.debug64 | 5 | ||||
-rw-r--r-- | usr/src/uts/intel/ip/ip.global-objs.obj64 | 5 | ||||
-rw-r--r-- | usr/src/uts/sparc/ip/ip.global-objs.debug64 | 5 | ||||
-rw-r--r-- | usr/src/uts/sparc/ip/ip.global-objs.obj64 | 5 |
16 files changed, 170 insertions, 218 deletions
diff --git a/usr/src/uts/common/inet/ip/ipclassifier.c b/usr/src/uts/common/inet/ip/ipclassifier.c index bd37503d0b..f2ca88e5a1 100644 --- a/usr/src/uts/common/inet/ip/ipclassifier.c +++ b/usr/src/uts/common/inet/ip/ipclassifier.c @@ -19,8 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2010 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. + * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. */ /* @@ -685,12 +684,6 @@ ipcl_conn_destroy(conn_t *connp) tcp->tcp_tcps = NULL; - if (tcp->tcp_sack_info != NULL) { - bzero(tcp->tcp_sack_info, sizeof (tcp_sack_info_t)); - kmem_cache_free(tcp_sack_info_cache, - tcp->tcp_sack_info); - } - /* * tcp_rsrv_mp can be NULL if tcp_get_conn() fails to allocate * the mblk. diff --git a/usr/src/uts/common/inet/tcp.h b/usr/src/uts/common/inet/tcp.h index ce15f101ba..befce69047 100644 --- a/usr/src/uts/common/inet/tcp.h +++ b/usr/src/uts/common/inet/tcp.h @@ -19,8 +19,7 @@ * CDDL HEADER END */ /* - * 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. */ @@ -146,7 +145,7 @@ typedef struct tcp_s { /* Pointer to next T/W block */ struct tcp_s *tcp_time_wait_prev; /* Pointer to previous T/W next */ - clock_t tcp_time_wait_expire; + int64_t tcp_time_wait_expire; struct conn_s *tcp_connp; /* back pointer to conn_t */ tcp_stack_t *tcp_tcps; /* back pointer to tcp_stack_t */ @@ -257,17 +256,18 @@ typedef struct tcp_s { mblk_t *tcp_reass_head; /* Out of order reassembly list head */ mblk_t *tcp_reass_tail; /* Out of order reassembly list tail */ - tcp_sack_info_t *tcp_sack_info; - -#define tcp_pipe tcp_sack_info->tcp_pipe -#define tcp_fack tcp_sack_info->tcp_fack -#define tcp_sack_snxt tcp_sack_info->tcp_sack_snxt -#define tcp_max_sack_blk tcp_sack_info->tcp_max_sack_blk -#define tcp_num_sack_blk tcp_sack_info->tcp_num_sack_blk -#define tcp_sack_list tcp_sack_info->tcp_sack_list -#define tcp_num_notsack_blk tcp_sack_info->tcp_num_notsack_blk -#define tcp_cnt_notsack_list tcp_sack_info->tcp_cnt_notsack_list -#define tcp_notsack_list tcp_sack_info->tcp_notsack_list + /* SACK related info */ + tcp_sack_info_t tcp_sack_info; + +#define tcp_pipe tcp_sack_info.tcp_pipe +#define tcp_fack tcp_sack_info.tcp_fack +#define tcp_sack_snxt tcp_sack_info.tcp_sack_snxt +#define tcp_max_sack_blk tcp_sack_info.tcp_max_sack_blk +#define tcp_num_sack_blk tcp_sack_info.tcp_num_sack_blk +#define tcp_sack_list tcp_sack_info.tcp_sack_list +#define tcp_num_notsack_blk tcp_sack_info.tcp_num_notsack_blk +#define tcp_cnt_notsack_list tcp_sack_info.tcp_cnt_notsack_list +#define tcp_notsack_list tcp_sack_info.tcp_notsack_list mblk_t *tcp_rcv_list; /* Queued until push, urgent data, */ mblk_t *tcp_rcv_last_head; /* optdata, or the count exceeds */ 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; } diff --git a/usr/src/uts/common/inet/tcp/tcp_fusion.c b/usr/src/uts/common/inet/tcp/tcp_fusion.c index f5bd5031ea..aad533de2b 100644 --- a/usr/src/uts/common/inet/tcp/tcp_fusion.c +++ b/usr/src/uts/common/inet/tcp/tcp_fusion.c @@ -19,8 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2010 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. + * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. */ #include <sys/types.h> @@ -733,9 +732,7 @@ tcp_fuse_rcv_drain(queue_t *q, tcp_t *tcp, mblk_t **sigurg_mpp) (mp = allocb_tryhard(1)) == NULL) { /* Alloc failed; try again next time */ tcp->tcp_push_tid = TCP_TIMER(tcp, - tcp_push_timer, - MSEC_TO_TICK( - tcps->tcps_push_timer_interval)); + tcp_push_timer, tcps->tcps_push_timer_interval); return (B_TRUE); } else if (sigurg_mpp != NULL) { /* diff --git a/usr/src/uts/common/inet/tcp/tcp_input.c b/usr/src/uts/common/inet/tcp/tcp_input.c index 0741a8292f..2346431e3c 100644 --- a/usr/src/uts/common/inet/tcp/tcp_input.c +++ b/usr/src/uts/common/inet/tcp/tcp_input.c @@ -20,8 +20,7 @@ */ /* - * Copyright 2010 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. */ /* This file contains all TCP input processing functions. */ @@ -300,7 +299,6 @@ tcp_parse_options(tcpha_t *tcpha, tcp_opt_t *tcpopt) * If the list is empty, allocate one and assume * nothing is sack'ed. */ - ASSERT(tcp->tcp_sack_info != NULL); if (tcp->tcp_notsack_list == NULL) { tcp_notsack_update(&(tcp->tcp_notsack_list), tcp->tcp_suna, tcp->tcp_snxt, @@ -477,23 +475,16 @@ tcp_process_options(tcp_t *tcp, tcpha_t *tcpha) if ((options & TCP_OPT_SACK_OK_PRESENT) && (tcp->tcp_snd_sack_ok || (tcps->tcps_sack_permitted != 0 && TCP_IS_DETACHED(tcp)))) { - /* This should be true only in the passive case. */ - if (tcp->tcp_sack_info == NULL) { - ASSERT(TCP_IS_DETACHED(tcp)); - tcp->tcp_sack_info = - kmem_cache_alloc(tcp_sack_info_cache, KM_NOSLEEP); - } - if (tcp->tcp_sack_info == NULL) { - tcp->tcp_snd_sack_ok = B_FALSE; + ASSERT(tcp->tcp_num_sack_blk == 0); + ASSERT(tcp->tcp_notsack_list == NULL); + + tcp->tcp_snd_sack_ok = B_TRUE; + if (tcp->tcp_snd_ts_ok) { + tcp->tcp_max_sack_blk = 3; } else { - tcp->tcp_snd_sack_ok = B_TRUE; - if (tcp->tcp_snd_ts_ok) { - tcp->tcp_max_sack_blk = 3; - } else { - tcp->tcp_max_sack_blk = 4; - } + tcp->tcp_max_sack_blk = 4; } - } else { + } else if (tcp->tcp_snd_sack_ok) { /* * Resetting tcp_snd_sack_ok to B_FALSE so that * no SACK info will be used for this @@ -501,12 +492,8 @@ tcp_process_options(tcp_t *tcp, tcpha_t *tcpha) * permission is negotiated. This may need * to be changed once this is clarified. */ - if (tcp->tcp_sack_info != NULL) { - ASSERT(tcp->tcp_notsack_list == NULL); - kmem_cache_free(tcp_sack_info_cache, - tcp->tcp_sack_info); - tcp->tcp_sack_info = NULL; - } + ASSERT(tcp->tcp_num_sack_blk == 0); + ASSERT(tcp->tcp_notsack_list == NULL); tcp->tcp_snd_sack_ok = B_FALSE; } @@ -761,10 +748,8 @@ tcp_paws_check(tcp_t *tcp, tcpha_t *tcpha, tcp_opt_t *tcpoptp) * transfer rate built up so far. */ tcp_mss_set(tcp, tcp->tcp_mss + TCPOPT_REAL_TS_LEN); - if (tcp->tcp_snd_sack_ok) { - ASSERT(tcp->tcp_sack_info != NULL); + if (tcp->tcp_snd_sack_ok) tcp->tcp_max_sack_blk = 4; - } } return (B_TRUE); } @@ -2823,7 +2808,6 @@ tcp_input_data(void *arg, mblk_t *mp, void *arg2, ip_recv_attr_t *ira) goto ack_check; } } else if (tcp->tcp_snd_sack_ok) { - ASSERT(tcp->tcp_sack_info != NULL); tcpopt.tcp = tcp; /* * SACK info in already updated in tcp_parse_options. Ignore @@ -3151,7 +3135,6 @@ ok:; if (seg_len > 0) { /* Fill in the SACK blk list. */ if (tcp->tcp_snd_sack_ok) { - ASSERT(tcp->tcp_sack_info != NULL); tcp_sack_insert(tcp->tcp_sack_list, seg_seq, seg_seq + seg_len, &(tcp->tcp_num_sack_blk)); @@ -3191,8 +3174,7 @@ ok:; if (tcp->tcp_reass_head != NULL) { tcp->tcp_reass_tid = TCP_TIMER( tcp, tcp_reass_timer, - MSEC_TO_TICK( - tcps->tcps_reass_timeout)); + tcps->tcps_reass_timeout); } else { tcp->tcp_reass_tid = 0; } @@ -3214,8 +3196,8 @@ ok:; if (tcps->tcps_reass_timeout != 0 && tcp->tcp_reass_tid == 0) { tcp->tcp_reass_tid = TCP_TIMER(tcp, - tcp_reass_timer, MSEC_TO_TICK( - tcps->tcps_reass_timeout)); + tcp_reass_timer, + tcps->tcps_reass_timeout); } } } @@ -3870,7 +3852,6 @@ process_ack: * Congestion Control" in SIGCOMM '96. */ if (tcp->tcp_snd_sack_ok) { - ASSERT(tcp->tcp_sack_info != NULL); if (tcp->tcp_notsack_list != NULL) { tcp->tcp_pipe = tcp->tcp_snxt - tcp->tcp_fack; @@ -4062,8 +4043,7 @@ process_ack: * Remove all notsack info to avoid confusion with * the next fast retrasnmit/recovery phase. */ - if (tcp->tcp_snd_sack_ok && - tcp->tcp_notsack_list != NULL) { + if (tcp->tcp_snd_sack_ok) { TCP_NOTSACK_REMOVE_ALL(tcp->tcp_notsack_list, tcp); } @@ -4679,8 +4659,7 @@ update_ack: if (!TCP_IS_DETACHED(tcp)) tcp->tcp_push_tid = TCP_TIMER(tcp, tcp_push_timer, - MSEC_TO_TICK( - tcps->tcps_push_timer_interval)); + tcps->tcps_push_timer_interval); } } @@ -4803,9 +4782,9 @@ ack_check: */ if (tcp->tcp_ack_tid == 0) { tcp->tcp_ack_tid = TCP_TIMER(tcp, tcp_ack_timer, - MSEC_TO_TICK(tcp->tcp_localnet ? - (clock_t)tcps->tcps_local_dack_interval : - (clock_t)tcps->tcps_deferred_ack_interval)); + tcp->tcp_localnet ? + tcps->tcps_local_dack_interval : + tcps->tcps_deferred_ack_interval); } } if (flags & TH_ORDREL_NEEDED) { diff --git a/usr/src/uts/common/inet/tcp/tcp_opt_data.c b/usr/src/uts/common/inet/tcp/tcp_opt_data.c index b85cf30ff4..0f46bf4a08 100644 --- a/usr/src/uts/common/inet/tcp/tcp_opt_data.c +++ b/usr/src/uts/common/inet/tcp/tcp_opt_data.c @@ -19,8 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2010 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. */ #include <sys/types.h> @@ -548,8 +547,7 @@ tcp_opt_set(conn_t *connp, uint_t optset_context, int level, int name, /* Crank up the keepalive timer */ tcp->tcp_ka_last_intrvl = 0; tcp->tcp_ka_tid = TCP_TIMER(tcp, - tcp_keepalive_timer, - MSEC_TO_TICK(tcp->tcp_ka_interval)); + tcp_keepalive_timer, tcp->tcp_ka_interval); connp->conn_keepalive = 1; } break; @@ -689,7 +687,7 @@ tcp_opt_set(conn_t *connp, uint_t optset_context, int level, int name, 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); } } break; diff --git a/usr/src/uts/common/inet/tcp/tcp_output.c b/usr/src/uts/common/inet/tcp/tcp_output.c index 2a02d214f5..aee8d71a90 100644 --- a/usr/src/uts/common/inet/tcp/tcp_output.c +++ b/usr/src/uts/common/inet/tcp/tcp_output.c @@ -20,8 +20,7 @@ */ /* - * Copyright 2010 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. */ /* This file contains all TCP output processing functions. */ @@ -1546,9 +1545,10 @@ tcp_close_output(void *arg, mblk_t *mp, void *arg2, ip_recv_attr_t *dummy) ASSERT(tcp->tcp_linger_tid == 0); + /* conn_lingertime is in sec. */ tcp->tcp_linger_tid = TCP_TIMER(tcp, tcp_close_linger_timeout, - connp->conn_lingertime * hz); + connp->conn_lingertime * MILLISEC); /* tcp_close_linger_timeout will finish close */ if (tcp->tcp_linger_tid == 0) @@ -3171,7 +3171,6 @@ tcp_sack_rexmit(tcp_t *tcp, uint_t *flags) mblk_t *xmit_mp; tcp_stack_t *tcps = tcp->tcp_tcps; - ASSERT(tcp->tcp_sack_info != NULL); ASSERT(tcp->tcp_notsack_list != NULL); ASSERT(tcp->tcp_rexmit == B_FALSE); @@ -3485,10 +3484,7 @@ tcp_process_shrunk_swnd(tcp_t *tcp, uint32_t shrunk_count) * If the SACK option is set, delete the entire list of * notsack'ed blocks. */ - if (tcp->tcp_sack_info != NULL) { - if (tcp->tcp_notsack_list != NULL) - TCP_NOTSACK_REMOVE_ALL(tcp->tcp_notsack_list, tcp); - } + TCP_NOTSACK_REMOVE_ALL(tcp->tcp_notsack_list, tcp); if (tcp->tcp_suna == tcp->tcp_snxt && tcp->tcp_swnd == 0) /* diff --git a/usr/src/uts/common/inet/tcp/tcp_sack.c b/usr/src/uts/common/inet/tcp/tcp_sack.c index f3e9f81859..c4f7822e85 100644 --- a/usr/src/uts/common/inet/tcp/tcp_sack.c +++ b/usr/src/uts/common/inet/tcp/tcp_sack.c @@ -2,9 +2,8 @@ * CDDL HEADER START * * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. @@ -20,12 +19,9 @@ * CDDL HEADER END */ /* - * Copyright 1997-2001, 2003 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. + * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. */ -#pragma ident "%Z%%M% %I% %E% SMI" - #include <sys/types.h> #include <sys/kmem.h> #include <sys/debug.h> @@ -38,6 +34,9 @@ #include <inet/ip.h> #include <inet/tcp.h> +/* kmem cache for notsack_blk_t */ +kmem_cache_t *tcp_notsack_blk_cache; + /* * To insert a new blk to the array of SACK blk in receiver. * @@ -239,7 +238,7 @@ tcp_notsack_insert(notsack_blk_t **head, tcp_seq begin, tcp_seq end, } (*num)--; *sum -= tmp->end - tmp->begin; - kmem_free(tmp, sizeof (notsack_blk_t)); + kmem_cache_free(tcp_notsack_blk_cache, tmp); return; } /* This blk is partially covered. */ @@ -254,8 +253,9 @@ tcp_notsack_insert(notsack_blk_t **head, tcp_seq begin, tcp_seq end, (tmp->sack_cnt)++; } else { /* Split the notsack blk. */ - if ((new = kmem_alloc(sizeof (notsack_blk_t), - KM_NOSLEEP)) == NULL) { + if ((new = kmem_cache_alloc( + tcp_notsack_blk_cache, KM_NOSLEEP)) == + NULL) { return; } new->end = tmp->end; @@ -297,11 +297,13 @@ tcp_notsack_insert(notsack_blk_t **head, tcp_seq begin, tcp_seq end, tmp_sum -= tmp->end - tmp->begin; if (prev != NULL) { prev->next = tmp->next; - kmem_free(tmp, sizeof (notsack_blk_t)); + kmem_cache_free(tcp_notsack_blk_cache, + tmp); tmp = prev->next; } else { *head = tmp->next; - kmem_free(tmp, sizeof (notsack_blk_t)); + kmem_cache_free(tcp_notsack_blk_cache, + tmp); tmp = *head; } } else { @@ -355,11 +357,11 @@ tcp_notsack_remove(notsack_blk_t **head, tcp_seq end, int32_t *num, tmp_sum -= tmp->end - tmp->begin; if (prev == NULL) { *head = tmp->next; - kmem_free(tmp, sizeof (notsack_blk_t)); + kmem_cache_free(tcp_notsack_blk_cache, tmp); tmp = *head; } else { prev->next = tmp->next; - kmem_free(tmp, sizeof (notsack_blk_t)); + kmem_cache_free(tcp_notsack_blk_cache, tmp); tmp = prev->next; } } else { @@ -394,8 +396,8 @@ void tcp_notsack_update(notsack_blk_t **head, tcp_seq begin, tcp_seq end, tmp = *head; /* If the list is empty, create a new one. */ if (tmp == NULL) { - if ((tmp = kmem_alloc(sizeof (notsack_blk_t), KM_NOSLEEP)) == - NULL) { + if ((tmp = kmem_cache_alloc(tcp_notsack_blk_cache, + KM_NOSLEEP)) == NULL) { return; } tmp->begin = begin; @@ -423,7 +425,7 @@ void tcp_notsack_update(notsack_blk_t **head, tcp_seq begin, tcp_seq end, tmp->end = end; } else { /* No. Need to create a new notsack blk. */ - tmp->next = kmem_alloc(sizeof (notsack_blk_t), KM_NOSLEEP); + tmp->next = kmem_cache_alloc(tcp_notsack_blk_cache, KM_NOSLEEP); if (tmp->next != NULL) { tmp = tmp->next; tmp->begin = begin; diff --git a/usr/src/uts/common/inet/tcp/tcp_time_wait.c b/usr/src/uts/common/inet/tcp/tcp_time_wait.c index be241bd6cf..4cfe13bb30 100644 --- a/usr/src/uts/common/inet/tcp/tcp_time_wait.c +++ b/usr/src/uts/common/inet/tcp/tcp_time_wait.c @@ -20,8 +20,7 @@ */ /* - * Copyright 2010 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. */ /* @@ -119,9 +118,9 @@ void tcp_time_wait_append(tcp_t *tcp) { tcp_stack_t *tcps = tcp->tcp_tcps; + squeue_t *sqp = tcp->tcp_connp->conn_sqp; tcp_squeue_priv_t *tcp_time_wait = - *((tcp_squeue_priv_t **)squeue_getprivate(tcp->tcp_connp->conn_sqp, - SQPRIVATE_TCP)); + *((tcp_squeue_priv_t **)squeue_getprivate(sqp, SQPRIVATE_TCP)); tcp_timers_stop(tcp); @@ -134,23 +133,17 @@ tcp_time_wait_append(tcp_t *tcp) ASSERT(tcp->tcp_flow_stopped == 0); ASSERT(tcp->tcp_time_wait_next == NULL); ASSERT(tcp->tcp_time_wait_prev == NULL); - ASSERT(tcp->tcp_time_wait_expire == NULL); + ASSERT(tcp->tcp_time_wait_expire == 0); ASSERT(tcp->tcp_listener == NULL); - tcp->tcp_time_wait_expire = ddi_get_lbolt(); + tcp->tcp_time_wait_expire = ddi_get_lbolt64(); /* - * The value computed below in tcp->tcp_time_wait_expire may - * appear negative or wrap around. That is ok since our - * interest is only in the difference between the current lbolt - * value and tcp->tcp_time_wait_expire. But the value should not - * be zero, since it means the tcp is not in the TIME_WAIT list. - * The corresponding comparison in tcp_time_wait_collector() uses - * modular arithmetic. + * Since tcp_time_wait_expire is lbolt64, it should not wrap around + * in practice. Hence it cannot be 0. Note that zero means that the + * tcp_t is not in the TIME_WAIT list. */ tcp->tcp_time_wait_expire += MSEC_TO_TICK( tcps->tcps_time_wait_interval); - if (tcp->tcp_time_wait_expire == 0) - tcp->tcp_time_wait_expire = 1; ASSERT(TCP_IS_DETACHED(tcp)); ASSERT(tcp->tcp_state == TCPS_TIME_WAIT); @@ -162,12 +155,30 @@ tcp_time_wait_append(tcp_t *tcp) if (tcp_time_wait->tcp_time_wait_head == NULL) { ASSERT(tcp_time_wait->tcp_time_wait_tail == NULL); tcp_time_wait->tcp_time_wait_head = tcp; + + /* + * Even if the list was empty before, there may be a timer + * running since a tcp_t can be removed from the list + * in other places, such as tcp_clean_death(). So check if + * a timer is needed. + */ + if (tcp_time_wait->tcp_time_wait_tid == 0) { + tcp_time_wait->tcp_time_wait_tid = + timeout_generic(CALLOUT_NORMAL, + tcp_time_wait_collector, sqp, + (hrtime_t)(tcps->tcps_time_wait_interval + 1) * + MICROSEC, CALLOUT_TCP_RESOLUTION, + CALLOUT_FLAG_ROUNDUP); + } } else { ASSERT(tcp_time_wait->tcp_time_wait_tail != NULL); ASSERT(tcp_time_wait->tcp_time_wait_tail->tcp_state == TCPS_TIME_WAIT); tcp_time_wait->tcp_time_wait_tail->tcp_time_wait_next = tcp; tcp->tcp_time_wait_prev = tcp_time_wait->tcp_time_wait_tail; + + /* The list is not empty, so a timer must be running. */ + ASSERT(tcp_time_wait->tcp_time_wait_tid != 0); } tcp_time_wait->tcp_time_wait_tail = tcp; mutex_exit(&tcp_time_wait->tcp_time_wait_lock); @@ -216,7 +227,7 @@ void tcp_time_wait_collector(void *arg) { tcp_t *tcp; - clock_t now; + int64_t now; mblk_t *mp; conn_t *connp; kmutex_t *lock; @@ -247,17 +258,16 @@ tcp_time_wait_collector(void *arg) /* * In order to reap time waits reliably, we should use a * source of time that is not adjustable by the user -- hence - * the call to ddi_get_lbolt(). + * the call to ddi_get_lbolt64(). */ - now = ddi_get_lbolt(); + now = ddi_get_lbolt64(); while ((tcp = tcp_time_wait->tcp_time_wait_head) != NULL) { /* - * Compare times using modular arithmetic, since - * lbolt can wrapover. + * lbolt64 should not wrap around in practice... So we can + * do a direct comparison. */ - if ((now - tcp->tcp_time_wait_expire) < 0) { + if (now < tcp->tcp_time_wait_expire) break; - } removed = tcp_time_wait_remove(tcp, tcp_time_wait); ASSERT(removed); @@ -389,10 +399,22 @@ tcp_time_wait_collector(void *arg) if (tcp_time_wait->tcp_free_list != NULL) tcp_time_wait->tcp_free_list->tcp_in_free_list = B_TRUE; - tcp_time_wait->tcp_time_wait_tid = - timeout_generic(CALLOUT_NORMAL, tcp_time_wait_collector, sqp, - TCP_TIME_WAIT_DELAY, CALLOUT_TCP_RESOLUTION, - CALLOUT_FLAG_ROUNDUP); + /* + * If the time wait list is not empty and there is no timer running, + * restart it. + */ + if ((tcp = tcp_time_wait->tcp_time_wait_head) != NULL && + tcp_time_wait->tcp_time_wait_tid == 0) { + hrtime_t firetime; + + firetime = TICK_TO_NSEC(tcp->tcp_time_wait_expire - now); + /* This ensures that we won't wake up too often. */ + firetime = MAX(TCP_TIME_WAIT_DELAY, firetime); + tcp_time_wait->tcp_time_wait_tid = + timeout_generic(CALLOUT_NORMAL, tcp_time_wait_collector, + sqp, firetime, CALLOUT_TCP_RESOLUTION, + CALLOUT_FLAG_ROUNDUP); + } mutex_exit(&tcp_time_wait->tcp_time_wait_lock); } diff --git a/usr/src/uts/common/inet/tcp/tcp_timers.c b/usr/src/uts/common/inet/tcp/tcp_timers.c index 5c87620fca..f2eaa3a958 100644 --- a/usr/src/uts/common/inet/tcp/tcp_timers.c +++ b/usr/src/uts/common/inet/tcp/tcp_timers.c @@ -20,8 +20,7 @@ */ /* - * Copyright 2010 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. */ #include <sys/types.h> @@ -135,8 +134,11 @@ static void tcp_timer_callback(void *); static void tcp_timer_free(tcp_t *, mblk_t *); static void tcp_timer_handler(void *, mblk_t *, void *, ip_recv_attr_t *); +/* + * tim is in millisec. + */ timeout_id_t -tcp_timeout(conn_t *connp, void (*f)(void *), clock_t tim) +tcp_timeout(conn_t *connp, void (*f)(void *), hrtime_t tim) { mblk_t *mp; tcp_timer_t *tcpt; @@ -169,7 +171,7 @@ tcp_timeout(conn_t *connp, void (*f)(void *), clock_t tim) * early before they have a chance to be cancelled. */ tcpt->tcpt_tid = timeout_generic(CALLOUT_NORMAL, tcp_timer_callback, mp, - TICK_TO_NSEC(tim), CALLOUT_TCP_RESOLUTION, CALLOUT_FLAG_ROUNDUP); + tim * MICROSEC, CALLOUT_TCP_RESOLUTION, CALLOUT_FLAG_ROUNDUP); return ((timeout_id_t)mp); } @@ -242,7 +244,7 @@ tcp_timeout_cancel(conn_t *connp, timeout_id_t id) CONN_DEC_REF(connp); } - return (delta); + return (TICK_TO_MSEC(delta)); } /* @@ -418,7 +420,7 @@ tcp_keepalive_timer(void *arg) /* Timer fired too early, restart it. */ if (tcp->tcp_state < TCPS_ESTABLISHED) { tcp->tcp_ka_tid = TCP_TIMER(tcp, tcp_keepalive_timer, - MSEC_TO_TICK(ka_intrvl)); + ka_intrvl); return; } @@ -469,8 +471,7 @@ tcp_keepalive_timer(void *arg) firetime = tcp->tcp_rto; } tcp->tcp_ka_tid = TCP_TIMER(tcp, - tcp_keepalive_timer, - MSEC_TO_TICK(firetime)); + tcp_keepalive_timer, firetime); tcp->tcp_ka_last_intrvl = firetime; return; } @@ -483,8 +484,7 @@ tcp_keepalive_timer(void *arg) if ((firetime = ka_intrvl - idletime) < 0) { firetime = ka_intrvl; } - tcp->tcp_ka_tid = TCP_TIMER(tcp, tcp_keepalive_timer, - MSEC_TO_TICK(firetime)); + tcp->tcp_ka_tid = TCP_TIMER(tcp, tcp_keepalive_timer, firetime); } void @@ -1018,7 +1018,7 @@ tcp_timer(void *arg) /* * Remove all rexmit SACK blk to start from fresh. */ - if (tcp->tcp_snd_sack_ok && tcp->tcp_notsack_list != NULL) + if (tcp->tcp_snd_sack_ok) TCP_NOTSACK_REMOVE_ALL(tcp->tcp_notsack_list, tcp); if (mp == NULL) { return; diff --git a/usr/src/uts/common/inet/tcp_impl.h b/usr/src/uts/common/inet/tcp_impl.h index a7d27350b3..f2f70777e7 100644 --- a/usr/src/uts/common/inet/tcp_impl.h +++ b/usr/src/uts/common/inet/tcp_impl.h @@ -19,8 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2010 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. + * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. */ #ifndef _INET_TCP_IMPL_H @@ -103,7 +102,7 @@ extern kmem_cache_t *tcp_timercache; /* * Macro for starting various timers. Retransmission timer has its own macro, - * TCP_TIMER_RESTART(). + * TCP_TIMER_RESTART(). tim is in millisec. */ #define TCP_TIMER(tcp, f, tim) \ tcp_timeout(tcp->tcp_connp, f, tim) @@ -111,13 +110,12 @@ extern kmem_cache_t *tcp_timercache; tcp_timeout_cancel(tcp->tcp_connp, id) /* - * To restart the TCP retransmission timer. + * To restart the TCP retransmission timer. intvl is in millisec. */ #define TCP_TIMER_RESTART(tcp, intvl) { \ if ((tcp)->tcp_timer_tid != 0) \ (void) TCP_TIMER_CANCEL((tcp), (tcp)->tcp_timer_tid); \ - (tcp)->tcp_timer_tid = TCP_TIMER((tcp), tcp_timer, \ - MSEC_TO_TICK(intvl)); \ + (tcp)->tcp_timer_tid = TCP_TIMER((tcp), tcp_timer, (intvl)); \ } /* @@ -615,7 +613,7 @@ extern void tcp_push_timer(void *); extern void tcp_reass_timer(void *); extern mblk_t *tcp_timermp_alloc(int); extern void tcp_timermp_free(tcp_t *); -extern timeout_id_t tcp_timeout(conn_t *, void (*)(void *), clock_t); +extern timeout_id_t tcp_timeout(conn_t *, void (*)(void *), hrtime_t); extern clock_t tcp_timeout_cancel(conn_t *, timeout_id_t); extern void tcp_timer(void *arg); extern void tcp_timers_stop(tcp_t *); diff --git a/usr/src/uts/common/inet/tcp_sack.h b/usr/src/uts/common/inet/tcp_sack.h index 7bd9939f67..5a4e9e4fa0 100644 --- a/usr/src/uts/common/inet/tcp_sack.h +++ b/usr/src/uts/common/inet/tcp_sack.h @@ -19,8 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2009 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. + * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. */ #ifndef _INET_TCP_SACK_H @@ -78,6 +77,8 @@ extern void tcp_notsack_remove(notsack_blk_t **, tcp_seq, int32_t *, extern void tcp_notsack_update(notsack_blk_t **, tcp_seq, tcp_seq, int32_t *, uint32_t *); +/* Defined in tcp_sack.c */ +extern kmem_cache_t *tcp_notsack_blk_cache; /* * Macro to remove all the notsack'ed blks in sender. @@ -85,21 +86,25 @@ extern void tcp_notsack_update(notsack_blk_t **, tcp_seq, tcp_seq, * Param: * notsack_blk_t *head: pointer to the head of the list of notsack'ed blks. */ -#define TCP_NOTSACK_REMOVE_ALL(head, tcp) \ -{ \ - notsack_blk_t *prev, *tmp; \ - tmp = (head); \ - do { \ - prev = tmp; \ - tmp = tmp->next; \ - kmem_free(prev, sizeof (notsack_blk_t)); \ - } while (tmp != NULL); \ - (head) = NULL; \ - (tcp)->tcp_cnt_notsack_list = 0; \ - (tcp)->tcp_num_notsack_blk = 0; \ +#define TCP_NOTSACK_REMOVE_ALL(head, tcp) \ +{ \ + if ((head) != NULL) { \ + notsack_blk_t *prev, *tmp; \ + tmp = (head); \ + do { \ + prev = tmp; \ + tmp = tmp->next; \ + kmem_cache_free(tcp_notsack_blk_cache, prev); \ + } while (tmp != NULL); \ + (head) = NULL; \ + (tcp)->tcp_cnt_notsack_list = 0; \ + (tcp)->tcp_num_notsack_blk = 0; \ + } else { \ + ASSERT((tcp)->tcp_cnt_notsack_list == 0); \ + ASSERT((tcp)->tcp_num_notsack_blk == 0); \ + } \ } - #ifdef __cplusplus } #endif diff --git a/usr/src/uts/intel/ip/ip.global-objs.debug64 b/usr/src/uts/intel/ip/ip.global-objs.debug64 index acaa8bfec6..421c8c0a3b 100644 --- a/usr/src/uts/intel/ip/ip.global-objs.debug64 +++ b/usr/src/uts/intel/ip/ip.global-objs.debug64 @@ -19,8 +19,7 @@ # CDDL HEADER END # # -# Copyright 2010 Sun Microsystems, Inc. All rights reserved. -# Use is subject to license terms. +# Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. # arp_m_tbl @@ -262,6 +261,7 @@ tcp_init_wnd_shft tcp_max_init_cwnd tcp_max_optsize tcp_min_conn_listener +tcp_notsack_blk_cache tcp_opt_arr tcp_opt_obj tcp_outbound_squeue_switch @@ -277,7 +277,6 @@ tcp_randtbl tcp_rinfo tcp_rinitv4 tcp_rinitv6 -tcp_sack_info_cache tcp_sock_winit tcp_squeue_flag tcp_squeue_wput diff --git a/usr/src/uts/intel/ip/ip.global-objs.obj64 b/usr/src/uts/intel/ip/ip.global-objs.obj64 index 8f1eaf800e..85d2777def 100644 --- a/usr/src/uts/intel/ip/ip.global-objs.obj64 +++ b/usr/src/uts/intel/ip/ip.global-objs.obj64 @@ -19,8 +19,7 @@ # CDDL HEADER END # # -# Copyright 2010 Sun Microsystems, Inc. All rights reserved. -# Use is subject to license terms. +# Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. # arp_m_tbl @@ -259,6 +258,7 @@ tcp_init_wnd_shft tcp_max_init_cwnd tcp_max_optsize tcp_min_conn_listener +tcp_notsack_blk_cache tcp_opt_arr tcp_opt_obj tcp_outbound_squeue_switch @@ -274,7 +274,6 @@ tcp_randtbl tcp_rinfo tcp_rinitv4 tcp_rinitv6 -tcp_sack_info_cache tcp_sock_winit tcp_squeue_flag tcp_squeue_wput diff --git a/usr/src/uts/sparc/ip/ip.global-objs.debug64 b/usr/src/uts/sparc/ip/ip.global-objs.debug64 index acaa8bfec6..421c8c0a3b 100644 --- a/usr/src/uts/sparc/ip/ip.global-objs.debug64 +++ b/usr/src/uts/sparc/ip/ip.global-objs.debug64 @@ -19,8 +19,7 @@ # CDDL HEADER END # # -# Copyright 2010 Sun Microsystems, Inc. All rights reserved. -# Use is subject to license terms. +# Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. # arp_m_tbl @@ -262,6 +261,7 @@ tcp_init_wnd_shft tcp_max_init_cwnd tcp_max_optsize tcp_min_conn_listener +tcp_notsack_blk_cache tcp_opt_arr tcp_opt_obj tcp_outbound_squeue_switch @@ -277,7 +277,6 @@ tcp_randtbl tcp_rinfo tcp_rinitv4 tcp_rinitv6 -tcp_sack_info_cache tcp_sock_winit tcp_squeue_flag tcp_squeue_wput diff --git a/usr/src/uts/sparc/ip/ip.global-objs.obj64 b/usr/src/uts/sparc/ip/ip.global-objs.obj64 index 8f1eaf800e..85d2777def 100644 --- a/usr/src/uts/sparc/ip/ip.global-objs.obj64 +++ b/usr/src/uts/sparc/ip/ip.global-objs.obj64 @@ -19,8 +19,7 @@ # CDDL HEADER END # # -# Copyright 2010 Sun Microsystems, Inc. All rights reserved. -# Use is subject to license terms. +# Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. # arp_m_tbl @@ -259,6 +258,7 @@ tcp_init_wnd_shft tcp_max_init_cwnd tcp_max_optsize tcp_min_conn_listener +tcp_notsack_blk_cache tcp_opt_arr tcp_opt_obj tcp_outbound_squeue_switch @@ -274,7 +274,6 @@ tcp_randtbl tcp_rinfo tcp_rinitv4 tcp_rinitv6 -tcp_sack_info_cache tcp_sock_winit tcp_squeue_flag tcp_squeue_wput |