Bug 173010

Summary: Backgrounded processes remain in ttyin state / SIGCONT does not remove sleeping processes from sleep queue
Product: Base System Reporter: Jeremy Chadwick <jdc>
Component: kernAssignee: freebsd-bugs (Nobody) <bugs>
Status: Closed FIXED    
Severity: Affects Only Me    
Priority: Normal    
Version: 9.1-PRERELEASE   
Hardware: Any   
OS: Any   
Attachments:
Description Flags
tty-bg-read.txt none

Description Jeremy Chadwick 2012-10-24 04:50:00 UTC
	The following bug/quirk in the tty layer has been discovered.  This
	issue affects processes which require tty input but are backgrounded.

	This issue has been discussed with kib@ and ed@ on freebsd-stable who
	confirmed the issue.

	Full details are in the thread titled "pty/tty or signal strangeness,
	or grep/bsdgrep bug?" here:

	http://lists.freebsd.org/pipermail/freebsd-stable/2012-October/thread.html#70204

	This affects any process that requires tty input; it's not specific
	grep/bsdgrep.

Fix: 

kib@ did provide a patch but mentioned it would be best to wait for
	what ed@ proposes.
How-To-Repeat: 	Step-by-step instructions are available:

	http://lists.freebsd.org/pipermail/freebsd-stable/2012-October/070204.html
Comment 1 Jeremy Chadwick 2012-10-25 09:51:45 UTC
Mail thread on -stable at this point, including a patch from ed@

From: Ed Schouten <ed@80386.nl>
To: Konstantin Belousov <kostikbel@gmail.com>
Date: Thu, 25 Oct 2012 09:45:11 +0200
Cc: Jeremy Chadwick <jdc@koitsu.org>, freebsd-stable@freebsd.org, jhb@freebsd.org
Subject: Re: pty/tty or signal strangeness, or grep/bsdgrep bug?

Hi all,

2012/10/23 Ed Schouten <ed@80386.nl>:
> Will try to come up with a decent patch tomorrow evening.

Ahem; the day after tomorrow. Jeremy, could you please try the following patch?

http://80386.nl/pub/tty-bg-read.txt

I decomposed the TTY read routine into four separate functions to
improve clarity. While this was initially true, I think it's a pity
the four functions are constantly becoming a bit more complex.

The same issue is also present on the output path, but I have no idea
how realistic/hard it is to fix this issue. Also, it might not really
be an issue in practice. If you do a large write and become a
non-foreground process group, you might be able to circumvent TOSTOP
while the write() is in transit.

Fixing this might be tedious, because we currently enforce that writes
to a TTY are serialized. Blocking inside the write() might then cause
a deadlock. But in my opinion, I would prefer the serialization over
the enforcing of TOSTOP.

Thanks again for reporting the issue!

-- 
Ed Schouten <ed@80386.nl>




From: Jeremy Chadwick <jdc@koitsu.org>
To: Ed Schouten <ed@80386.nl>
Date: Thu, 25 Oct 2012 01:46:03 -0700
Cc: Konstantin Belousov <kostikbel@gmail.com>, freebsd-stable@freebsd.org, jhb@freebsd.org
Subject: Re: pty/tty or signal strangeness, or grep/bsdgrep bug?

On Thu, Oct 25, 2012 at 09:45:11AM +0200, Ed Schouten wrote:
> 2012/10/23 Ed Schouten <ed@80386.nl>:
> > Will try to come up with a decent patch tomorrow evening.
>
> Ahem; the day after tomorrow. Jeremy, could you please try the following patch?
>
> http://80386.nl/pub/tty-bg-read.txt
>
> I decomposed the TTY read routine into four separate functions to
> improve clarity. While this was initially true, I think it's a pity
> the four functions are constantly becoming a bit more complex.
>
> The same issue is also present on the output path, but I have no idea
> how realistic/hard it is to fix this issue. Also, it might not really
> be an issue in practice. If you do a large write and become a
> non-foreground process group, you might be able to circumvent TOSTOP
> while the write() is in transit.
>
> Fixing this might be tedious, because we currently enforce that writes
> to a TTY are serialized. Blocking inside the write() might then cause
> a deadlock. But in my opinion, I would prefer the serialization over
> the enforcing of TOSTOP.

After the patch, testing with grep and cat, and checking cv/state for
the latter case:


(01:30:39 jdc@icarus) ~ $ csh
% grep -r "-2011" . &
[1] 1964
% jobs
[1]  + Suspended (tty input)         grep -r -2011 .
% fg
grep -r -2011 .
^C
% jobs

% grep -r "-2011" .
^Z
Suspended
% bg
[1]    grep -r -2011 . &
[1]  + Suspended (tty input)         grep -r -2011 .
% fg
grep -r -2011 .
^C

% cat &
[1] 2042
% jobs
[1]  + Suspended (tty input)         cat
% ps -auxwU jdc | grep cat
jdc  2042  0.0  0.0  9908 1496  1  T     1:34AM 0:00.00 cat
jdc  2044  0.0  0.0 16268 1864  1  S+    1:34AM 0:00.00 grep cat
% top -b -U jdc | grep cat
 2042 jdc         1  20    0  9908K  1496K STOP    0   0:00  0.00% cat
 2047 jdc         1  20    0 16268K  1864K piperd  0   0:00  0.00% grep cat
% fg
cat
^C
% exit


I do not get dropped characters or witness any other anomalies.  I
tested behaviour with /bin/sh, as well as bash.  All seems good.

> Thanks again for reporting the issue!

No, thank *you* and others for looking + fixing it!  :-)

I assume a commit to HEAD + MFC in 2 weeks is in order?

I'll update the PR with this part of our mail thread.

-- 
| Jeremy Chadwick                                   jdc@koitsu.org |
| UNIX Systems Administrator                http://jdc.koitsu.org/ |
| Mountain View, CA, US                                            |
| Making life hard for others since 1977.             PGP 4BD6C0CB |
Comment 2 Jeremy Chadwick 2012-10-26 09:35:10 UTC
Another follow-up in the thread -- fix has been committed to HEAD,
pending 2 weeks for MFC.  This fix **will not** make it into
9.1-RELEASE, sadly, but will obviously be available in RELENG_9 going
forward.



From: Ed Schouten <ed@80386.nl>
To: Jeremy Chadwick <jdc@koitsu.org>
Date: Thu, 25 Oct 2012 11:06:09 +0200
Cc: Konstantin Belousov <kostikbel@gmail.com>, freebsd-stable@freebsd.org, jhb@freebsd.org
Subject: Re: pty/tty or signal strangeness, or grep/bsdgrep bug?

2012/10/25 Jeremy Chadwick <jdc@koitsu.org>:
> I assume a commit to HEAD + MFC in 2 weeks is in order?

Yes. We're far too late to get this into 9.1, so I'll MFC it after the release.

Patch committed as r242078!

-- 
Ed Schouten <ed@80386.nl>
Comment 3 Ed Schouten freebsd_committer freebsd_triage 2012-11-11 12:37:56 UTC
State Changed
From-To: open->closed

Committed. Thanks!