FreeBSD src
Go to file
John Baldwin 02d23fdd74 Fix a bug where a thread that hit the race where the sleep timeout fires
while the thread does not hold the thread lock would stop blocking for
subsequent interruptible sleeps and would always immediately fail the
sleep with EWOULDBLOCK instead (even sleeps that didn't have a timeout).

Some background:
- KSE has a facility for allowing one thread to interrupt another thread.
  During this process, the target thread aborts any interruptible sleeps
  much as if the target thread had a pending signal.  Once the target
  thread acknowledges the interrupt, normal sleep handling resumes.  KSE
  manages this via the TDF_INTERRUPTED flag.  Specifically, it sets the
  flag when it sends an interrupt to another thread and clears it when
  the interrupt is acknowledged.  (Note that this is purely a software
  interrupt sort of thing and has no relation to hardware interrupts
  or kernel interrupt threads.)
- The old code for handling the sleep timeout race handled the race
  by setting the TDF_INTERRUPT flag and faking a KSE-style thread
  interrupt to the thread in the process of going to sleep.  It probably
  should have just checked the TDF_TIMEOUT flag in sleepq_catch_signals()
  instead.
- The bug was that the sleepq code would set TDF_INTERRUPT but it was
  never cleared.  The sleepq code couldn't safely clear it in case there
  actually was a real KSE thread interrupt pending for the target thread
  (in fact, the sleepq timeout actually stomped on said pending interrupt).
  Thus, any future interruptible sleeps (*sleep(.. PCATCH ..) or
  cv_*wait_sig()) would see the TDF_INTERRUPT flag set and immediately
  fail with EWOULDBLOCK.  The flag could be cleared if the thread belonged
  to a KSE process and another thread posted an interrupt to the original
  thread.  However, in the more common case of a non-KSE process, the
  thread would pretty much stop sleeping.
- Fix the bug by just setting TDF_TIMEOUT in the sleepq timeout code and
  not messing with TDF_INTERRUPT and td_intrval.  With yesterday's fix to
  fix sleepq_switch() to check TDF_TIMEOUT, this is now sufficient.

MFC after:	3 days
2008-01-25 19:44:46 +00:00
bin - Roll-back attempts to mimic rename(2) atomicity introduced in 1.47, 2007-12-27 11:33:42 +00:00
cddl Remove _SOLARIS_C_SOURCE now that it doesn't do anything in FreeBSD 2007-11-28 22:58:09 +00:00
compat/opensolaris Add more OpenSolaris compatibilty headers. 2007-11-28 21:40:07 +00:00
contrib Add a -P flag to display per-cpu cpu usage stats. 2008-01-18 01:43:14 +00:00
crypto Unbreak detection of cryptodev support for FreeBSD which was broken 2008-01-13 11:44:47 +00:00
etc Backout previous commit. It's going to clutter the console 2008-01-25 16:44:34 +00:00
games A real gem from freebsd-current@ 2008-01-10 14:51:24 +00:00
gnu Move the code for working with kld's out into its own file. 2008-01-24 19:11:13 +00:00
include _POSIX_THREAD_CPUTIME is now supported. 2008-01-18 08:48:32 +00:00
kerberos5 While checking over the libraries for 7.0-REL Kris found the following 2007-11-20 04:20:32 +00:00
lib Fix a regression introduced in rev 1.99: replace fclose(f) with a comment 2008-01-23 20:57:59 +00:00
libexec For un-prototyped static inline functions declared in pthread_md.h on 2007-12-01 14:24:44 +00:00
release In 'fixit mode' running "fsck /dev/ad0s1a" typically complains that it 2008-01-22 16:35:10 +00:00
rescue o Build geom for all platforms. 2007-11-04 00:44:10 +00:00
sbin Hide ipfw internal data structures behind IPFW_INTERNAL rather than 2008-01-25 14:38:27 +00:00
secure - Bump share library version which were missed in last bump 2007-06-18 18:47:54 +00:00
share Reflect lockcount() axing and lockmgr() prototype changing. 2008-01-24 14:17:52 +00:00
sys Fix a bug where a thread that hit the race where the sleep timeout fires 2008-01-25 19:44:46 +00:00
tools Update the timestamp regexps in syncstamp() and monostamp() for > 99999 2008-01-25 19:24:12 +00:00
usr.bin Flag a hack. 2008-01-24 07:25:13 +00:00
usr.sbin Clarify in what formats the grouplist for the '-G' switch may be accepted. 2008-01-25 15:54:14 +00:00
COPYRIGHT Happy new year 2008! 2007-12-31 22:09:19 +00:00
LOCKS Once the release goes out, RELENG_7_* will need approval from so@. 2008-01-24 22:07:03 +00:00
MAINTAINERS Update the maintainer id for em driver. 2007-05-23 21:47:19 +00:00
Makefile We don't need to invent BSDMAKE. ${MAKE} is sufficient. 2007-12-13 00:08:02 +00:00
Makefile.inc1 Support source upgrades from at least 6.0-RELEASE. 2008-01-23 22:21:36 +00:00
ObsoleteFiles.inc Reflect BUF_REFCNT(9) removal. 2008-01-22 20:08:09 +00:00
README Simply running ``make world'' will bomb unless you dig up the 2006-06-07 03:33:48 +00:00
UPDATING Support source upgrades from at least 6.0-RELEASE. 2008-01-23 22:21:36 +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, the most
commonly used one being ``world'', which rebuilds and installs
everything in the FreeBSD system from the source tree except the
kernel, the kernel-modules and the contents of /etc.  The ``world''
target should only be used in cases where the source tree has not
changed from the currently running version.  See:
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, documentation
for which can be found at:
   http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig.html
And in the config(8) man page.
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 sample kernel configuration files reside in the sys/<arch>/conf
sub-directory (assuming that you've installed the kernel sources), the
file named GENERIC being the one used to build your initial installation
kernel.  The file NOTES contains entries and documentation for all possible
devices, not just those commonly used.  It is the successor of the ancient
LINT file, but in contrast to LINT, it is not buildable as a kernel but a
pure reference and documentation file.


Source Roadmap:
---------------
bin		System/user commands.

contrib		Packages contributed by 3rd parties.

crypto		Cryptography stuff (see crypto/README).

etc		Template files for /etc.

games		Amusements.

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.

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