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)