amd + NFS reconnect = ICMP storm + unkillable process.

Martin Birgmeier Martin.Birgmeier at aon.at
Sat Aug 27 09:31:03 UTC 2011


Thank you for these patches.

One interesting thing: I was trying to backport them to 7.4.0 and 
RELENG_7, too, but there the portion of the code dealing with the 
RPC_CANTSEND case does not exist. On the other hand, the problem 
surfaced (for me) when upgrading from 7.4 to 8.2. So could one probably 
conclude that it is more the write case which leads to the erroneous 
behavior?

Regards,

Martin

On 08/26/11 21:19, Artem Belevich wrote:
> On Fri, Aug 26, 2011 at 12:04 PM, Rick Macklem<rmacklem at uoguelph.ca>  wrote:
>> The patch looks good to me. The only thing is that *maybe* it should
>> also do the same for the other msleep() higher up in clnt_dg_call()?
>> (It seems to me that if this msleep() were to return ERESTART, the same
>>   kernel loop would occur.)
>>
>> Here's this variant of the patch (I'll let you decide which to commit).
>>
>> Good work tracking this down, rick
>>
>> --- rpc/clnt_dg.c.sav   2011-08-26 14:44:27.000000000 -0400
>> +++ rpc/clnt_dg.c       2011-08-26 14:48:07.000000000 -0400
>> @@ -467,7 +467,10 @@ send_again:
>>                     cu->cu_waitflag, "rpccwnd", 0);
>>                 if (error) {
>>                         errp->re_errno = error;
>> -                       errp->re_status = stat = RPC_CANTSEND;
>> +                       if (error == EINTR || error == ERESTART)
>> +                               errp->re_status = stat = RPC_INTR;
>> +                       else
>> +                               errp->re_status = stat = RPC_CANTSEND;
>>                         goto out;
>>                 }
>>         }
> You're right. I'll add the change to the commit.
>
> --Artem
>
>> @@ -636,7 +639,7 @@ get_reply:
>>                  */
>>                 if (error != EWOULDBLOCK) {
>>                         errp->re_errno = error;
>> -                       if (error == EINTR)
>> +                       if (error == EINTR || error == ERESTART)
>>                                 errp->re_status = stat = RPC_INTR;
>>                         else
>>                                 errp->re_status = stat = RPC_CANTRECV;
>>
>>
> _______________________________________________
> freebsd-net at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-net
> To unsubscribe, send any mail to "freebsd-net-unsubscribe at freebsd.org"
>
>
>


More information about the freebsd-net mailing list