sosend returning ERESTART

Rick Macklem rmacklem at uoguelph.ca
Thu Jan 19 01:03:36 UTC 2017


Colin Percival wrote:
>On 01/18/17 02:36, Konstantin Belousov wrote:
>> On Wed, Jan 18, 2017 at 04:37:40AM +0000, Colin Percival wrote:
>>> Thanks, looks like that was exactly it -- if the TCP send buffer was full
>>> we would call sbwait, and if a signal arrived it would return ERESTART.
>>> It looks like setting the SB_NOINTR flag will prevent this; I'm testing a
>>> patch right now.
>>
>> Note that passing SB_NOINTR unconditionally or even only for mounts
>> with nointr (default) option is wrong. You make the socket operation
>> uninterruptible, process terminate-ability becomes depended on the
>> external factor, the behaviour of the remote system.
I looked and I think forced dismounts are broken when the thread is stuck in
sosend(). (It assumes that the threads doing RPCs are waiting for replies.)
--> I think this can be fixed by posting a signal to the threads, but only if
      SB_NOINTR isn't used.
--> As such, I think looping on ERESTART when PCATCH isn't set in ct_waitflag
     is the better way to go. (At a glance, I think sosend_generic() will fail with
     ERESTART before putting any data in the send queue. For NFS, it uses the
     mbuf list "top" and is always "atomic".)

Kostik, Colin has already been testing the looping case.

>I'm not sure what you're getting at here.  The fact that "NFS mounted without
>the intr flag" + "unresponsive NFS server" = "unkillable processes" has been
>a (mis)feature of NFS for decades.
As I already mentioned, I'd like to at least get forced dismounts to work, rick



More information about the freebsd-net mailing list