freebsd-dev/sys/sys
Alfred Perlstein 85f190e4d1 Fixes to make select/poll mpsafe.
Problem:
  selwakeup required calling pfind which would cause lock order
  reversals with the allproc_lock and the per-process filedesc lock.
Solution:
  Instead of recording the pid of the select()'ing process into the
  selinfo structure, actually record a pointer to the thread.  To
  avoid dereferencing a bad address all the selinfo structures that
  are in use by a thread are kept in a list hung off the thread
  (protected by sellock).  When a selwakeup occurs the selinfo is
  removed from that threads list, it is also removed on the way out
  of select or poll where the thread will traverse its list removing
  all the selinfos from its own list.

Problem:
  Previously the PROC_LOCK was used to provide the mutual exclusion
  needed to ensure proper locking, this couldn't work because there
  was a single condvar used for select and poll and condvars can
  only be used with a single mutex.
Solution:
  Introduce a global mutex 'sellock' which is used to provide mutual
  exclusion when recording events to wait on as well as performing
  notification when an event occurs.

Interesting note:
  schedlock is required to manipulate the per-thread TDF_SELECT
  flag, however if given its own field it would not need schedlock,
  also because TDF_SELECT is only manipulated under sellock one
  doesn't actually use schedlock for syncronization, only to protect
  against corruption.

Proc locks are no longer used in select/poll.

Portions contributed by: davidc
2002-03-14 01:32:30 +00:00
..
_lock.h - Move the definition of LOCK_DEBUG back to sys/lock.h from sys/_lock.h. 2001-10-19 19:28:18 +00:00
_mutex.h Modify the critical section API as follows: 2001-12-18 00:27:18 +00:00
_posix.h
_sigset.h Use struct __ucontext in prototypes and associated functions instead of 2002-02-17 17:40:34 +00:00
_timespec.h
aac_ioctl.h Bring the aac driver *much* closer to style(9). 2001-09-05 20:43:02 +00:00
acct.h KSE Milestone 2 2001-09-12 08:38:13 +00:00
acl.h Remove bogus _POSIX_ACL_PATH_MAX definition. 2002-01-22 21:33:12 +00:00
agpio.h Fix an off-by-bit error in the AGP_MODE_[GS]ET_RATE() macros. 2001-11-21 08:40:23 +00:00
aio.h o Add missing synchronization (splnet()/splx()) in aio_free_entry(). 2002-01-06 21:03:39 +00:00
assym.h
ata.h Update header. 2002-03-04 21:08:35 +00:00
bio.h Augment struct bio for GEOM. 2002-03-11 08:20:22 +00:00
bitstring.h
blist.h
buf.h * Move bswlist declaration and initialization from kern/vfs_bio.c to 2002-03-05 18:20:58 +00:00
bus_dma.h - Moved the bus_dma declarations from bus_{at386,pc98}.h into bus_dma.h. 2001-10-06 16:27:21 +00:00
bus_private.h Style(9) 2001-09-05 01:06:28 +00:00
bus.h Add a generic __BUS_ACCESSOR macro to construct ivar accessor functions, 2001-12-21 21:45:09 +00:00
callout.h style(9) the structure definitions. 2001-09-05 01:22:14 +00:00
capability.h Update copyrights to include Thomas Moestl. 2001-11-05 15:36:24 +00:00
ccdvar.h Fix some signed/unsigned integer confusion, and add bounds checking of 2001-09-10 11:28:07 +00:00
cdefs.h Back out rev 1.48. The problem is with a bogus __attribute__ in stdio.h. 2001-12-04 01:29:54 +00:00
cdio.h style(9) the structure definitions. 2001-09-05 01:22:14 +00:00
cdrio.h Update header. 2002-03-04 21:08:35 +00:00
chio.h
clist.h
condvar.h KSE Milestone 2 2001-09-12 08:38:13 +00:00
conf.h Make the proposed name arg to dev_stdclone() const. 2002-03-10 10:50:05 +00:00
cons.h Add new boot flag to i386 boot: -p. 2001-12-10 20:02:22 +00:00
consio.h Refine cursor type/shape control escape sequences and 2001-08-02 08:30:40 +00:00
copyright.h Welcome 2002. Happy new year. 2002-01-01 09:20:52 +00:00
ctype.h
dataacq.h
device_port.h
devicestat.h Export the head structure for the device statistics STAILQ in 2001-08-04 18:02:47 +00:00
digiio.h
dir.h
dirent.h
disk.h Add a field to struct disk for GEOM 2002-03-11 08:17:40 +00:00
disklabel.h LABELOFFSET is 128 for sparc64. 2002-03-13 03:17:29 +00:00
diskmbr.h LABELOFFSET is 128 for sparc64. 2002-03-13 03:17:29 +00:00
diskpc98.h LABELOFFSET is 128 for sparc64. 2002-03-13 03:17:29 +00:00
diskslice.h style(9) the structure definitions. 2001-09-05 01:22:14 +00:00
dkstat.h
dmap.h
domain.h Hopefully improve control message passing over Unix domain sockets. 2001-10-04 13:11:48 +00:00
dvdio.h Update header. 2002-03-04 21:08:35 +00:00
elf32.h
elf64.h
elf_common.h Catch up with common usage: 2001-09-08 22:59:30 +00:00
elf_generic.h
errno.h Add new errno ``ENOATTR''. 2002-03-07 15:13:44 +00:00
event.h Make AIO a loadable module. 2001-12-29 07:13:47 +00:00
eventhandler.h KSE Milestone 2 2001-09-12 08:38:13 +00:00
eventvar.h
exec.h
extattr.h Part I: Update extended attribute API and ABI: 2002-02-10 04:43:22 +00:00
fbio.h Add some definitions. Their actual support will be added 2001-08-02 11:17:38 +00:00
fcntl.h SMP Lock struct file, filedesc and the global file list. 2002-01-13 11:58:06 +00:00
fdcio.h Long promised major enhancement set for the floppy disk driver: 2001-12-15 19:09:04 +00:00
file.h Fix namespace pollution introduced in previous commit. 2002-02-23 21:14:43 +00:00
filedesc.h Lock struct pgrp, session and sigio. 2002-02-23 11:12:57 +00:00
filio.h
fnv_hash.h
gmon.h Reserved one of the spare fields in struct gmon to record the history 2002-02-21 05:52:49 +00:00
iconv.h Update to C99, s/__FUNCTION__/__func__/. 2001-12-10 05:58:28 +00:00
imgact_aout.h Add the following functions/macros to support byte order conversions and 2002-02-27 17:16:18 +00:00
imgact_elf.h KSE Milestone 2 2001-09-12 08:38:13 +00:00
imgact.h Return a more meaningful errno when the length of the interpreter 2001-11-28 03:26:58 +00:00
inflate.h
interrupt.h Change the preemption code for software interrupt thread schedules and 2002-01-05 08:47:13 +00:00
ioccom.h
ioctl_bt848.h
ioctl_compat.h
ioctl_meteor.h
ioctl.h Hide GCCisms in the non-GCC case. 2002-02-26 07:44:03 +00:00
ipc.h Eliminate semexit_hook using at_exit(9) and rm_at_exit(9). 2001-12-30 18:55:09 +00:00
jail.h Make getcredhostname() take a buffer and the buffer's size 2002-02-27 16:43:20 +00:00
joystick.h
kbio.h
kernel.h Rename SI_SUB_MUTEX to SI_SUB_MTX_POOL to make the name at all accurate. 2002-03-13 23:48:08 +00:00
kobj.h
kse.h Add the first shot at minimum KSE interface definitions. 2002-02-19 02:12:36 +00:00
kthread.h KSE Milestone 2 2001-09-12 08:38:13 +00:00
ktr.h Fix two typos, TR6() and ITR6() need to use CTR6(), not CTR5(). 2001-12-14 22:28:58 +00:00
ktrace.h
libkern.h Add a 'strvalid()' call to libkern. Given a character pointer, and 2002-02-18 00:37:03 +00:00
linedisc.h Make the proposed name arg to dev_stdclone() const. 2002-03-10 10:50:05 +00:00
link_aout.h style(9) the structure definitions. 2001-09-05 01:36:46 +00:00
link_elf.h style(9) the structure definitions. 2001-09-05 01:36:46 +00:00
linker_set.h
linker.h Fix a number of misspellings of "dependency" and "dependencies" in 2001-11-16 21:08:40 +00:00
lock.h Change the preemption code for software interrupt thread schedules and 2002-01-05 08:47:13 +00:00
lockf.h
lockmgr.h Change wmesg to const char * instead of char * 2002-03-05 17:45:12 +00:00
malloc.h Add realloc() and reallocf(), and make free(NULL, ...) acceptable. 2002-03-13 01:42:33 +00:00
mbuf.h Get rid of the twisted MFREE() macro entirely. 2002-02-05 02:00:56 +00:00
mchain.h Add the following functions/macros to support byte order conversions and 2002-02-27 17:16:18 +00:00
md4.h
md5.h
mdioctl.h Actually make use of the md_version field of 'struct mdio'. In order 2001-12-20 06:38:21 +00:00
memrange.h
mman.h Add INHERIT_XXX defines for minherit() system call. 2001-08-24 19:48:07 +00:00
module.h Fix syntax error, where this was not compile tested after style(9)'ing. 2002-03-01 07:05:45 +00:00
mount.h Move the mount of the root filesystem to happen in the init process before 2002-03-08 10:33:11 +00:00
mouse.h Spelling police: extention -> extension in a comment. 2001-07-05 08:52:40 +00:00
msg.h
msgbuf.h style(9) the structure definitions. 2001-09-05 01:22:14 +00:00
mtio.h Fix a typo in a comment field. 2002-01-21 11:10:32 +00:00
mutex.h Add kern_giant_ucred to instrument Giant around ucred related operations 2002-02-18 17:51:47 +00:00
namei.h This patch adds the "LOCKSHARED" option to namei which causes it to only acquire shared locks on leafs. 2002-03-12 04:00:11 +00:00
nlist_aout.h
param.h o Don't require long long support in bswap64() functions. 2002-03-09 21:02:16 +00:00
pciio.h style(9) the structure definitions. 2001-09-05 01:22:14 +00:00
pcpu.h revert last commit temporarily due to whining on the lists. 2002-02-26 20:33:41 +00:00
pioctl.h Add the as-yet-unused S_ALLSTOPS which I forgot in previous commit. 2001-11-02 23:15:13 +00:00
pipe.h First rev at making pipe(2) pipe's MPsafe. 2002-02-27 07:35:59 +00:00
poll.h Fix select on fifos. 2002-01-14 22:03:48 +00:00
posix4.h KSE Milestone 2 2001-09-12 08:38:13 +00:00
power.h Add generalized power profile code. 2002-03-04 18:46:13 +00:00
priority.h style(9) the structure definitions. 2001-09-05 01:22:14 +00:00
proc.h Fixes to make select/poll mpsafe. 2002-03-14 01:32:30 +00:00
procfs.h Use explicit sizes for the prpsinfo command length string so that 2001-08-16 08:35:51 +00:00
protosw.h KSE Milestone 2 2001-09-12 08:38:13 +00:00
ptio.h
ptrace.h Declare struct uio so consumers don't have to #include <sys/uio.h> unless 2001-11-03 03:17:16 +00:00
queue.h Correct a comment that should have been updated in rev 1.43, when 2001-12-11 11:49:58 +00:00
random.h Provide infrastructure for harvesting SWI entropy. 2002-03-03 20:09:42 +00:00
reboot.h Add new boot flag to i386 boot: -p. 2001-12-10 20:02:22 +00:00
regression.h
resource.h KSE Milestone 2 2001-09-12 08:38:13 +00:00
resourcevar.h remove trailing semi-colons from macro definitions. 2002-02-27 02:02:13 +00:00
rman.h Add a rman_reserve_resource_bound() function that takes an additional 2001-12-21 21:40:55 +00:00
rtprio.h In a threaded world, differnt priorirites become properties of 2002-02-11 20:37:54 +00:00
runq.h KSE Milestone 2 2001-09-12 08:38:13 +00:00
sbuf.h Replace spaces after #defines with tabs; this makes all #defines 2002-01-09 07:29:28 +00:00
select.h
selinfo.h Fixes to make select/poll mpsafe. 2002-03-14 01:32:30 +00:00
sem.h Fix SysV Semaphore Handling. 2001-10-11 08:15:14 +00:00
sema.h Added used includes. <sys/_lock.h> is a prerequisite for <sys/_mutex.h>, 2001-10-10 10:26:07 +00:00
semaphore.h
shm.h Introduce [IPC|SHM]_[INFO|STAT] to shmctl to make 2001-10-28 09:29:10 +00:00
signal.h Use struct __ucontext in prototypes and associated functions instead of 2002-02-17 17:40:34 +00:00
signalvar.h Use struct __ucontext in prototypes and associated functions instead of 2002-02-17 17:40:34 +00:00
smp.h Add needed includes of machine/smp.h, remove nested include in sys/smp.h 2002-03-07 04:43:51 +00:00
snoop.h Move the kernel stuff out of snoop.h. It was only there because some 2001-07-25 14:47:56 +00:00
socket.h Zero functional difference; make some integer constants unsigned, as 2002-02-03 11:36:59 +00:00
socketvar.h Add parens around macro args. 2002-01-13 23:51:47 +00:00
sockio.h Style consistency fix for MAC ioctls added previously. 2002-02-10 16:55:35 +00:00
soundcard.h Correct the URL to the Hacker's Guide to Voxware. 2001-08-21 07:39:47 +00:00
stat.h Resurrect one of the easiest changes from my big include files roll-up 2002-02-15 22:15:39 +00:00
stdint.h o Add new header <sys/stdint.h>. 2001-11-02 18:05:43 +00:00
sx.h Create a mutex pool API for short term leaf mutexes. 2001-11-13 21:55:13 +00:00
syscall.h Part II: update various mechanically generated files to allow for new 2002-03-05 16:13:01 +00:00
syscall.mk Part II: update various mechanically generated files to allow for new 2002-03-05 16:13:01 +00:00
sysctl.h Move sysctl debug.sizeof into sys/sysctl.h where it belongs. 2002-03-05 13:56:58 +00:00
sysent.h Make AIO a loadable module. 2001-12-29 07:13:47 +00:00
syslimits.h
syslog.h
sysproto.h Part II: update various mechanically generated files to allow for new 2002-03-05 16:13:01 +00:00
systm.h Fixes to make select/poll mpsafe. 2002-03-14 01:32:30 +00:00
taskqueue.h Revert the reindentation of struct task's definition from rev 1.4. 2001-10-28 16:19:34 +00:00
termios.h
time.h Fix world breakage (compiling libstdc++): 2002-02-08 03:55:37 +00:00
timeb.h Add missing declaration of ftime. 2001-12-03 15:07:54 +00:00
timepps.h
timers.h
times.h
timespec.h
timetc.h Add a generation number to timecounters and spin if it changes under 2002-02-24 20:04:07 +00:00
timex.h
tty.h Fixed style bugs (indentation errors, missing punctuation, and unsorting) 2001-10-04 07:25:16 +00:00
ttychars.h
ttycom.h
ttydefaults.h
ttydev.h
types.h Rather than include namespace pollution in <grp.h> in order to declare 2002-02-26 19:43:03 +00:00
ucontext.h Add getcontext, setcontext, makecontext, and swapcontext prototypes 2002-01-10 02:44:30 +00:00
ucred.h Introduce a version field to `struct xucred' in place of one of the 2002-02-27 04:45:37 +00:00
uio.h Remove extraneous semicolon. 2001-10-04 10:39:56 +00:00
un.h Hopefully improve control message passing over Unix domain sockets. 2001-10-04 13:11:48 +00:00
unistd.h Make RFPPWAIT a kernel-only flag. Programs desiring this feature should 2001-12-19 00:55:13 +00:00
unpcb.h style(9) the structure definitions. 2001-09-05 01:22:14 +00:00
user.h Don't depend on ucred.h to include sys/queue.h for us. 2002-03-11 02:37:34 +00:00
utsname.h
vmmeter.h
vnioctl.h
vnode.h Make v_addpollinfo() visible and non-inline. 2002-02-18 16:18:02 +00:00
wait.h
xrpuio.h