1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-12-29 12:03:03 +00:00
freebsd/sys/kern
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
..
bus_if.m Alter the return value and arguments of the GET_RESOURCE_LIST bus method. 2000-11-28 06:49:15 +00:00
device_if.m * Factor out the object system from new-bus so that it can be used by 2000-04-08 14:17:18 +00:00
genassym.sh Allow one to specify the AWK used in the environment(commandline). 2002-02-11 03:54:30 +00:00
imgact_aout.c Simple p_ucred -> td_ucred changes to start using the per-thread ucred 2002-02-27 18:32:23 +00:00
imgact_elf.c Simple p_ucred -> td_ucred changes to start using the per-thread ucred 2002-02-27 18:32:23 +00:00
imgact_gzip.c Make MAXTSIZ, DFLDSIZ, MAXDSIZ, DFLSSIZ, MAXSSIZ, SGROWSIZ loader 2001-10-10 23:06:54 +00:00
imgact_shell.c Return a more meaningful errno when the length of the interpreter 2001-11-28 03:26:58 +00:00
inflate.c Change #ifdef KERNEL to #ifdef _KERNEL in the public headers. "KERNEL" 1999-12-29 05:07:58 +00:00
init_main.c Move the mount of the root filesystem to happen in the init process before 2002-03-08 10:33:11 +00:00
init_sysent.c Part II: update various mechanically generated files to allow for new 2002-03-05 16:13:01 +00:00
kern_acct.c Simple p_ucred -> td_ucred changes to start using the per-thread ucred 2002-02-27 18:32:23 +00:00
kern_acl.c Simple p_ucred -> td_ucred changes to start using the per-thread ucred 2002-02-27 18:32:23 +00:00
kern_cap.c - Attempt to help declutter kern. sysctl by moving security out from 2002-01-16 06:55:30 +00:00
kern_clock.c MFS: synchronize the code with the version in -stable, specifically: 2002-02-11 23:56:18 +00:00
kern_condvar.c In a threaded world, differnt priorirites become properties of 2002-02-11 20:37:54 +00:00
kern_conf.c Make the proposed name arg to dev_stdclone() const. 2002-03-10 10:50:05 +00:00
kern_descrip.c Simple p_ucred -> td_ucred changes to start using the per-thread ucred 2002-02-27 18:32:23 +00:00
kern_environment.c Fix an inverted test csae. Success of getenv() is determined by a return 2001-10-25 17:22:31 +00:00
kern_event.c Add entry for EVFILT_NETDEV, which was inadverdently omitted back in Sept. 2002-01-24 17:20:55 +00:00
kern_exec.c Remove now unused struct proc *p. 2002-02-27 20:57:57 +00:00
kern_exit.c Do not lock the pgrpsess_lock exclusively across ttywait(). 2002-03-11 07:51:08 +00:00
kern_fork.c revert last commit temporarily due to whining on the lists. 2002-02-26 20:33:41 +00:00
kern_idle.c Pre-KSE/M3 commit. 2002-02-07 20:58:47 +00:00
kern_intr.c Make the DEVICE_POLLING code compile with -Werror and in LINT 2002-03-09 08:02:52 +00:00
kern_jail.c Make getcredhostname() take a buffer and the buffer's size 2002-02-27 16:43:20 +00:00
kern_kthread.c Fix a couple of style bugs introduced (or touched by) previous commit. 2002-02-07 23:06:26 +00:00
kern_ktr.c Read KTR_CPU into a temporary variable so that we use a consistent value 2002-03-08 18:55:59 +00:00
kern_ktrace.c Add a comment about an unlocked access to p_ucred that will go away in 2002-02-27 19:10:50 +00:00
kern_linker.c Don't assign strcmp to a variable called err and then compare it 2002-03-10 23:12:43 +00:00
kern_lock.c Change wmesg to const char * instead of char * 2002-03-05 17:45:12 +00:00
kern_lockf.c make LOCKF_DEBUG kernel option work (sorta) 2001-12-02 12:47:25 +00:00
kern_malloc.c Add realloc() and reallocf(), and make free(NULL, ...) acceptable. 2002-03-13 01:42:33 +00:00
kern_mib.c Simple p_ucred -> td_ucred changes to start using the per-thread ucred 2002-02-27 18:32:23 +00:00
kern_module.c Fix a warning. Do not assume pointer == long. 2002-02-26 00:55:27 +00:00
kern_mtxpool.c Rename SI_SUB_MUTEX to SI_SUB_MTX_POOL to make the name at all accurate. 2002-03-13 23:48:08 +00:00
kern_mutex.c Tidy up some unused variables 2002-02-20 21:25:44 +00:00
kern_ntptime.c Revise timercounters to use binary fixed point format internally. 2002-02-07 21:21:55 +00:00
kern_physio.c Separate the struct bio related stuff out of <sys/buf.h> into 2000-05-05 09:59:14 +00:00
kern_poll.c Make the DEVICE_POLLING code compile with -Werror and in LINT 2002-03-09 08:02:52 +00:00
kern_proc.c Lock struct pgrp, session and sigio. 2002-02-23 11:12:57 +00:00
kern_prot.c Stop abusing the pgrpsess_lock. 2002-03-11 07:53:13 +00:00
kern_random.c Load the current timecounter into tc. The timecounter global can change 2002-02-18 19:49:30 +00:00
kern_resource.c Cast the variable, not the constant to 64 bits. 2002-02-26 09:27:39 +00:00
kern_sema.c Repeat after me -- "Use of ANSI string concatenation can be bad." 2001-12-10 05:40:12 +00:00
kern_shutdown.c Add needed includes of machine/smp.h, remove nested include in sys/smp.h 2002-03-07 04:43:51 +00:00
kern_sig.c Fix warning in !SMP case. 2002-02-26 09:21:52 +00:00
kern_subr.c In a threaded world, differnt priorirites become properties of 2002-02-11 20:37:54 +00:00
kern_switch.c Rename runq_find() to runq_findproc(), and hide it behind #ifdef DIAGNOSTIC, 2002-03-06 15:34:07 +00:00
kern_sx.c Invert the test of sx_xholder for SX_LOCKED. We need to warn if a 2002-01-18 09:21:15 +00:00
kern_synch.c Convert p->p_runtime and PCPU(switchtime) to bintime format. 2002-02-22 13:32:01 +00:00
kern_syscalls.c KSE Milestone 2 2001-09-12 08:38:13 +00:00
kern_sysctl.c Simple p_ucred -> td_ucred changes to start using the per-thread ucred 2002-02-27 18:32:23 +00:00
kern_tc.c Remove unused variable. 2002-02-26 09:16:27 +00:00
kern_time.c Take the common case of gettimeofday(&tv, NULL) out from under Giant. 2002-02-18 08:40:28 +00:00
kern_timeout.c Move most of the kernel submap initialization code, including the 2001-08-22 04:07:27 +00:00
kern_xxx.c KSE Milestone 2 2001-09-12 08:38:13 +00:00
ksched.c In a threaded world, differnt priorirites become properties of 2002-02-11 20:37:54 +00:00
link_aout.c Simple p_ucred -> td_ucred changes to start using the per-thread ucred 2002-02-27 18:32:23 +00:00
link_elf_obj.c Simple p_ucred -> td_ucred changes to start using the per-thread ucred 2002-02-27 18:32:23 +00:00
link_elf.c Simple p_ucred -> td_ucred changes to start using the per-thread ucred 2002-02-27 18:32:23 +00:00
linker_if.m Add the sysctl "kern.function_list", which currently exports all 2001-10-30 15:21:45 +00:00
Make.tags.inc Don't hardcode /sys when making tags, instead use ${.CURDIR}/.. this 2002-02-27 10:07:15 +00:00
Makefile Don't generate <sys/syscalls-hide.h> it has never had any users anywhere in 2001-10-13 09:17:49 +00:00
makeobjops.pl Switch warnings and strict back on again in a way that's compatible 2001-11-16 02:02:42 +00:00
makesyscalls.sh Oops, fix previous commit to not generate a C comment in syscall.mk. 2002-01-30 15:12:12 +00:00
md4c.c Import kernel part of SMB/CIFS requester. 2001-04-10 07:59:06 +00:00
md5c.c Add ia64 support. 2000-09-29 13:36:47 +00:00
p1003_1b.c Pre-KSE/M3 commit. 2002-02-07 20:58:47 +00:00
posix4_mib.c Add $FreeBSD$. 2000-04-22 15:13:06 +00:00
subr_acl_posix1e.c Simple p_ucred -> td_ucred changes to start using the per-thread ucred 2002-02-27 18:32:23 +00:00
subr_autoconf.c Back out the previous change to the queue(3) interface. 2000-05-26 02:09:24 +00:00
subr_blist.c With Alfred's permission, remove vm_mtx in favor of a fine-grained approach 2001-07-04 16:20:28 +00:00
subr_bus.c Don't (blindly) truncate the unit number to 4 digits when formatting the 2002-03-06 11:34:02 +00:00
subr_clist.c Make cblock_alloc_cblocks() spell its own name 2001-03-27 10:21:26 +00:00
subr_devstat.c GC: BIO_ORDERED, various infrastructure dealing with BIO_ORDERED. 2002-02-22 09:26:35 +00:00
subr_disk.c Make the disk_clone() routine more robust for abuse. 2002-03-11 08:08:02 +00:00
subr_disklabel.c GC: BIO_ORDERED, various infrastructure dealing with BIO_ORDERED. 2002-02-22 09:26:35 +00:00
subr_diskmbr.c Wrap Dangerously Dedicated printf under if (bootverbose) 2001-12-11 05:35:43 +00:00
subr_diskslice.c Delete "notyet" code before it becomes "ohh no" code. 2002-03-09 20:11:25 +00:00
subr_eventhandler.c KSE Milestone 2 2001-09-12 08:38:13 +00:00
subr_hints.c Fix a fatal type mismatch (char *static_env; vs char static_env[]). 2001-09-17 21:27:41 +00:00
subr_kobj.c Convert more malloc+bzero to malloc+M_ZERO. 2000-12-08 21:51:06 +00:00
subr_log.c Use the passed in thread to selrecord() instead of curthread. 2001-09-21 22:46:54 +00:00
subr_mbuf.c Fix bug in mb_alloc that made systems configured with 2002-03-03 22:10:04 +00:00
subr_mchain.c Add support for iovcnt greater than 1. This should resolve problems 2002-02-21 16:23:38 +00:00
subr_module.c Preceed/preceeding are not english words. Use precede and preceding. 2001-02-18 10:43:53 +00:00
subr_param.c Unconditionally limit maxproc so that it is not possible 2002-03-07 04:50:36 +00:00
subr_pcpu.c Add a per-cpu variable, cpumask, the preshifted equivalent of 1 << cpuid. 2002-01-05 09:35:50 +00:00
subr_power.c Add generalized power profile code. 2002-03-04 18:46:13 +00:00
subr_prf.c Stop abusing the pgrpsess_lock. 2002-03-11 07:53:13 +00:00
subr_prof.c - Change all callers of addupc_task() to check PS_PROFIL explicitly and 2001-12-18 09:06:10 +00:00
subr_rman.c Add a rman_reserve_resource_bound() function that takes an additional 2001-12-21 21:40:55 +00:00
subr_sbuf.c Yet a bug with extensible sbufs being marked as OVERFLOWED. This time 2002-01-24 20:57:56 +00:00
subr_scanf.c Change the prototype of the strto* routines to make the second 1999-11-24 01:03:08 +00:00
subr_smp.c Add needed includes of machine/smp.h, remove nested include in sys/smp.h 2002-03-07 04:43:51 +00:00
subr_taskqueue.c Change the preemption code for software interrupt thread schedules and 2002-01-05 08:47:13 +00:00
subr_trap.c Make this compile. 2002-02-23 01:42:13 +00:00
subr_turnstile.c Tidy up some unused variables 2002-02-20 21:25:44 +00:00
subr_witness.c - Use a MI critical section in witness_sleep() and witness_list() as they 2002-03-08 18:57:57 +00:00
subr_xxx.c GC the unused einval() 2002-02-10 22:07:41 +00:00
sys_generic.c Fixes to make select/poll mpsafe. 2002-03-14 01:32:30 +00:00
sys_pipe.c Don't deref NULL mutex pointer when pipeclose()'ing a pipe that is not 2002-03-09 22:06:31 +00:00
sys_process.c Back out all the pmap related stuff I've touched over the last few days. 2002-02-27 09:51:33 +00:00
sys_socket.c SMP Lock struct file, filedesc and the global file list. 2002-01-13 11:58:06 +00:00
syscalls.c Part II: update various mechanically generated files to allow for new 2002-03-05 16:13:01 +00:00
syscalls.master Reserve system call numbers for the MAC framework. This will prevent 2002-03-05 16:11:11 +00:00
sysv_ipc.c Simple p_ucred -> td_ucred changes to start using the per-thread ucred 2002-02-27 18:32:23 +00:00
sysv_msg.c - Use td_ucred for jail checks. 2002-03-05 18:57:36 +00:00
sysv_sem.c Fix a typo, unbreak the world. 2002-03-06 12:28:51 +00:00
sysv_shm.c - Use td_ucred for jail checks. 2002-03-05 18:57:36 +00:00
tty_compat.c
tty_conf.c KSE Milestone 2 2001-09-12 08:38:13 +00:00
tty_cons.c Simple p_ucred -> td_ucred changes to start using the per-thread ucred 2002-02-27 18:32:23 +00:00
tty_pty.c Fix lock leakage and late unlock. 2002-03-02 12:42:24 +00:00
tty_subr.c Make cblock_alloc_cblocks() spell its own name 2001-03-27 10:21:26 +00:00
tty_tty.c Simple p_ucred -> td_ucred changes to start using the per-thread ucred 2002-02-27 18:32:23 +00:00
tty.c Fixes to make select/poll mpsafe. 2002-03-14 01:32:30 +00:00
uipc_accf.c Revert the last bits of my bogus move of NMBCLUSTERS 2001-06-01 21:47:34 +00:00
uipc_domain.c Update the comment about System initialization to reflect the use of 2001-12-08 04:20:54 +00:00
uipc_mbuf2.c Sync with recent KAME. 2001-06-11 12:39:29 +00:00
uipc_mbuf.c Get rid of the twisted MFREE() macro entirely. 2002-02-05 02:00:56 +00:00
uipc_proto.c Implement a LOCAL_PEERCRED socket option which returns a 2001-08-17 22:01:18 +00:00
uipc_sockbuf.c Get rid of the twisted MFREE() macro entirely. 2002-02-05 02:00:56 +00:00
uipc_socket2.c Get rid of the twisted MFREE() macro entirely. 2002-02-05 02:00:56 +00:00
uipc_socket.c In sosend(), enforce the socket buffer limits regardless of whether 2002-02-28 11:22:40 +00:00
uipc_syscalls.c Simple p_ucred -> td_ucred changes to start using the per-thread ucred 2002-02-27 18:32:23 +00:00
uipc_usrreq.c - Change unp_listen() to accept a thread rather than a proc as its second 2002-02-27 19:14:01 +00:00
vfs_acl.c Simple p_ucred -> td_ucred changes to start using the per-thread ucred 2002-02-27 18:32:23 +00:00
vfs_aio.c Document all functions, global and static variables, and sysctls. 2002-03-05 15:38:49 +00:00
vfs_bio.c * Move bswlist declaration and initialization from kern/vfs_bio.c to 2002-03-05 18:20:58 +00:00
vfs_cache.c 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
vfs_cluster.c Document all functions, global and static variables, and sysctls. 2002-03-05 15:38:49 +00:00
vfs_conf.c Move the mount of the root filesystem to happen in the init process before 2002-03-08 10:33:11 +00:00
vfs_default.c Document all functions, global and static variables, and sysctls. 2002-03-05 15:38:49 +00:00
vfs_export.c Check the version of ex_anon (a `struct xucred') before using it to 2002-03-03 06:07:57 +00:00
vfs_extattr.c 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
vfs_init.c Document all functions, global and static variables, and sysctls. 2002-03-05 15:38:49 +00:00
vfs_lookup.c - Change namei() to use td_ucred instead of p_ucred. 2002-02-27 19:15:29 +00:00
vfs_mount.c Move the mount of the root filesystem to happen in the init process before 2002-03-08 10:33:11 +00:00
vfs_subr.c Three p_ucred -> td_ucred's missed in jhb's earlier pass; all appear to 2002-03-05 19:45:45 +00:00
vfs_syscalls.c 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
vfs_vnops.c 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
vnode_if.pl Throw the $FreeBSD$s back in, properly escaping them. 2002-01-04 05:27:47 +00:00
vnode_if.src Per discussion at BSDCon, note that the vop_getattr locking protocol 2002-02-18 00:22:57 +00:00