diff options
author | alfred <alfred@FreeBSD.org> | 2002-03-14 01:32:30 +0000 |
---|---|---|
committer | alfred <alfred@FreeBSD.org> | 2002-03-14 01:32:30 +0000 |
commit | 2c16fbdd2a425c2dfbea6385b784ec483e79668c (patch) | |
tree | 9215eb853bc269c9e5e98e1cf9aeb77712af947d /sys/isa/psm.c | |
parent | ebb034597acc5aa4fd82382f85036e5a1e2cb2fa (diff) | |
download | FreeBSD-src-2c16fbdd2a425c2dfbea6385b784ec483e79668c.zip FreeBSD-src-2c16fbdd2a425c2dfbea6385b784ec483e79668c.tar.gz |
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
Diffstat (limited to 'sys/isa/psm.c')
-rw-r--r-- | sys/isa/psm.c | 2 |
1 files changed, 0 insertions, 2 deletions
diff --git a/sys/isa/psm.c b/sys/isa/psm.c index d43207e..6be30d4 100644 --- a/sys/isa/psm.c +++ b/sys/isa/psm.c @@ -1314,8 +1314,6 @@ psmopen(dev_t dev, int flag, int fmt, struct thread *td) device_busy(devclass_get_device(psm_devclass, unit)); /* Initialize state */ - sc->rsel.si_flags = 0; - sc->rsel.si_pid = 0; sc->mode.level = sc->dflt_mode.level; sc->mode.protocol = sc->dflt_mode.protocol; sc->watchdog = FALSE; |