Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 23 Feb 2021 22:40:20 +0000
From:      "Scheffenegger, Richard" <Richard.Scheffenegger@netapp.com>
To:        "avg@FreeBSD.org" <avg@FreeBSD.org>
Cc:        "tuexen@freebsd.org" <tuexen@freebsd.org>, "net@FreeBSD.org" <net@freebsd.org>
Subject:   AW: panic: sackhint bytes rtx >= 0
Message-ID:  <SN4PR0601MB37288873BB2967AC78B26C8986809@SN4PR0601MB3728.namprd06.prod.outlook.com>
In-Reply-To: <8BB910F9-B828-49A2-8941-4F6C6419D8EA@freebsd.org>
References:  <960081ac-2839-a226-3142-5a4666eb54ad@FreeBSD.org> <8BB910F9-B828-49A2-8941-4F6C6419D8EA@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
Hi Andriy,

I guess I am currently the person who has the most recent knowledge about t=
hat part of the base stack...

Do you happen to have more (preceding) information about this, or a way to =
reproduce this?

Are you running any special stack (RACK, BBR) which may have switched back =
to the base stack in the middle of a loss recovery (I suspected at one poin=
t that this may cause issues, potentially)?

Or was something done with the ipfw that may have temporarily impacted a tc=
p session?


The accounting with sack_bytes_rexmit is rather old, and not touched recent=
ly (but the sackhint struct was changed recently, and other/additional scor=
eboard accounting was added).


(kgdb) p *cur
$1 =3D {start =3D 3846347980, end =3D 3846352300, rxmit =3D 3846352300, scb=
link =3D
{tqe_next =3D 0xfffff8013da5a220, tqe_prev =3D 0xfffff80754818930}}

This indicates, that the current hole in the SACK scoreboard (3 segments of=
 size 1440 bytes) were retransmitted  (rxmit =3D=3D end), before the curren=
t acknowledgement came back.

Thus the expectation is, that sackhint.sack_bytes_rexmit also has a value o=
f at least that number of bytes (4320). It is increased in tcp_output() for=
 each packet leaving while performing a retransmission.

But this is the peculiar part:
(kgdb) p tp@entry->sackhint.sack_bytes_rexmit<mailto:tp@entry-%3esackhint.s=
ack_bytes_rexmit>
$3 =3D -1440

Indicating negative one packet had been retransmitted before (thus subtract=
ing the hole, which was previously retransmitted violates the invariant). A=
nd the only piece of code decrementing it appears to be in tcp_output() dur=
ing non-permanent error handling...


All updates to sackhint should be protected by the INPLOCK, so even if the =
rx and tx paths are running on different core, the sack_bytes_rexmit should=
 never become negative.


The sack blocks returned indicate that (with snd.una as zero baseline, in s=
egments) the client knows about segments 2..34 and 35..47.

The first hole has shrunk from the right (unusual; possible when two retran=
smissions were lost again, or the 3 segment originally sent, delayed by ~50=
 segments (unlikely).


Sorry to not being able to spot something obvious right away...


Richard Scheffenegger
Consulting Solution Architect
NAS & Networking

NetApp
+43 1 3676 811 3157 Direct Phone
+43 664 8866 1857 Mobile Phone
Richard.Scheffenegger@netapp.com<mailto:Richard.Scheffenegger@netapp.com>

https://ts.la/richard49892


Von: tuexen@freebsd.org <tuexen@freebsd.org>
Gesendet: Dienstag, 23. Februar 2021 22:21
An: Richard Scheffenegger <rscheff@freebsd.org>
Betreff: Fwd: panic: sackhint bytes rtx >=3D 0

NetApp Security WARNING: This is an external email. Do not click links or o=
pen attachments unless you recognize the sender and know the content is saf=
e.


FYI


Begin forwarded message:

From: Andriy Gapon <avg@FreeBSD.org<mailto:avg@FreeBSD.org>>
Subject: panic: sackhint bytes rtx >=3D 0
Date: 23. February 2021 at 22:02:20 CET
To: FreeBSD Current <current@FreeBSD.org<mailto:current@FreeBSD.org>>, net@=
FreeBSD.org<mailto:net@FreeBSD.org>


Got this panic on 13.0-STABLE 4b2a20dfde9c using a custom kernel with INVAR=
IANTS
enabled.
Below is some information from the crash dump.
If anyone has any clues, suggestions, etc, please help.
I will try to help you to help me the best I can.

#0  doadump (textdump=3Dtextdump@entry=3D1)
   at /usr/devel/git/trant/sys/kern/kern_shutdown.c:399
#1  0xffffffff808396b2 in kern_reboot (howto=3D260)
   at /usr/devel/git/trant/sys/kern/kern_shutdown.c:486
#2  0xffffffff80839d07 in vpanic (
   fmt=3D0xffffffff80cbd551 "sackhint bytes rtx >=3D 0", ap=3D0xfffffe0120b=
9e6d0)
   at /usr/devel/git/trant/sys/kern/kern_shutdown.c:919
#3  0xffffffff808398b3 in panic (fmt=3D<unavailable>)
   at /usr/devel/git/trant/sys/kern/kern_shutdown.c:843
#4  0xffffffff8098a82c in tcp_sack_doack (tp=3D<optimized out>,
   tp@entry=3D0xfffff807548187f0, to=3D<optimized out>,
   to@entry=3D0xfffffe0120b9e780, th_ack=3D<optimized out>)
   at /usr/devel/git/trant/sys/netinet/tcp_sack.c:691
#5  0xffffffff80983699 in tcp_do_segment (m=3D0xfffff8029868ca00,
   m@entry=3D<error reading variable: value is not available>,
   th=3D<optimized out>,
   th@entry=3D<error reading variable: value is not available>,
   so=3D0xfffff804e7359b10,
   so@entry=3D<error reading variable: value is not available>,
   tp=3D0xfffff807548187f0,
   tp@entry=3D<error reading variable: value is not available>,
   drop_hdrlen=3D60,
   drop_hdrlen@entry=3D<error reading variable: value is not available>,
   tlen=3D<optimized out>,
   tlen@entry=3D<error reading variable: value is not available>,
   iptos=3D72 'H',
   iptos@entry=3D<error reading variable: value is not available>)
   at /usr/devel/git/trant/sys/netinet/tcp_input.c:2497
#6  0xffffffff80980d97 in tcp_input (mp=3D<optimized out>,
   mp@entry=3D<error reading variable: value is not available>,
   offp=3D<optimized out>,
   offp@entry=3D<error reading variable: value is not available>,
   proto=3D<optimized out>)
   at /usr/devel/git/trant/sys/netinet/tcp_input.c:1381
#7  0xffffffff80976eb7 in ip_input (m=3D0x0)
   at /usr/devel/git/trant/sys/netinet/ip_input.c:833
#8  0xffffffff8094c78f in netisr_dispatch_src (proto=3D1,
   source=3Dsource@entry=3D0, m=3D0xfffff8029868ca00)
   at /usr/devel/git/trant/sys/net/netisr.c:1143
#9  0xffffffff8094cb0e in netisr_dispatch (proto=3D<unavailable>,
   m=3D<unavailable>) at /usr/devel/git/trant/sys/net/netisr.c:1234
#10 0xffffffff80943345 in ether_demux (ifp=3Difp@entry=3D0xfffff80008c75000=
,
   m=3D<unavailable>) at /usr/devel/git/trant/sys/net/if_ethersubr.c:923
#11 0xffffffff809446c1 in ether_input_internal (ifp=3D0xfffff80008c75000,
   m=3D<unavailable>) at /usr/devel/git/trant/sys/net/if_ethersubr.c:709
#12 0xffffffff809443d0 in ether_nh_input (m=3D<unavailable>)
   at /usr/devel/git/trant/sys/net/if_ethersubr.c:739
#13 0xffffffff8094c78f in netisr_dispatch_src (proto=3Dproto@entry=3D5,
   source=3Dsource@entry=3D0, m=3Dm@entry=3D0xfffff8029868ca00)
   at /usr/devel/git/trant/sys/net/netisr.c:1143
#14 0xffffffff8094cb0e in netisr_dispatch (proto=3D<unavailable>,
   proto@entry=3D5, m=3D<unavailable>, m@entry=3D0xfffff8029868ca00)
   at /usr/devel/git/trant/sys/net/netisr.c:1234
#15 0xffffffff8094383d in ether_input (ifp=3D0xfffff80008c75000,
   ifp@entry=3D<error reading variable: value is not available>,
   m=3D0xfffff8029868ca00,
   m@entry=3D<error reading variable: value is not available>)
   at /usr/devel/git/trant/sys/net/if_ethersubr.c:830
#16 0xffffffff8066da13 in re_rxeof (sc=3Dsc@entry=3D0xfffffe00391a5000,
   rx_npktsp=3D0x0) at /usr/devel/git/trant/sys/dev/re/if_re.c:2388
#17 0xffffffff8066b3ab in re_intr_msi (xsc=3D0xfffffe00391a5000)
   at /usr/devel/git/trant/sys/dev/re/if_re.c:2684
#18 0xffffffff80801bcf in intr_event_execute_handlers (
   p=3Dp@entry=3D0xfffff80006a94a50, ie=3Die@entry=3D0xfffff80008c57800)
   at /usr/devel/git/trant/sys/kern/kern_intr.c:1168
#19 0xffffffff80801942 in ithread_execute_handlers (
   p=3Dp@entry=3D0xfffff80006a94a50, ie=3Die@entry=3D0xfffff80008c57800)
   at /usr/devel/git/trant/sys/kern/kern_intr.c:1181
#20 0xffffffff80801758 in ithread_loop (arg=3Darg@entry=3D0xfffff80008c20c4=
0)
   at /usr/devel/git/trant/sys/kern/kern_intr.c:1269
#21 0xffffffff807fe0a9 in fork_exit (
   callout=3D0xffffffff808016c0 <ithread_loop>, arg=3D0xfffff80008c20c40,
   frame=3D0xfffffe0120b9ed40)
   at /usr/devel/git/trant/sys/kern/kern_fork.c:1069


(kgdb) fr 4
#4  0xffffffff8098a82c in tcp_sack_doack (tp=3D<optimized out>,
tp@entry=3D0xfffff807548187f0, to=3D<optimized out>, to@entry=3D0xfffffe012=
0b9e780,
th_ack=3D<optimized out>) at /usr/devel/git/trant/sys/netinet/tcp_sack.c:69=
1
691                     KASSERT(tp->sackhint.sack_bytes_rexmit >=3D 0,
(kgdb) i loc
sack_blocks =3D {{start =3D 3846350860, end =3D 3846396940}, {start =3D 384=
6398380, end
=3D 3846415660}, {start =3D 0, end =3D 0}, {start =3D 1417775088, end =3D 4=
294965255},
{start =3D 549054304, end =3D 4294966785}}
left_edge_delta =3D <optimized out>
delivered_data =3D 0
sack_changed =3D <optimized out>
num_sack_blks =3D <optimized out>
i =3D <optimized out>
j =3D <optimized out>
sack =3D {start =3D <optimized out>, end =3D <optimized out>}
sblkp =3D 0xfffffe0120b9e700
temp =3D <optimized out>
cur =3D 0xfffff8013da5a320
(kgdb) p *cur
$1 =3D {start =3D 3846347980, end =3D 3846352300, rxmit =3D 3846352300, scb=
link =3D
{tqe_next =3D 0xfffff8013da5a220, tqe_prev =3D 0xfffff80754818930}}
(kgdb) p 3846352300 - 3846347980
$2 =3D 4320
(kgdb) p tp->sackhint.sack_bytes_rexmit
value has been optimized out
(kgdb) p tp@entry->sackhint.sack_bytes_rexmit<mailto:tp@entry-%3esackhint.s=
ack_bytes_rexmit>
$3 =3D -1440
(kgdb) p 4320 - 1440
$4 =3D 2880
(kgdb) p *sblkp
$5 =3D {start =3D 3846350860, end =3D 3846396940}

(kgdb) p *tp@entry
$7 =3D {t_inpcb =3D 0xfffff80640ca65b8, t_fb =3D 0xffffffff80ef4700 <tcp_de=
f_funcblk>,
t_fb_ptr =3D 0x0, t_maxseg =3D 1440, t_logstate =3D 0, t_port =3D 0, t_stat=
e =3D 4,
t_idle_reduce =3D 0, t_delayed_ack =3D 0, t_fin_is_rst =3D 0,
 t_log_state_set =3D 0, bits_spare =3D 0, t_flags =3D 1613759072, snd_una =
=3D
3846347980, snd_max =3D 3846417100, snd_nxt =3D 3846417100, snd_up =3D 3846=
347980,
snd_wnd =3D 237568, snd_cwnd =3D 4320, t_peakrate_thr =3D 0, ts_offset =3D =
71449215,
 rfbuf_ts =3D 162235772, rcv_numsacks =3D 0, t_tsomax =3D 0, t_tsomaxsegcou=
nt =3D 0,
t_tsomaxsegsize =3D 0, rcv_nxt =3D 2281639092, rcv_adv =3D 2281705332, rcv_=
wnd =3D
66240, t_flags2 =3D 1030, t_srtt =3D 876, t_rttvar =3D 33, ts_recent =3D 0,
 snd_scale =3D 8 '\b', rcv_scale =3D 6 '\006', snd_limited =3D 2 '\002',
request_r_scale =3D 6 '\006', last_ack_sent =3D 2281639092, t_rcvtime =3D 2=
309118641,
rcv_up =3D 2281639092, t_segqlen =3D 0, t_segqmbuflen =3D 0, t_segq =3D {
   tqh_first =3D 0x0, tqh_last =3D 0xfffff80754818880}, t_in_pkt =3D 0x0, t=
_tail_pkt
=3D 0x0, t_timers =3D 0xfffff80754818a78, t_vnet =3D 0x0, snd_ssthresh =3D =
31680,
snd_wl1 =3D 2281639092, snd_wl2 =3D 3846347980, irs =3D 2281631223,
 iss =3D 3840447913, t_acktime =3D 0, t_sndtime =3D 2309118613, ts_recent_a=
ge =3D 0,
snd_recover =3D 3846415660, cl4_spare =3D 0, t_oobflags =3D 0 '\000', t_iob=
c =3D 0
'\000', t_rxtcur =3D 270, t_rxtshift =3D 1, t_rtttime =3D 2309118613,
 t_rtseq =3D 3846415660, t_starttime =3D 2309086941, t_fbyte_in =3D 2309087=
188,
t_fbyte_out =3D 2309087159, t_pmtud_saved_maxseg =3D 0, t_blackhole_enter =
=3D 0,
t_blackhole_exit =3D 0, t_rttmin =3D 30, t_rttbest =3D 845, t_softerror =3D=
 0,
 max_sndwnd =3D 237568, snd_cwnd_prev =3D 64800, snd_ssthresh_prev =3D 8640=
,
snd_recover_prev =3D 3846347980, t_sndzerowin =3D 0, t_rttupdated =3D 368,
snd_numholes =3D 2, t_badrxtwin =3D 0, snd_holes =3D {tqh_first =3D 0xfffff=
8013da5a320,
   tqh_last =3D 0xfffff8013da5a230}, snd_fack =3D 3846415660, sackblks =3D =
{{start =3D
2281632180, end =3D 2281632690}, {start =3D 0, end =3D 0}, {start =3D 0, en=
d =3D 0},
{start =3D 0, end =3D 0}, {start =3D 0, end =3D 0}, {start =3D 0, end =3D 0=
}},
 sackhint =3D {nexthole =3D 0xfffff8013da5a220, sack_bytes_rexmit =3D -1440=
,
last_sack_ack =3D 3846415660, delivered_data =3D 1440, sacked_bytes =3D 619=
20,
recover_fs =3D 67680, prr_delivered =3D 1440, _pad =3D {0}}, t_rttlow =3D 2=
5,
 rfbuf_cnt =3D 0, tod =3D 0x0, t_sndrexmitpack =3D 520, t_rcvoopack =3D 0, =
t_toe =3D 0x0,
cc_algo =3D 0xffffffff80ef2530 <newreno_cc_algo>, ccv =3D 0xfffff80754818bc=
0, osd =3D
0x0, t_bytes_acked =3D 11520, t_maxunacktime =3D 0, t_keepinit =3D 0,
 t_keepidle =3D 0, t_keepintvl =3D 0, t_keepcnt =3D 0, t_dupacks =3D 4, t_l=
ognum =3D 0,
t_loglimit =3D 0, t_pacing_rate =3D -1, t_logs =3D {stqh_first =3D 0x0, stq=
h_last =3D
0x0}, t_lin =3D 0x0, t_lib =3D 0x0, t_output_caller =3D 0x0, t_stats =3D 0x=
0,
 t_logsn =3D 0, gput_ts =3D 0, gput_seq =3D 0, gput_ack =3D 0, t_stats_gput=
_prev =3D 0,
t_tfo_client_cookie_len =3D 0 '\000', t_end_info_status =3D 0, t_tfo_pendin=
g =3D 0x0,
t_tfo_cookie =3D {client =3D '\000' <repeats 15 times>, server =3D 0}, {
   t_end_info_bytes =3D "\000\000\000\000\000\000\000", t_end_info =3D 0}}

(kgdb) p *tp@entry->sackhint.nexthole<mailto:*tp@entry-%3esackhint.nexthole=
>
$8 =3D {start =3D 3846396940, end =3D 3846398380, rxmit =3D 3846398380, scb=
link =3D
{tqe_next =3D 0x0, tqe_prev =3D 0xfffff8013da5a330}}

--
Andriy Gapon
_______________________________________________
freebsd-current@freebsd.org<mailto:freebsd-current@freebsd.org> mailing lis=
t
https://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to "freebsd-current-unsubscribe@freebsd.org<m=
ailto:freebsd-current-unsubscribe@freebsd.org>"




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?SN4PR0601MB37288873BB2967AC78B26C8986809>