summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_umtx.c
Commit message (Collapse)AuthorAgeFilesLines
* Expose the umtx_key structure and API to the rest of the kernel.jhb2011-02-231-50/+2
| | | | MFC after: 3 days
* - Follow r216313, the sched_unlend_user_prio is no longer needed, alwaysdavidxu2010-12-291-43/+18
| | | | | | | use sched_lend_user_prio to set lent priority. - Improve pthread priority-inherit mutex, when a contender's priority is lowered, repropagete priorities, this may cause mutex owner's priority to be lowerd, in old code, mutex owner's priority is rise-only.
* Enlarge hash table for new condition variable.davidxu2010-12-231-2/+2
|
* MFp4:davidxu2010-12-221-15/+105
| | | | | | | | | | | | | | | - Add flags CVWAIT_ABSTIME and CVWAIT_CLOCKID for umtx kernel based condition variable, this should eliminate an extra system call to get current time. - Add sub-function UMTX_OP_NWAKE_PRIVATE to wake up N channels in single system call. Create userland sleep queue for condition variable, in most cases, thread will wait in the queue, the pthread_cond_signal will defer thread wakeup until the mutex is unlocked, it tries to avoid an extra system call and a extra context switch in time window of pthread_cond_signal and pthread_mutex_unlock. The changes are part of process-shared mutex project.
* One of the compat32 functions was copying in a raw timespec, instead ofmdf2010-12-151-2/+1
| | | | | | | | a 32-bit one. This can cause weird timeout issues, as the copying reads garbage from the user. Code by: Deepak Veliath <deepak dot veliath at isilon dot com> MFC after: 1 week
* MFp4:davidxu2010-12-091-7/+9
| | | | | | | | | It is possible a lower priority thread lending priority to higher priority thread, in old code, it is ignored, however the lending should always be recorded, add field td_lend_user_pri to fix the problem, if a thread does not have borrowed priority, its value is PRI_MAX. MFC after: 1 week
* Use atomic instruction to set _has_writer, otherwise there is a racedavidxu2010-11-221-1/+2
| | | | | | causes userland to not wake up a thread sleeping in kernel. MFC after: 3 days
* Only unlock process if a thread is found.davidxu2010-11-151-4/+4
|
* Create a global thread hash table to speed up thread lookup, usedavidxu2010-10-091-8/+3
| | | | | | | | | | rwlock to protect the table. In old code, thread lookup is done with process lock held, to find a thread, kernel has to iterate through process and thread list, this is quite inefficient. With this change, test shows in extreme case performance is dramatically improved. Earlier patch was reviewed by: jhb, julian
* If a thread is removed from umtxq while sleeping, reset error codedavidxu2010-08-251-23/+12
| | | | | to zero, this gives userland a better indication that a thread needn't to be cancelled.
* Use ISO C99 integer types in sys/kern where possible.ed2010-06-211-2/+2
| | | | | | There are only about 100 occurences of the BSD-specific u_int*_t datatypes in sys/kern. The ISO C99 integer types are used here more often.
* Provide groundwork for 32-bit binary compatibility on non-x86 platforms,nwhitehorn2010-03-111-3/+3
| | | | | | | | | for upcoming 64-bit PowerPC and MIPS support. This renames the COMPAT_IA32 option to COMPAT_FREEBSD32, removes some IA32-specific code from MI parts of the kernel and enhances the freebsd32 compatibility code to support big-endian platforms. Reviewed by: kib, jhb
* In function umtxq_insert_queue, use parameter q (shared/exclusive queue)davidxu2010-02-101-1/+1
| | | | | instead of hard coded constant. This does not affect RELENG_8 and previous, because the code only exists in the HEAD.
* Set waiters flag before checking semaphore's counter,davidxu2010-02-081-5/+2
| | | | otherwise we might lose a wakeup. Tested on postgresql database server.
* Fix comments in do_sem_wait().davidxu2010-02-031-2/+1
|
* After busied the lock, re-read state word before checking waiters flag,davidxu2010-02-031-0/+12
| | | | | | | otherwise, the waiters bit may not be set and a wakeup is lost. Submitted by: justin.teller at gmail dot com MFC after: 3 days
* Make a chain be a list of queues, and make threads waitingdavidxu2010-01-101-33/+93
| | | | | | for same key coalesce to same queue, this makes searching path shorter and improves performance. Also fix comments about shared PI-mutex.
* Use enum to define key types.davidxu2010-01-091-8/+10
| | | | Suggested by: jmallett
* put semaphore waiter in long term list.davidxu2010-01-091-1/+1
|
* Add key type TYPE_SEM.davidxu2010-01-091-8/+9
|
* Add user-level semaphore synchronous type, this change allows multipledavidxu2010-01-041-2/+160
| | | | | | | | | | processes to share semaphore by using shared memory area, in simplest case, only one atomic operation is needed in userland, waiter flag is maintained by kernel and userland only checks the flag, if the flag is set, user code enters kernel and does a wakeup() call. Move type definitions into file _umtx.h to minimize compiling time. Also type names need to be prefixed with underline character, this would reduce name conflict (still in progress).
* In function do_rw_wrlock, when a writer got an error and before returning,davidxu2009-09-251-2/+16
| | | | | | | | check if there are readers blocked by us via URWLOCK_WRITE_WAITERS flag, and resume the readers. The error must be EAGAIN, otherwise there must have memory problem, and nobody can rescue the buggy application. The revision 197445 might be reverted.
* Make UMTX_OP_WAIT_UINT actually wait for an unsigned integer on 64-bitsdavidxu2009-04-131-1/+1
| | | | | | machine. MFC after: 1 week
* 1) Check NULL pointer before calling umtx_pi_adjust_locked(), this avoidsdavidxu2009-03-131-24/+26
| | | | | | a PANIC. 2) Rework locking for POSIX priority-mutex, this fixes a race where a thread may wait there forever even if the mutex is unlocked.
* Add two commands to _umtx_op system call to allow a simple mutex to bedavidxu2008-06-241-35/+142
| | | | | | | | | | | | | | locked and unlocked completely in userland. by locking and unlocking mutex in userland, it reduces the total time a mutex is locked by a thread, in some application code, a mutex only protects a small piece of code, the code's execution time is less than a simple system call, if a lock contention happens, however in current implemenation, the lock holder has to extend its locking time and enter kernel to unlock it, the change avoids this disadvantage, it first sets mutex to free state and then enters kernel and wake one waiter up. This improves performance dramatically in some sysbench mutex tests. Tested by: kris Sounds great: jeff
* Use a seperated hash table for mutex and rwlock, avoid wasting some timedavidxu2008-05-301-17/+21
| | | | on walking through idle threads sleeping on condition variables.
* Introduce command UMTX_OP_WAIT_UINT_PRIVATE and UMTX_OP_WAKE_PRIVATEdavidxu2008-04-291-12/+62
| | | | | to allow userland to specify that an address is not shared by multiple processes.
* let umtxq_busy() only spin on mp machine. make function namedavidxu2008-04-031-10/+14
| | | | do_rwlock_unlock to be consistent with others.
* Fix compiling problem for amd64.davidxu2008-04-021-2/+2
|
* Er, don't restart a timeout version.davidxu2008-04-021-2/+4
|
* Introduce kernel based userland rwlock. Each umtx chain now has two lists,davidxu2008-04-021-45/+487
| | | | | | | one for readers and one for writers, other types of synchronization object just use first list. Asked by: jeff
* Check NULL pointer.davidxu2007-12-171-1/+10
|
* Add missing changes for fixing LOR of umtx lock and thread lock, followdavidxu2007-12-171-11/+24
| | | | | | | the committing of files: kern_resource.c revision 1.181 sched_4bsd.c revision 1.111 sched_ule.c revision 1.218
* Add function UMTX_OP_WAIT_UINT, the function causes thread to wait fordavidxu2007-11-211-2/+24
| | | | an integer to be changed.
* Backout experimental adaptive-spin umtx code.davidxu2007-06-061-67/+0
|
* Commit 8/14 of sched_lock decomposition.jeff2007-06-041-33/+52
| | | | | | | | | | - Use a global umtx spinlock to protect the sleep queues now that there is no global scheduler lock. - Use thread_lock() to protect thread state. Tested by: kris, current@ Tested on: i386, amd64, ULE, 4BSD, libthr, libkse, PREEMPTION, etc. Discussed with: kris, attilio, kmacy, jhb, julian, bde (small parts each)
* Further system call comment cleanup:rwatson2007-03-051-1/+0
| | | | | | | | | | - Remove also "MP SAFE" after prior "MPSAFE" pass. (suggested by bde) - Remove extra blank lines in some cases. - Add extra blank lines in some cases. - Remove no-op comments consisting solely of the function name, the word "syscall", or the system call name. - Add punctuation. - Re-wrap some comments.
* Add a lwpid field into per-cpu structure, the lwpid represents currentdavidxu2006-12-201-0/+70
| | | | | | | | | | | | | | | | | | | | | | | | running thread's id on each cpu. This allow us to add in-kernel adaptive spin for user level mutex. While spinning in user space is possible, without correct thread running state exported from kernel, it hardly can be implemented efficiently without wasting cpu cycles, however exporting thread running state unlikely will be implemented soon as it has to design and stablize interfaces. This implementation is transparent to user space, it can be disabled dynamically. With this change, mutex ping-pong program's performance is improved massively on SMP machine. performance of mysql super-smack select benchmark is increased about 7% on Intel dual dual-core2 Xeon machine, it indicates on systems which have bunch of cpus and system-call overhead is low (athlon64, opteron, and core-2 are known to be fast), the adaptive spin does help performance. Added sysctls: kern.threads.umtx_dflt_spins if the sysctl value is non-zero, a zero umutex.m_spincount will cause the sysctl value to be used a spin cycle count. kern.threads.umtx_max_spins the sysctl sets upper limit of spin cycle count. Tested on: Athlon64 X2 3800+, Dual Xeon 5130
* Threading cleanup.. part 2 of several.julian2006-12-061-6/+0
| | | | | | | | | | | | | | | | | | | | | | Make part of John Birrell's KSE patch permanent.. Specifically, remove: Any reference of the ksegrp structure. This feature was never fully utilised and made things overly complicated. All code in the scheduler that tried to make threaded programs fair to unthreaded programs. Libpthread processes will already do this to some extent and libthr processes already disable it. Also: Since this makes such a big change to the scheduler(s), take the opportunity to rename some structures and elements that had to be moved anyhow. This makes the code a lot more readable. The ULE scheduler compiles again but I have no idea if it works. The 4bsd scheduler still reqires a little cleaning and some functions that now do ALMOST nothing will go away, but I thought I'd do that as a separate commit. Tested by David Xu, and Dan Eischen using libthr and libpthread.
* if a thread blocked on userland condition variable isdavidxu2006-12-041-5/+10
| | | | | | | | | | pthread_cancel()ed, it is expected that the thread will not consume a pthread_cond_signal(), therefor, we use thr_wake() to mark a flag, the flag tells a thread calling do_cv_wait() in umtx code to not block on a condition variable. Thread library is expected that once a thread detected itself is in pthread_cond_wait, it will call the thr_wake() for itself in its SIGCANCEL handler.
* Introduce userspace condition variable, since we have already POSIXdavidxu2006-12-031-4/+200
| | | | | | priority mutex implemented, it is the time to introduce this stuff, now we can use umutex and ucond together to implement pthread's condition wait/signal.
* Sweep kernel replacing suser(9) calls with priv(9) calls, assigningrwatson2006-11-061-2/+3
| | | | | | | | | | | | | specific privilege names to a broad range of privileges. These may require some future tweaking. Sponsored by: nCircle Network Security, Inc. Obtained from: TrustedBSD Project Discussed on: arch@ Reviewed (at least in part) by: mlaier, jmg, pjd, bde, ceri, Alex Lyashkov <umka at sevcity dot net>, Skip Ford <skip dot ford at verizon dot net>, Antoine Brodin <antoine dot brodin at laposte dot net>
* Make KSE a kernel option, turned on by default in all GENERICjb2006-10-261-0/+6
| | | | | | | kernel configs except sun4v (which doesn't process signals properly with KSE). Reviewed by: davidxu@
* Optimize umtx_lock_pi() a bit by moving some heavy code out of the loop,davidxu2006-10-261-32/+27
| | | | make a fast path when a umtx_pi can be allocated without being blocked.
* In order to eliminate a branch, convert opcode to unsigned integer.davidxu2006-10-251-2/+2
|
* Eliminate an unnecessary `if' statement.davidxu2006-10-251-1/+2
|
* o Add keyword volatile for user mutex owner field.davidxu2006-10-171-29/+23
| | | | | | o Fix type consistent problem by using type long for old umtx and wait channel. o Rename casuptr to casuword.
* Implement 32bit umtx_lock and umtx_unlock system calls, these two systemdavidxu2006-10-061-0/+14
| | | | | | | calls are not used by libthr in RELENG_6 and HEAD, it is only used by the libthr in RELENG-5, the _umtx_op system call can do more incremental dirty works than these two system calls without having to introduce new system calls or throw away old system calls when things are going on.
* Fix umtx command order error for freebsd 32bit.davidxu2006-09-221-1/+1
|
* Add umtx support for 32bit process on AMD64 machine.davidxu2006-09-221-82/+440
|
OpenPOWER on IntegriCloud