Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 18 Jan 2017 22:52:02 +0000
From:      Rick Macklem <rmacklem@uoguelph.ca>
To:        Colin Percival <cperciva@tarsnap.com>, Konstantin Belousov <kostikbel@gmail.com>
Cc:        "freebsd-net@freebsd.org" <freebsd-net@freebsd.org>
Subject:   Re: sosend returning ERESTART
Message-ID:  <YTXPR01MB018941314216E668972D7FCADD7F0@YTXPR01MB0189.CANPRD01.PROD.OUTLOOK.COM>
In-Reply-To: <01000159b390c409-5adcb488-67e8-4038-b9b0-5d4f33460205-000000@email.amazonses.com>
References:  <01000159aac969e6-b2fc3913-d04e-42d4-befd-402ed0d830bf-000000@email.amazonses.com> <20170117100634.GS2349@kib.kiev.ua> <01000159afddb7ce-064a5d17-4b81-4b2c-a9b4-3ddd2ad2e377-000000@email.amazonses.com> <20170118103650.GE2349@kib.kiev.ua>, <01000159b390c409-5adcb488-67e8-4038-b9b0-5d4f33460205-000000@email.amazonses.com>

next in thread | previous in thread | raw e-mail | index | archive | help
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 fu=
ll
>>> 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'm not sure what you're getting at here.  The fact that "NFS mounted with=
out
>the intr flag" + "unresponsive NFS server" =3D "unkillable processes" has =
been
>a (mis)feature of NFS for decades.
The case I would like to see work is the forced dismount. I need to go look=
 at
what it does and see if SB_NOINTR would break it worse than it is broken no=
w.
(It is currently broken when something like "umount" without -f is done, wh=
ich
 locks up the mounted on vnode so "umount -f" never gets to the umount(2) s=
yscall.
 I do plan on a "straight ot NFS" option for umount(8) to avoid this proble=
m, but
 haven't gotten around to it.)

The alternative to SB_NOINTR is looping and doing the sosend() again for th=
e
case where it returns ERESTART and "intr" wasn't set on the mount.
--> For this to be ok, we must be sure that when sosend() returns ERESTART,
      it has not queued the data for sending so it is safe to send it all a=
gain.
      I think this is true for this case?

rick



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