FreeBSD src
Go to file
Ian Lepore f64342e354 Rework tty_drain() to poll the hardware for completion, and restore
drain timeout handling to historical freebsd behavior.

The primary reason for these changes is the need to have tty_drain() call
ttydevsw_busy() at some reasonable sub-second rate, to poll hardware that
doesn't signal an interrupt when the transmit shift register becomes empty
(which includes virtually all USB serial hardware).  Such hardware hangs
in a ttyout wait, because it never gets an opportunity to trigger a wakeup
from the sleep in tty_drain() by calling ttydisc_getc() again, after
handing the last of the buffered data to the hardware.

While researching the history of changes to tty_drain() I stumbled across
some email describing the historical BSD behavior of tcdrain() and close()
on serial ports, and the ability of comcontrol(1) to control timeout
behavior.  Using that and some advice from Bruce Evans as a guide, I've
put together these changes to implement the hardware polling and restore
the historical timeout behaviors...

 - tty_drain() now calls ttydevsw_busy() in a loop at 10 Hz to accomodate
   hardware that requires polling for busy state.

 - The "new historical" behavior for draining during close(2) is retained:
   the drain timeout is "1 second without making any progress".  When the
   1-second timeout expires, if the count of bytes remaining in the tty
   layer buffer is smaller than last time, the timeout is extended for
   another second.  Unfortunately, the same logic cannot be extended all
   the way down to the hardware, because the interface to that layer is a
   simple busy/not-busy indication.

 - Due to the previous point, an application that needs a guarantee that
   all data has been transmitted must use TIOCDRAIN/tcdrain(3) before
   calling close(2).

 - The historical behavior of honoring the drainwait setting for TIOCDRAIN
   (used by tcdrain(3)) is restored.

 - The historical kern.drainwait sysctl to control the global default
   drainwait time is restored, but is now named kern.tty_drainwait.

 - The historical default drainwait timeout of 300 seconds is restored.

 - Handling of TIOCGDRAINWAIT and TIOCSDRAINWAIT ioctls is restored
   (this also makes the comcontrol(1) drainwait verb work again).

 - Manpages are updated to document these behaviors.

Reviewed by:	bde (prior version)
2017-01-12 00:48:06 +00:00
bin chmod: Add SIGINFO handler 2017-01-08 06:50:53 +00:00
cddl Convert ipv4_flags and ipv4_offset fields into host byte order. 2016-12-29 20:27:54 +00:00
contrib readelf: add S390 relocation types 2017-01-11 22:54:04 +00:00
crypto MFV r311913: 2017-01-11 05:49:39 +00:00
etc Follow r311103: add "pool" to the keywords that rc.d/ntpdate examines to 2017-01-11 00:14:47 +00:00
gnu Enable /usr/lib32 for o32 binaries on mips64. 2017-01-06 23:30:54 +00:00
include Remove some uses of the GCC __nonnull() attribute. 2017-01-01 17:16:47 +00:00
kerberos5 Conditionalize adding ${KRB5DIR}/lib/gssapi/krb5/gkrb5_err.et to ETSRCS 2017-01-02 19:03:01 +00:00
lib Rework tty_drain() to poll the hardware for completion, and restore 2017-01-12 00:48:06 +00:00
libexec Fix acquisition of nested write compat rtld locks. 2017-01-10 19:26:55 +00:00
release Revert r309339, thus re-instating r309314 2016-12-16 23:05:47 +00:00
rescue DIRDEPS_BUILD: Update dependencies. 2016-11-13 00:11:30 +00:00
sbin Add checks for received mode page length. 2017-01-10 20:52:44 +00:00
secure Conditionalize building libwrap support into sshd 2017-01-07 08:08:35 +00:00
share Rework tty_drain() to poll the hardware for completion, and restore 2017-01-12 00:48:06 +00:00
sys Rework tty_drain() to poll the hardware for completion, and restore 2017-01-12 00:48:06 +00:00
targets Merge ^/head r308491 through r308841. 2016-11-19 16:05:55 +00:00
tests ATFify the geom gate tests. 2017-01-10 20:35:09 +00:00
tools Add recently added libc++ headers to OptionalObsoleteFiles.inc. 2017-01-09 19:22:29 +00:00
usr.bin rpcgen(1): Avoid unused variable warning on generated code. 2017-01-11 23:05:29 +00:00
usr.sbin pciconf(8): Reallow trailing colon in selectors 2017-01-12 00:34:37 +00:00
.arcconfig callsign isn't required anymore 2016-09-29 06:19:45 +00:00
.arclint phabricator related changes: 2015-04-20 20:33:22 +00:00
COPYRIGHT Bump copyright year. 2016-12-31 12:41:42 +00:00
LOCKS Explicitly require Security Officer's approval for kernel PRNG bits. 2013-09-17 14:19:05 +00:00
MAINTAINERS Remove myself from kern_timeout.c yeah! 2016-07-27 20:37:32 +00:00
Makefile Add full softfloat and hardfloat support for RISC-V. 2016-11-16 15:21:32 +00:00
Makefile.inc1 Enable /usr/lib32 for o32 binaries on mips64. 2017-01-06 23:30:54 +00:00
Makefile.libcompat Enable /usr/lib32 for o32 binaries on mips64. 2017-01-06 23:30:54 +00:00
ObsoleteFiles.inc Fix typo from change 310985 in ObsoleteFiles.inc 2017-01-10 20:37:44 +00:00
README README: remove nonexistent 'games' directory. 2016-05-18 10:43:13 +00:00
UPDATING Migrate e1000 to the IFLIB framework: 2017-01-10 03:23:22 +00:00

This is the top level of the FreeBSD source directory.  This file
was last revised on:
$FreeBSD$

For copyright information, please see the file COPYRIGHT in this
directory (additional copyright information also exists for some
sources in this tree - please see the specific source directories for
more information).

The Makefile in this directory supports a number of targets for
building components (or all) of the FreeBSD source tree.  See build(7)
and http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/makeworld.html
for more information, including setting make(1) variables.

The `buildkernel` and `installkernel` targets build and install
the kernel and the modules (see below).  Please see the top of
the Makefile in this directory for more information on the
standard build targets and compile-time flags.

Building a kernel is a somewhat more involved process.  See build(7), config(8),
and http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig.html
for more information.

Note: If you want to build and install the kernel with the
`buildkernel` and `installkernel` targets, you might need to build
world before.  More information is available in the handbook.

The kernel configuration files reside in the sys/<arch>/conf
sub-directory.  GENERIC is the default configuration used in release builds.
NOTES contains entries and documentation for all possible
devices, not just those commonly used.


Source Roadmap:
---------------

bin		System/user commands.

cddl		Various commands and libraries under the Common Development
		and Distribution License.

contrib		Packages contributed by 3rd parties.

crypto		Cryptography stuff (see crypto/README).

etc		Template files for /etc.

gnu		Various commands and libraries under the GNU Public License.
		Please see gnu/COPYING* for more information.

include		System include files.

kerberos5	Kerberos5 (Heimdal) package.

lib		System libraries.

libexec		System daemons.

release		Release building Makefile & associated tools.

rescue		Build system for statically linked /rescue utilities.

sbin		System commands.

secure		Cryptographic libraries and commands.

share		Shared resources.

sys		Kernel sources.

tests		Regression tests which can be run by Kyua.  See tests/README
		for additional information.

tools		Utilities for regression testing and miscellaneous tasks.

usr.bin		User commands.

usr.sbin	System administration commands.


For information on synchronizing your source tree with one or more of
the FreeBSD Project's development branches, please see:

  http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/synching.html