Hi Slawa,

On 10/13/16 4:38 PM, Slawa Olhovchenkov wrote:
> On Thu, Oct 13, 2016 at 01:56:21PM +0200, Julien Charbon wrote:
>>>>  Something like:
>>>
>>> Yes, thanks!
>>
>>  Proposed changes added in the review:
>>
>> https://reviews.freebsd.org/D8211
>>
>>  tell me when you have three days without issue with this change.
>>
>>>> tcp_detach() {
>>>>
>>>>   ...
>>>>   if (inp->inp_flags & INP_TIMEWAIT) {
>>>>
>>>>     ...
>>>>     if (inp->inp_flags & INP_DROPPED) {
>>>>
>>>>       in_pcbdetach(inp);
>>>>       if (__predict_true(tp == NULL)) {
>>>>           in_pcbfree(inp);
>>>>       } else {
>>>> #ifdef INVARIANTS
>>>>         panic("tcp_detach: tp != NULL, That's not good because 'blah'\n");
>>>> #else
>>>>         log(LOG_ERR, "tcp_detach: tp != NULL, That's not good because
>>>> 'blah'\n");
>>>
>>> May be some more info in log can help to detect root cause of issuse?
>>> I am don't know what info, may be flags or number of references?
>>
>>  For this kind of issue, the useful part is the stacktrace.  INVARIANT
> 
> Like this?
> 
> #ifdef KDB
>                 kdb_backtrace();
> #endif
> 
> as found in sys/netgraph/ng_base.c

 It is overkill dtrace can do that.

>> will give you that trace in the core, and without INVARIANT then it is
>> better to use dtrace:
>>
>> $ cat tcp-twstart-dropped.d
>> fbt::tcp_twstart:entry
>> /args[0]->t_inpcb->inp_flags & 0x04000000/
>> {
>>   stack();
>>   printf("INP_DROPPED in tcp_twstart: %x", args[0]->t_inpcb->inp_flags);
>> }
> 
> Same code may be insert there too, IMHO.

 Hmm, I don't think so:

 - If you have INVARIANT, the kernel will panic in tcp_twstart() or
tcp_detach() and you will have everything you need to debug.
 - If you don't, dtrace is the right tool to use in all cases anyway.

--
Julien

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to