Edgar Fuß
2008-09-02 09:45:07 UTC
But I don't understand how it could cause a tcp_setpersist() panic.
If I
understand it properly, we can't have TCPT_REXMT and TCPT_PERSIST
armed
at the same time. Here the path comes from TCPT_PERSIST's handler so
it was armed. Nothing arms TCPT_PERSIST outside of tcp_setpersist(),
so TCPT_REXMT has been armed after TCPT_PERSIST was.
syn_cache_get() can arm TCPT_REXMT without checking TCPT_PERSIST.
I don't know if TCPT_PERSIST could have been armed before at this
point.
I couldn't find other places where TCPT_REXMT would be armed without
checking TCPT_PERSIST.
Without having enough time atm to look into this thoroughly just now:If I
understand it properly, we can't have TCPT_REXMT and TCPT_PERSIST
armed
at the same time. Here the path comes from TCPT_PERSIST's handler so
it was armed. Nothing arms TCPT_PERSIST outside of tcp_setpersist(),
so TCPT_REXMT has been armed after TCPT_PERSIST was.
syn_cache_get() can arm TCPT_REXMT without checking TCPT_PERSIST.
I don't know if TCPT_PERSIST could have been armed before at this
point.
I couldn't find other places where TCPT_REXMT would be armed without
checking TCPT_PERSIST.
It looks like tcp_timer_rexmt() can also (re-)arm the retransmit timer.
I'm easily confused by the fact that counter-intuitively,
TCP_TIMER_ISARMED() doesn't mean "the timer is running and going to
fire any moment", but "the timer has been armed in the past and not
disarmed since".
Would it be an option for you to try the patch (modified as yamt@
wrote) and check whether the panic persists?
--
Posted automagically by a mail2news gateway at muc.de e.V.
Please direct questions, flames, donations, etc. to news-***@muc.de