Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 19 Jan 2017 09:34:24 +0200
From:      Konstantin Belousov <kostikbel@gmail.com>
To:        Rick Macklem <rmacklem@uoguelph.ca>
Cc:        Colin Percival <cperciva@tarsnap.com>, "freebsd-net@freebsd.org" <freebsd-net@freebsd.org>
Subject:   Re: sosend returning ERESTART
Message-ID:  <20170119073424.GM2349@kib.kiev.ua>
In-Reply-To: <YTXPR01MB018941314216E668972D7FCADD7F0@YTXPR01MB0189.CANPRD01.PROD.OUTLOOK.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> <YTXPR01MB018941314216E668972D7FCADD7F0@YTXPR01MB0189.CANPRD01.PROD.OUTLOOK.COM>

next in thread | previous in thread | raw e-mail | index | archive | help
On Wed, Jan 18, 2017 at 10:52:02PM +0000, Rick Macklem wrote:
> 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'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.
> 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 now.
> (It is currently broken when something like "umount" without -f is done, which
>  locks up the mounted on vnode so "umount -f" never gets to the umount(2) syscall.
>  I do plan on a "straight ot NFS" option for umount(8) to avoid this problem, but
>  haven't gotten around to it.)
> 
> The alternative to SB_NOINTR is looping and doing the sosend() again for the
> case where it returns ERESTART and "intr" wasn't set on the mount.
Note that the condition of pending signal which triggered ERESTART is
permanent until the signal is delivered or blocked. In other words, or
future PCATCH sleeps will fail with ERESTART/EINTR.

> --> 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 again.
>       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?20170119073424.GM2349>