summaryrefslogtreecommitdiffstats
path: root/sys/kern/sys_generic.c
Commit message (Collapse)AuthorAgeFilesLines
...
* Fixes to make select/poll mpsafe.alfred2002-03-141-114/+112
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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
* Remove __Palfred2002-03-091-6/+6
|
* Remove unused variables in select(2) from previous delta.alfred2002-01-301-2/+1
| | | | Pointed out by: bde
* Attempt to fixup select(2) and poll(2), this should fix some races withalfred2002-01-291-122/+9
| | | | | | | | | | | | | | | | | | | other threads as well as speed up the interfaces. To fix the race and accomplish the speedup, remove selholddrop and pollholddrop. The entire concept is somewhat bogus because holding the individual struct file pointers offers us no guarantees that another thread context won't close it on us thereby removing our access to our own reference. Selholddrop and pollholddrop also would do multiple locks and unlocks of mutexes _per-file_ in the fd arrays to be scanned, this needed to be sped up. Instead of using selholddrop and pollholddrop, simply hold the filedesc lock over the selscan and pollscan functions. This should protect us against close(2)'s on the files as reduce the multiple lock/unlock pairs per fd into a single lock over the filedesc.
* make pread use fget_read instead of holdfp.alfred2002-01-231-27/+2
|
* undo a bit of the Giant pushdown.alfred2002-01-191-5/+9
| | | | | | fdrop isn't SMP safe as it may call into the file's close routine which definetly is not SMP safe right now, so we hold Giant over calls to fdrop now.
* Fix giant handling in pwrite(2), I forgot to release it when finishingalfred2002-01-161-1/+2
| | | | the syscall.
* Replace ffind_* with fget calls.alfred2002-01-141-6/+4
| | | | | | | | Make fget MPsafe. Make fgetvp and fgetsock use the fget subsystem to reduce code bloat. Push giant down in fpathconf().
* SMP Lock struct file, filedesc and the global file list.alfred2002-01-131-37/+96
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Seigo Tanimura (tanimura) posted the initial delta. I've polished it quite a bit reducing the need for locking and adapting it for KSE. Locks: 1 mutex in each filedesc protects all the fields. protects "struct file" initialization, while a struct file is being changed from &badfileops -> &pipeops or something the filedesc should be locked. 1 mutex in each struct file protects the refcount fields. doesn't protect anything else. the flags used for garbage collection have been moved to f_gcflag which was the FILLER short, this doesn't need locking because the garbage collection is a single threaded container. could likely be made to use a pool mutex. 1 sx lock for the global filelist. struct file * fhold(struct file *fp); /* increments reference count on a file */ struct file * fhold_locked(struct file *fp); /* like fhold but expects file to locked */ struct file * ffind_hold(struct thread *, int fd); /* finds the struct file in thread, adds one reference and returns it unlocked */ struct file * ffind_lock(struct thread *, int fd); /* ffind_hold, but returns file locked */ I still have to smp-safe the fget cruft, I'll get to that asap.
* remove holdfp()dillon2001-11-141-56/+32
| | | | | | | | | | | | | | | | | | | Replace uses of holdfp() with fget*() or fgetvp*() calls as appropriate introduce fget(), fget_read(), fget_write() - these functions will take a thread and file descriptor and return a file pointer with its ref count bumped. introduce fgetvp(), fgetvp_read(), fgetvp_write() - these functions will take a thread and file descriptor and return a vref()'d vnode. *_read() requires that the file pointer be FREAD, *_write that it be FWRITE. This continues the cleanup of struct filedesc and struct file access routines which, when are all through with it, will allow us to then make the API calls MP safe and be able to move Giant down into the fo_* functions.
* The P_SELECT flag was moved from p->p_flag to td->td_flags, but p_flagjhb2001-09-211-2/+20
| | | | | | | | | was locked by the proc lock and td_flags is locked by the sched_lock. The places that read, set, and cleared TDF_SELECT weren't updated, so they read and modified td_flags w/o holding the sched_lock, meaning that they could corrupt the per-thread flags field. As an immediate band-aid, grab sched_lock while reading and manipulating td_flags in relation to TDF_SELECT. This will probably be cleaned up some later on.
* KSE Milestone 2julian2001-09-121-153/+177
| | | | | | | | | | | | | | Note ALL MODULES MUST BE RECOMPILED make the kernel aware that there are smaller units of scheduling than the process. (but only allow one thread per process at this time). This is functionally equivalent to teh previousl -current except that there is a thread associated with each process. Sorry john! (your next MFC will be a doosie!) Reviewed by: peter@freebsd.org, dillon@freebsd.org X-MFC after: ha ha ha ha
* Giant Pushdown:dillon2001-09-011-40/+120
| | | | | read() pread() readv() write () pwrite() writev() ioctl() select () poll() openbsd_poll()
* Back out scanning file descriptors with holding a process lock.tanimura2001-05-151-2/+34
| | | | | selrecord() requires allproc sx in pfind(), resulting in lock order reversal between allproc and a process lock.
* - Convert msleep(9) in select(2) and poll(2) to cv_*wait*(9).tanimura2001-05-141-40/+131
| | | | | | | | | | | | | - Since polling should not involve sleeping, keep holding a process lock upon scanning file descriptors. - Hold a reference to every file descriptor prior to entering polling loop in order to avoid lock order reversal between lockmgr and p_mtx upon calling fdrop() in fo_poll(). (NOTE: this work has not been done for netncp and netsmb yet because a socket itself has no reference counts.) Reviewed by: jhb
* Change the pfind() and zpfind() functions to lock the process that theyjhb2001-04-241-6/+5
| | | | | | find before releasing the allproc lock and returning. Reviewed by: -smp, dfr, jake
* Grab the process lock while calling psignal and before calling psignal.jhb2001-03-071-2/+8
|
* Correctly declare variables as u_int rather than doing typecasts.jlemon2001-02-271-7/+7
| | | | | | Kill some register declarations while I'm here. Submitted by: bde (1)
* Cast nfds to u_int before range checking it in order to catch negativejlemon2001-02-271-1/+2
| | | | | | values. PR: 25393
* poll(2) array limits (take 2) - after some input from bde.peter2001-02-091-8/+7
|
* Change and clean the mutex lock interface.bmilekic2001-02-091-6/+6
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | mtx_enter(lock, type) becomes: mtx_lock(lock) for sleep locks (MTX_DEF-initialized locks) mtx_lock_spin(lock) for spin locks (MTX_SPIN-initialized) similarily, for releasing a lock, we now have: mtx_unlock(lock) for MTX_DEF and mtx_unlock_spin(lock) for MTX_SPIN. We change the caller interface for the two different types of locks because the semantics are entirely different for each case, and this makes it explicitly clear and, at the same time, it rids us of the extra `type' argument. The enter->lock and exit->unlock change has been made with the idea that we're "locking data" and not "entering locked code" in mind. Further, remove all additional "flags" previously passed to the lock acquire/release routines with the exception of two: MTX_QUIET and MTX_NOSWITCH The functionality of these flags is preserved and they can be passed to the lock/unlock routines by calling the corresponding wrappers: mtx_{lock, unlock}_flags(lock, flag(s)) and mtx_{lock, unlock}_spin_flags(lock, flag(s)) for MTX_DEF and MTX_SPIN locks, respectively. Re-inline some lock acq/rel code; in the sleep lock case, we only inline the _obtain_lock()s in order to ensure that the inlined code fits into a cache line. In the spin lock case, we inline recursion and actually only perform a function call if we need to spin. This change has been made with the idea that we generally tend to avoid spin locks and that also the spin locks that we do have and are heavily used (i.e. sched_lock) do recurse, and therefore in an effort to reduce function call overhead for some architectures (such as alpha), we inline recursion for this case. Create a new malloc type for the witness code and retire from using the M_DEV type. The new type is called M_WITNESS and is only declared if WITNESS is enabled. Begin cleaning up some machdep/mutex.h code - specifically updated the "optimized" inlined code in alpha/mutex.h and wrote MTX_LOCK_SPIN and MTX_UNLOCK_SPIN asm macros for the i386/mutex.h as we presently need those. Finally, caught up to the interface changes in all sys code. Contributors: jake, jhb, jasone (in no particular order)
* The code I picked up from NetBSD in '97 had a nasty bug. It limitedpeter2001-02-071-7/+15
| | | | | | | the index of the pollfd array to the number of fd's currently open, not the maximum number of fd's. ie: if you had 0,1,2 open, you could not use pollfd slots higher than 20. The specs say we only have to support OPEN_MAX [64] entries but we allow way more than that.
* - Catch up to proc flag changes.jhb2001-01-241-14/+35
| | | | - Add proc locking for selwakeup() and selrecord().
* select() DKI is now in <sys/selinfo.h>.wollman2001-01-091-0/+1
|
* Only call bwillwrite() for vnodes. Do not penalize devices or pipes.dillon2000-12-071-1/+2
|
* Add necessary bwillwrite() in writev() entry point.dillon2000-12-061-0/+1
| | | | | | Deal with excessive dirty buffers when msync() syncs non-contiguous dirty buffers by checking for the case in UFS *before* checking for clusterability.
* only call bwillwrite() to stall on IO when dealing with VNODEs otherwisealfred2000-11-301-1/+2
| | | | we will stall on non-disk IO for things like fifos and sockets
* Protect p_wchan with sched_lock in selwakeup().jlemon2000-11-211-0/+2
|
* This patchset fixes a large number of file descriptor race conditions.dillon2000-11-181-26/+60
| | | | | | | | | | | | Pre-rfork code assumed inherent locking of a process's file descriptor array. However, with the advent of rfork() the file descriptor table could be shared between processes. This patch closes over a dozen serious race conditions related to one thread manipulating the table (e.g. closing or dup()ing a descriptor) while another is blocked in an open(), close(), fcntl(), read(), write(), etc... PR: kern/11629 Discussed with: Alexander Viro <viro@math.psu.edu>
* Fix a warning that has been annoying me for some time:peter2000-07-281-1/+1
| | | | | | | "kern/sys_generic.c:358: warning: cast discards qualifiers from pointer target type" The idea for using the uintptr_t intermediate cast for de-constifying a pointer was hinted at by bde some time ago.
* Distinguish between whether ktraceing was enabled before an IOgreen2000-07-271-2/+6
| | | | | | operation or after it. If the ktrace operation was enabled while the process was blocked doing IO, the race would allow it to pass down invalid (uninitialized) data and panic later down the call stack.
* For infinite timeouts, set both the tv_sec and tv_usec fields to zero injhb2000-07-131-2/+6
| | | | | | poll() and select(). Noticed by: Wesley Morgan <morganw@chemicals.tacorp.com>
* Fix a very obscure bug in select() and poll() where the timeout wouldjhb2000-07-121-2/+2
| | | | | | never expire if poll() or select() was called before the system had been in multiuser for 1 second. This was caused by only checking to see if tv_sec was zero rather than checking both tv_sec and tv_usec.
* Remove two micro-pessimizations I made. Bruce is teaching me well :)green2000-07-071-2/+2
| | | | | KTRPOINT(p, KTR_GENIO) is more uncommon than error == 0, so it should be first in the && statement.
* Modify ktrace's general I/O tracing, ktrgenio(), to use a struct uio *green2000-07-021-15/+36
| | | | | | | | | | | | | instead of a struct iovec * array and int len. Get rid of stupidly trying to allocate all of the memory and copyin()ing the entire iovec[], and instead just do the proper VOP_WRITE() in ktrwrite() using a copy of the struct uio that the syscall originally used. This solves the DoS which could easily be performed; to work around the DoS, one could also remove "options KTRACE" from the kernel. This is a very strong MFC candidate for 4.1. Found by: art@OpenBSD.org
* unstatic getfp() so that other subsystems can use it.alfred2000-06-121-2/+1
| | | | | | make sendfile() use it. Approved by: dg
* Some ioctl routines assume that the ioctl buffer is aligned, but adillon2000-05-091-3/+6
| | | | | char[] declaration makes no such guarentee. A union is used to force alignment of the char buffer.
* Fix select(2) for the Alpha. (!!) It was never returning true forpeter2000-02-201-6/+8
| | | | | | | | | | | | | fd's in the range of 32-63, 96-127 etc. The first problem was the FD_*() macros were shifting a 32 bit integer "1" left by more than 32 bits. The same problem happened in selscan(). ffs() also takes an int argument and causes failure. For cases where int == long (ie: the usual case for x86, but not always as gcc can have long being a 64 bit quantity) ffs() could be used. Reported by: Marian Stagarescu <marian@bile.skycache.com> Reviewed by: dfr, gallatin (sys/types.h only) Approved by: jkh
* Add aio_waitcomplete(). Make aio work correctly for socket descriptors.jasone2000-01-141-0/+2
| | | | | | | | Make gratuitous style(9) fixes (me, not the submitter) to make the aio code more readable. PR: kern/12053 Submitted by: Chris Sedore <cmsedore@maxwell.syr.edu>
* Export the nselcoll counter via the kern.nselcoll sysctl so we can seepeter2000-01-051-1/+3
| | | | | | just how bad it gets in various situations. Reminded by: adrian
* Missed the second argument of fdrop().green1999-10-141-1/+1
| | | | Submitted by: jhay
* Fix a race condition with shared fd tables and writev(). It'sgreen1999-10-141-2/+7
| | | | | still not safe to consider file table sharing secure. Submitted by: Ville-Pertti Keinonen <will@iki.fi>
* Trim unused options (or #ifdef for undoc options).peter1999-10-111-1/+0
| | | | Submitted by: phk
* This is what was "fdfix2.patch," a fix for fd sharing. It's prettygreen1999-09-191-11/+10
| | | | | | | | | | | | | | | | | far-reaching in fd-land, so you'll want to consult the code for changes. The biggest change is that now, you don't use fp->f_ops->fo_foo(fp, bar) but instead fo_foo(fp, bar), which increments and decrements the fp refcount upon entry and exit. Two new calls, fhold() and fdrop(), are provided. Each does what it seems like it should, and if fdrop() brings the refcount to zero, the fd is freed as well. Thanks to peter ("to hell with it, it looks ok to me.") for his review. Thanks to msmith for keeping me from putting locks everywhere :) Reviewed by: peter
* $Id$ -> $FreeBSD$peter1999-08-281-1/+1
|
* Add standard padding argument to pread and pwrite syscall. That should make themdt1999-04-041-129/+89
| | | | | | | | | NetBSD compatible. Add parameter to fo_read and fo_write. (The only flag FOF_OFFSET mean that the offset is set in the struct uio). Factor out some common code from read/pread/write/pwrite syscalls.
* Added pread and pwrite. These functions are defined by the X/Openalc1999-03-271-1/+132
| | | | | | Threads Extension. (Note: We use the same syscall numbers as NetBSD.) Submitted by: John Plevyak <jplevyak@inktomi.com>
* Removed a bogus cast to c_caddr_t. This is part of terminatingbde1999-01-291-2/+2
| | | | | | | | | | | | | | | | c_caddr_t with extreme prejudice. Here the point of the original cast to caddr_t was to break the warning about the const mismatch between write(2)'s `const void *buf' and `struct uio's `char *iov_base' (previous bitrot gave a gratuitous dependency on caddr_t being char *). Compiling with -Wcast-qual made the cast a full no-op. This change has no effect on the warning for discarding `const' on assignment to iov_base. The warning should not be fixed by splitting `struct iovec' into a non-const version for read() and a const version for write(), since correct const poisoning would affect all pointers to i/o addresses. Const'ness should probably be forgotten by not declaring it in syscalls.master.
* Fix warnings in preparation for adding -Wall -Wcast-qual to thedillon1999-01-271-2/+2
| | | | kernel compile
* poll(2) sets POLLNVAL for descriptors passed in that are less thanjkh1998-12-101-2/+4
| | | | | | | | 0. This makes it difficult to do efficient manipulation of the struct pollfd since you can't leave a slot empty. PR: 8599 Submitted-by: Marc Slemko <marcs@znep.com>
OpenPOWER on IntegriCloud