Hey Gang: I just re-subscribed to netdev.... Earlier today I brought up something I don't understand with some of the heavy weights but still don't feel I understand what's happening. It could be a kgdb cache flushing problem or some magic/land-mines in the kernel that I'm not familiar with.
We are running a modified 2.6.12 kernel, yea I know that's old -- we are working on that. In the past I've expected the timer list to "look empty" when the sock structure is released; that is when the refcnt drops to zero. Shouldn't the tcp timers have LIST_POISON1 and LIST_POISON2 in their list heads when we drop the last reference to a sk? We noticed our tcp timers have unexpected values in them and wondering how to explain it. Attached is a copy of a tcp_sock just prior to our freeing it; as see by kgdb on our 2.6.12 with tcp modified to support being a proxy. The structure members without sk_ prefixed to it are additional info that we have added to implement a TCP proxy. sk->sk_timer looks as expected with LIST_POISON in both list head pointers. The retransmit_timer on the other hand appears to have valid pointers in it, so I'm wondering if we have a timer reference count problem. The tcp_sock is zero'd out on allocation, so I doubt it's just stale pointers from a previous incarnation of a tcp_sock. The delack_timer also has absurd values in it. I'll add some debug code to try to understand this; if any of you have some thought on this, it might save me some time trying to understanding it. -piet -- Piet Delaney BlueLane Teck W: (408) 200-5256; [EMAIL PROTECTED] H: (408) 243-8872; [EMAIL PROTECTED]
(gdb) print *second_saved_tcp_sk $4 = { inet = { sk = { __sk_common = { skc_family = 2, skc_state = 7 '\a', skc_reuse = 0 '\0', skc_bound_dev_if = 0, skc_node = { next = 0x0, pprev = 0x0 }, skc_bind_node = { next = 0x0, pprev = 0x0 }, skc_refcnt = { counter = 1 } }, sk_shutdown = 3 '\003', sk_no_check = 0 '\0', sk_userlocks = 0 '\0', sk_protocol = 6 '\006', sk_type = 1, sk_rcvbuf = 87380, sk_lock = { slock = { slock = 1, magic = 3735899821 }, owner = 0x0, wq = { lock = { slock = 1, magic = 3735899821 }, task_list = { next = 0xe779054c, prev = 0xe779054c } } }, sk_sleep = 0x0, sk_dst_cache = 0x0, sk_policy = {0x0, 0x0}, sk_dst_lock = { lock = 16777216, magic = 3736018669 }, sk_rmem_alloc = { counter = 0 }, sk_wmem_alloc = { counter = 0 }, sk_omem_alloc = { counter = 0 }, sk_receive_queue = { next = 0xe7790578, prev = 0xe7790578, qlen = 0, lock = { slock = 1, magic = 3735899821 } }, sk_write_queue = { next = 0xe779058c, prev = 0xe779058c, qlen = 0, lock = { slock = 1, magic = 3735899821 } }, sk_wmem_queued = 0, sk_forward_alloc = 0, sk_allocation = 208, sk_sndbuf = 16384, sk_route_caps = 7081, sk_hashent = 260506, sk_flags = 49929, sk_lingertime = 0, sk_backlog = { head = 0x0, tail = 0x0 }, sk_error_queue = { next = 0xe77905c8, prev = 0xe77905c8, qlen = 0, lock = { slock = 1, magic = 3735899821 } }, sk_prot = 0xc06befe0, sk_prot_creator = 0xc06befe0, sk_callback_lock = { lock = 16777216, magic = 3736018669 }, sk_err = 104, sk_err_soft = 0, sk_ack_backlog = 0, sk_max_ack_backlog = 8192, sk_priority = 0, sk_peercred = { pid = 0, uid = 4294967295, gid = 4294967295 }, sk_rcvlowat = 1, sk_rcvtimeo = 2147483647, sk_sndtimeo = 2147483647, sk_filter = 0x0, sk_protinfo = 0x0, sk_timer = { entry = { next = 0x100100, prev = 0x200200 }, expires = 7723632, lock = { slock = 1, magic = 3735899821 }, magic = 1267182958, function = 0xc045e090 <tcp_keepalive_timer>, data = 3883468052, base = 0x0 }, sk_stamp = { tv_sec = -1, tv_usec = -1 }, sk_socket = 0x0, sk_user_data = 0x0, sk_sndmsg_page = 0x0, sk_send_head = 0x0, sk_sndmsg_off = 0, sk_write_pending = 0, sk_security = 0x0, sk_state_change = 0xc03b5c05 <sock_def_wakeup>, sk_data_ready = 0xc03b5d1e <sock_def_readable>, sk_write_space = 0xc03c4db5 <sk_stream_write_space>, sk_error_report = 0xc03b5c84 <sock_def_error_report>, sk_backlog_rcv = 0xc0466cca <tcp_v4_do_rcv>, sk_destruct = 0xc049857e <inet_sock_destruct>, peer_sock = 0xe7790a04, socket_type = 2, peer_sk_state = 7 '\a', flag_tcp_done = 1 '\001', flag_tcp_destroy = 1 '\001', flag_write_queue_purge = 1 '\001', flag_new_server_ack = 0 '\0', do_rst_processing = 0 '\0', do_srv_finack_processing = 0 '\0', rst_processing_done = 1 '\001', flag_tw_present = 0 '\0', default_ttl = 64 '@', tcp_close_processing_index = 0, conndev = 0xc25ff000, ha = "\000\023Fdè3", '\0' <repeats 25 times>, l2type = 0 '\0', l2addlen = 0 '\0', l2header = '\0' <repeats 31 times>, vproxy_wmem_queued_data_size = 0, vproxy_max_ubytes = 128000, sk_umem_alloc = 0, sk_ubytes_alloc = 0, num_backlogged_packet = 0, ready_list = { next = 0xe77906ec, prev = 0xe77906ec }, user_zbuf_queue = { next = 0xe77906f4, prev = 0xe77906f4 }, vproxy_id = 0, listener_id = 0, socket_fd = -1, thrd_id = 0, proper_close_flag = 0 '\0', accepted_flag = 0 '\0', close_sent_flag = 0 '\0', close_with_reset = 0 '\0', synq_high_water_mark = 1, acceptq_high_water_mark = 1, backlog_accept_queue = 0x0, backlog_accept_queue_tail = 0x0, sk_backlog_acceptq_len = 0, backlog_acceptq_high_water_mark = 0, peer_clock = 4053694621, default_protocol = 2048, dproxy_port = 0, sa_session_id = 7, recv_tstamp = 0 }, daddr = 0, rcv_saddr = 0, dport = 0, num = 0, saddr = 3885070188, uc_ttl = 31132, cmsg_flags = 59281, opt = 0xe791776c, sport = 31132, id = 59281, tos = 2 '\002', mc_ttl = 0 '\0', pmtudisc = 8 '\b', recverr = 0, freebind = 0, hdrincl = 0, mc_loop = 0, mc_index = 0, mc_addr = 0, mc_list = 0xc2b449a8, cork = { flags = 0, fragsize = 0, opt = 0x7, rt = 0x10603, length = 133792, addr = 1, fl = { oif = -559067475, iif = 0, nl_u = { ip4_u = { daddr = 1, saddr = 3735899821, fwmark = 3883469372, tos = 60 '<', scope = 10 '\n' }, ip6_u = { daddr = { in6_u = { u6_addr8 = "\001\000\000\000NÞ<\nyç<\nyç", u6_addr16 = {1, 0, 20141, 57005, 2620, 59257, 2620, 59257}, u6_addr32 = {1, 3735899821, 3883469372, 3883469372} } }, saddr = { in6_u = { u6_addr8 = '\0' <repeats 15 times>, u6_addr16 = {0, 0, 0, 0, 0, 0, 0, 0}, u6_addr32 = {0, 0, 0, 0} } }, flowlabel = 16777216 }, dn_u = { daddr = 1, saddr = 0, fwmark = 3735899821, scope = 60 '<' } }, proto = 237 'í', flags = 30 '\036', uli_u = { ports = { sport = 0, dport = 0 }, icmpt = { type = 0 '\0', code = 0 '\0' }, dnports = { sport = 0, dport = 0, objnum = 0 '\0', objnamel = 0 '\0', objname = "\000\000\000\000\000\000h\nyçh\nyç\000" }, spi = 0 } } } }, tcp_header_len = 1, pred_flags = 3735899821, rcv_nxt = 3883469436, snd_nxt = 3883469436, snd_una = 0, snd_sml = 1, rcv_tstamp = 3735899821, lsndtime = 0, bind_hash = 0x0, ack = { pending = 208 'Ð', quick = 0 '\0', pingpong = 0 '\0', blocked = 0 '\0', ato = 16384, timeout = 7081, lrcvtime = 214170, last_seg_size = 33547, rcv_mss = 0 }, ucopy = { prequeue = { next = 0x0, prev = 0x0, qlen = 0, lock = { slock = 3883469496, magic = 3883469496 } }, task = 0x0, iov = 0x1, memory = -559067475, len = -1066668064 }, snd_wl1 = 3228299232, snd_wnd = 16777216, max_window = 3736018669, pmtu_cookie = 0, mss_cache = 0, mss_cache_std = 0, ext_header_len = 8192, ca_state = 0 '\0', retransmits = 0 '\0', advmss = 0, window_clamp = 0, rcv_ssthresh = 4294967295, frto_highmark = 4294967295, reordering = 1 '\001', frto_counter = 0 '\0', adv_cong = 0 '\0', defer_accept = 0 '\0', srtt = 2147483647, mdev = 2147483647, mdev_max = 0, rttvar = 0, rtt_seq = 3883468316, rto = 3254917928, packets_out = 7723632, left_out = 1, retrans_out = 3735899821, backoff = 110 'n', nonagle = 173 '', keepalive_probes = 135 '\207', probes_out = 75 'K', rx_opt = { ts_recent_stamp = -1069162352, ts_recent = 3883469316, rcv_tsval = 3254914784, rcv_tsecr = 4294967295, saw_tstamp = 1, tstamp_ok = 1, dsack = 1, wscale_ok = 1, sack_ok = 15, snd_wscale = 15, rcv_wscale = 15, eff_sacks = 255 'ÿ', num_sacks = 255 'ÿ', user_mss = 0, mss_clamp = 0 }, snd_ssthresh = 0, snd_cwnd = 0, snd_cwnd_cnt = 0, snd_cwnd_clamp = 0, snd_cwnd_used = 0, snd_cwnd_stamp = 0, timeout = 0, retransmit_timer = { entry = { next = 0xc0533cd2, prev = 0xc0533cf2 }, expires = 3225177525, lock = { slock = 3226680535, magic = 3225840842 }, magic = 3226043774, function = 0xe7790514, data = 262145, base = 0x0 }, delack_timer = { entry = { next = 0x40000000, prev = 0x0 }, expires = 3261071360, lock = { slock = 33263616, magic = 20134 }, magic = 0, function = 0, data = 0, base = 0x0 }, out_of_order_queue = { next = 0x0, prev = 0x0, qlen = 0, lock = { slock = 0, magic = 0 } }, af_specific = 0x0, rcv_wnd = 0, rcv_wup = 0, write_seq = 0, pushed_seq = 0, copied_seq = 0, duplicate_sack = {{ start_seq = 0, end_seq = 128000 }}, selective_acks = {{ start_seq = 0, end_seq = 0 }, { start_seq = 0, end_seq = 3883469788 }, { start_seq = 3883469788, end_seq = 3883469796 }, { start_seq = 3883469796, end_seq = 3 }}, syn_retries = 1 '\001', ecn_flags = 0 '\0', prior_ssthresh = 0, lost_out = 33, sacked_out = 1, fackets_out = 65793, high_seq = 1, retrans_stamp = 1, undo_marker = 0, undo_retrans = 0, urg_seq = 0, urg_data = 0, pending = 0 '\0', urg_mode = 0 '\0', snd_up = 4053696949, total_retrans = 2048, syn_wait_lock = { lock = 7, magic = 0 }, listen_opt = 0x0, accept_queue = 0x0, accept_queue_tail = 0x296, keepalive_time = 262146, keepalive_intvl = 0, linger2 = 0, last_synq_overflow = 3267336616, rcv_rtt_est = { rtt = 0, seq = 0, time = 6 }, rcvq_space = { space = 67072, seq = 87380, time = 1 }, westwood = { bw_ns_est = 3735899821, bw_est = 0, rtt_win_sx = 1, bk = 3735899821, snd_una = 3883468108, cumul_ack = 3883468108, accounted = 0, rtt = 0, rtt_min = 0 }, vegas = { beg_snd_nxt = 0, beg_snd_una = 16777216, beg_snd_cwnd = 3736018669, doing_vegas_now = 0 '\0', cntRTT = 0, minRTT = 0, baseRTT = 0 }, bictcp = { cnt = 3883468152, last_max_cwnd = 3883468152, last_cwnd = 0, last_stamp = 1 } } (gdb)