summaryrefslogtreecommitdiffstats
path: root/sys/kern/vfs_aio.c
Commit message (Collapse)AuthorAgeFilesLines
* Lock proctree_lock instead of pgrpsess_lock.jhb2002-04-161-2/+2
|
* o Use aiocblist::fd_file in the AIO threads rather than recomputingalc2002-04-141-45/+3
| | | | | | the file * from the calling process's descriptor table. o Eliminate sharing of the calling process's descriptor table with the AIO threads.
* Restructure aio_return() to eliminate duplicated code and facilitate Giantalc2002-04-081-21/+15
| | | | push down.
* Reduce the duplication of code for error handling in _aio_aqueue().alc2002-04-071-19/+7
|
* Change jobref and *ijoblist from int to long in order to avoidalc2002-04-071-3/+3
| | | | a catastrophe after the 2^32nd AIO operation on 64-bit architectures.
* o aio_process needn't fhold()/fdrop() the fp now that _aio_aqueue() andalc2002-04-041-13/+6
| | | | | | aio_free_entry() do this. o Remove two unnecessary/unused variables from aio_process() and one field from aiocblist.
* Keep the reference to the file acquired in _aio_aqueue() until the operationalc2002-03-311-3/+7
| | | | | | completes. The reference is released in aio_free_entry(). Submitted by: tegge
* Added used include of <sys/sx.h>. Don't depend on namespace pollution inbde2002-03-251-0/+1
| | | | <sys/file.h> or <sys/socketvar.h>.
* Remove references to vm_zone.h and switch over to the new uma API.jeff2002-03-201-40/+45
| | | | | Also, remove maxsockets. If you look carefully you'll notice that the old zone allocator never honored this anyway.
* Document all functions, global and static variables, and sysctls.eivind2002-03-051-43/+80
| | | | | | | | Includes some minor whitespace changes, and re-ordering to be able to document properly (e.g, grouping of variables and the SYSCTL macro calls for them, where the documentation has been added.) Reviewed by: phk (but all errors are mine)
* Lock struct pgrp, session and sigio.tanimura2002-02-231-1/+9
| | | | | | | | | | | | | | | | | | | | | | | | | New locks are: - pgrpsess_lock which locks the whole pgrps and sessions, - pg_mtx which protects the pgrp members, and - s_mtx which protects the session members. Please refer to sys/proc.h for the coverage of these locks. Changes on the pgrp/session interface: - pgfind() needs the pgrpsess_lock held. - The caller of enterpgrp() is responsible to allocate a new pgrp and session. - Call enterthispgrp() in order to enter an existing pgrp. - pgsignal() requires a pgrp lock held. Reviewed by: jhb, alfred Tested on: cvsup.jp.FreeBSD.org (which is a quad-CPU machine running -current)
* o Clearing p/td_retval[0] after aio_newproc() is unnecessary. (We stoppedalc2002-02-121-6/+1
| | | | | calling rfork() to create aio threads in revision 1.46.) o Don't recompute the FILE * when it's already stored in the kernel's AIOCB.
* Pre-KSE/M3 commit.julian2002-02-071-4/+4
| | | | | | | | | | this is a low-functionality change that changes the kernel to access the main thread of a process via the linked list of threads rather than assuming that it is embedded in the process. It IS still embeded there but remove all teh code that assumes that in preparation for the next commit which will actually move it out. Reviewed by: peter@freebsd.org, gallatin@cs.duke.edu, benno rice,
* o Remove the unused vestiges of JOBST_JOBQPROC andalc2002-01-201-15/+1
| | | | | the per-thread jobtorun queue. o Use TAILQ_EMPTY() instead of TAILQ_FIRST(...) == NULL.
* o Revision 1.99 ("KSE Milestone 2") left the aio daemonsalc2002-01-201-2/+2
| | | | | | | | | sleeping on a process object but changed the corresponding wakeup()s to the thread object. The result was that non-raw aio ops waited for an aio daemon to timeout before action was taken. Now, we sleep on the thread object. PR: kern/34016
* o Eliminate an unused parameter from aio_fphysio().alc2002-01-171-3/+3
|
* o Correct the initialization of aiolio_zone: Each entry was 16 times largeralc2002-01-141-13/+5
| | | | | | | | | than necessary. o Move a rarely-used goto label inside a critical section so that we don't perform an splnet() for which there is no corresponding splx(). o Remove unnecessary splnet()/splx() around accesses to kaioinfo::kaio_jobdone in aio_return(). o Use TAILQ_FOREACH for simple cases of iteration over kaioinfo::kaio_jobdone.
* o Correct a 32/64-bit error in the initialization of aiol_zone, specifically,alc2002-01-091-1/+1
| | | | sizeof(int) is not the size of a pointer.
* o Add missing synchronization (splnet()/splx()) in aio_free_entry().alc2002-01-061-1/+27
| | | | | o Move the definition of struct aiocblist from sys/aio.h to kern/vfs_aio.c. o Make aio_swake_cb() static.
* o Properly check the file descriptor passed to aio_cancel(2). (Previously,alc2002-01-021-14/+3
| | | | | no out-of-bounds check was performed on the file descriptor.) o Eliminate some excessive white space from aio_cancel(2).
* o Some style(9)-motivated changes to white space.alc2002-01-011-13/+13
|
* o Correct an off-by-one error in aio_suspend(2).alc2001-12-311-1/+1
| | | | PR: 18350
* o Use "td->td_proc" instead of "curproc" where possible.alc2001-12-311-10/+8
| | | | | o Eliminate the unnecessary initialization of several static variables to zero.
* Make AIO a loadable module.alfred2001-12-291-72/+85
| | | | | | | | | | | | | | | | | | | | | | | | Remove the explicit call to aio_proc_rundown() from exit1(), instead AIO will use at_exit(9). Add functions at_exec(9), rm_at_exec(9) which function nearly the same as at_exec(9) and rm_at_exec(9), these functions are called on behalf of modules at the time of execve(2) after the image activator has run. Use a modified version of tegge's suggestion via at_exec(9) to close an exploitable race in AIO. Fix SYSCALL_MODULE_HELPER such that it's archetecuterally neutral, the problem was that one had to pass it a paramater indicating the number of arguments which were actually the number of "int". Fix it by using an inline version of the AS macro against the syscall arguments. (AS should be available globally but we'll get to that later.) Add a primative system for dynamically adding kqueue ops, it's really not as sophisticated as it should be, but I'll discuss with jlemon when he's around.
* o Eliminate compilation warnings on 64-bit architectures.alc2001-12-101-3/+3
|
* o Eliminate unnecessary synchronization from filt_aiodetach().alc2001-12-091-5/+3
| | | | | | | | o The manual page for kevent says that EVFILT_AIO returns under the same conditions as aio_error(). With that in mind, set the data field of the returned struct kevent to the value that would be returned by aio_error(). o Fix two compilation warnings.
* The aio kthreads start off with a root credential just like all otherjhb2001-10-051-7/+0
| | | | | kthreads, so don't malloc a ucred just so we can create a duplicate of the one we already have.
* KSE Milestone 2julian2001-09-121-76/+93
| | | | | | | | | | | | | | 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
* Check validity of signal callback requested via aio routines.alfred2001-04-181-2/+13
| | | | | | | | | | | | | Also move the insertion of the request to after the request is validated, there's still looks like there may be some problems if an invalid address is passed to the aio routines, basically a possible leak or having a not completely initialized structure on the queue may still be possible. A new sig macro was made _SIG_VALID to check the validity of a signal, it would be advisable to use it from now on (in kern/kern_sig.c) rather than rolling your own. PR: kern/17152
* When aio_read/write() is used on a raw device, physical buffers arealc2001-03-101-7/+26
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | used for up to "vfs.aio.max_buf_aio" of the requests. If a request size is MAXPHYS, but the request base isn't page aligned, vmapbuf() will map the end of the user space buffer into the start of the kva allocated for the next physical buffer. Don't use a physical buffer in this case. (This change addresses problem report 25617.) When an aio_read/write() on a raw device has completed, timeout() is used to schedule a signal to the process. Thus, the reporting is delayed up to 10 ms (assuming hz is 100). The process might have terminated in the meantime, causing a trap 12 when attempting to deliver the signal. Thus, the timeout must be cancelled when removing the job. aio jobs in state JOBST_JOBQGLOBAL should be removed from the kaio_jobqueue list during process rundown. During process rundown, some aio jobs might move from one list to a different list that has already been "emptied", causing the rundown to be incomplete. Retry the rundown. A call to BUF_KERNPROC() is needed after obtaining a physical buffer to disassociate the lock from the running process since it can return to userland without releasing that lock. PR: 25617 Submitted by: tegge
* Use the kthread API to create and destroy AIO daemons.alc2001-03-091-9/+7
| | | | Submitted by: jhb
* Grab the process lock while calling psignal and before calling psignal.jhb2001-03-071-9/+26
|
* Add a missing splx() to aio_fphysio(). (This change is a no-op in -5.0,alc2001-03-061-12/+6
| | | | | | | | but potentially significant in -4.x.) Eliminate a pointless parameter to aio_fphysio(). Remove unnecessary casts from aio_fphysio() and aio_physwakeup().
* Eliminate the aio_freejobs list. Its purpose was to store freealc2001-03-051-40/+30
| | | | | | | | | | | | | | | | | | | | | aiocb's allocated by zalloc(). In other words, zfree() was never called. Now, we call zfree(). Why eliminate this micro- optimization? At some later point, when we multithread the AIO system, we would need a mutex to synchronize access to aio_freejobs, making its use nearly indistinguishable in cost from zalloc() and zfree(). Remove unnecessary fhold() and fdrop() calls from aio_qphysio(), undo'ing a part of revision 1.86. The reference count on the file structure is already incremented by _aio_aqueue() before it calls aio_qphysio(). (Update the comments to document this fact.) Remove unnecessary casts from _aio_aqueue(), aio_read(), aio_write() and aio_waitcomplete(). Remove an unnecessary "return;" from aio_process(). Add "static" in various places.
* Remove the field privatemodes from struct __aiocb_private and thealc2001-03-041-137/+2
| | | | | | | related code from aio_read() and aio_write(). This field was intended, but never used, to allow a mythical user-level library to make an aio_read() or aio_write() behave like an ordinary read() or write(), i.e., a blocking I/O operation.
* Change and clean the mutex lock interface.bmilekic2001-02-091-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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)
* Fix typo: wierd -> weird.asmodai2001-02-061-1/+1
| | | | There is no such thing as wierd in the english language.
* Another round of the <sys/queue.h> FOREACH transmogriffer.phk2001-02-041-4/+2
| | | | | Created with: sed(1) Reviewed by: md5(1)
* Remove thr_sleep and thr_wakeup. Remove fields p_nthread and p_wakeupjake2000-12-021-1/+1
| | | | | | | | | | from struct proc, which are now unused (p_nthread already was). Remove process flag P_KTHREADP which was untested and only set in vfs_aio.c (it should use kthread_create). Move the yield system call to kern_synch.c as kern_threads.c has been removed completely. moral support from: alfred, jhb
* Provide a new interface for the user of aio_read() and aio_write() to requestalc2000-11-211-29/+33
| | | | | | | | | | | | | | | a kevent upon completion of the I/O. Specifically, introduce a new type of sigevent notification, SIGEV_EVENT. If sigev_notify is SIGEV_EVENT, then sigev_notify_kqueue names the kqueue that should receive the event and sigev_value contains the "void *" is copied into the kevent's udata field. In contrast to the existing interface, this one: 1) works on the Alpha 2) avoids the extra copyin() call for the kevent because all of the information needed is in the sigevent and 3) could be applied to request a single kevent upon completion of an entire lio_listio(). Reviewed by: jlemon
* This patchset fixes a large number of file descriptor race conditions.dillon2000-11-181-5/+32
| | | | | | | | | | | | 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>
* _aio_aqueue(): Change kevent registration to use its own struct file pointer.alc2000-10-291-3/+4
| | | | | | Otherwise, aio_read() and aio_write() on sockets are broken if a kevent is registered. (The code after kevent registration for handling sockets assumes that the struct file pointer "fp" still refers to the socket, not the kqueue.)
* Catch up to moving headers:jhb2000-10-201-1/+1
| | | | | - machine/ipl.h -> sys/ipl.h - machine/mutex.h -> sys/mutex.h
* aio_qphysio: Eliminate one instance of an out-of-range check that isalc2000-09-261-18/+3
| | | | | | | | performed twice. Eliminate initialization that is already performed by _aio_aqueue. aio_physwakeup: Eliminate redundant synchronization that is already performed by bufdone.
* Added used include of <sys/mutex.h> (don't depend on pollution inbde2000-09-171-0/+2
| | | | <sys/signalvar.h>).
* aio processes need to have the Giant mutex before doing work.jhb2000-09-111-0/+1
| | | | Submitted by: tegge
* Remove uidinfo hash table lookup and maintenance out of chgproccnt() andtruckman2000-09-051-0/+2
| | | | | | | | | | | | | | chgsbsize(), which are called rather frequently and may be called from an interrupt context in the case of chgsbsize(). Instead, do the hash table lookup and maintenance when credentials are changed, which is a lot less frequent. Add pointers to the uidinfo structures to the ucred and pcred structures for fast access. Pass a pointer to the credential to chgproccnt() and chgsbsize() instead of passing the uid. Add a reference count to the uidinfo structure and use it to decide when to free the structure rather than freeing the structure when the resource consumption drops to zero. Move the resource tracking code from kern_proc.c to kern_resource.c. Move some duplicate code sequences in kern_prot.c to separate helper functions. Change KASSERTs in this code to unconditional tests and calls to panic().
* Make filt_aio() check the jobstate for JOBST_JOBBFINISHED (in additionalc2000-09-041-1/+2
| | | | | to JOBST_JOBFINISHED) in case the aio_read() or aio_write() was performed via the high-performance physio method, i.e., aio_qphysio().
* Fix the #ifdef VFS_AIO to not compile a whole bunch of unused stuff in thepeter2000-07-281-7/+34
| | | | | | !VFS_AIO case. Lots of things have hooks into here (kqueue, exit(), sockets, etc), I elected to keep the external interfaces the same rather than spread more #ifdefs around the kernel.
* Back out the previous change to the queue(3) interface.jake2000-05-261-14/+14
| | | | | | It was not discussed and should probably not happen. Requested by: msmith and others
OpenPOWER on IntegriCloud