summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_umtx.c
Commit message (Collapse)AuthorAgeFilesLines
* The fields of struct timespec32 should be int32_t and not uint32_t.davide2012-10-271-2/+2
| | | | | | | | Make this change. Reviewed by: bde, davidxu Tested by: pho MFC after: 1 week
* Some style fixes inspired by @bde.davidxu2012-08-111-12/+12
|
* tvtohz will print out an error message if a negative value is givendavidxu2012-08-111-9/+13
| | | | | | to it, avoid this problem by detecting timeout earlier. Reported by: pho
* Fix some style bugs introduced in a previous commit (r233045)davide2012-04-141-8/+8
| | | | | | | Reported by: glebius, jmallet Reviewed by: jmallet Approved by: gnn (mentor) MFC after: 2 days
* In sem_post, the field _has_waiters is no longer used, because somedavidxu2012-04-051-9/+14
| | | | | | | application destroys semaphore after sem_wait returns. Just enter kernel to wake up sleeping threads, only update _has_waiters if it is safe. While here, check if the value exceed SEM_VALUE_MAX and return EOVERFLOW if this is true.
* umtx operation UMTX_OP_MUTEX_WAKE has a side-effect that it accessesdavidxu2012-04-051-2/+82
| | | | | | | | | | | | | | | | | | | | | a mutex after a thread has unlocked it, it event writes data to the mutex memory to clear contention bit, there is a race that other threads can lock it and unlock it, then destroy it, so it should not write data to the mutex memory if there isn't any waiter. The new operation UMTX_OP_MUTEX_WAKE2 try to fix the problem. It requires thread library to clear the lock word entirely, then call the WAKE2 operation to check if there is any waiter in kernel, and try to wake up a thread, if necessary, the contention bit is set again by the operation. This also mitgates the chance that other threads find the contention bit and try to enter kernel to compete with each other to wake up sleeping thread, this is unnecessary. With this change, the mutex owner is no longer holding the mutex until it reaches a point where kernel umtx queue is locked, it releases the mutex as soon as possible. Performance is improved when the mutex is contensted heavily. On Intel i3-2310M, the runtime of a benchmark program is reduced from 26.87 seconds to 2.39 seconds, it even is better than UMTX_OP_MUTEX_WAKE which is deprecated now. http://people.freebsd.org/~davidxu/bench/mutex_perf.c
* Remove stale comments.davidxu2012-03-311-3/+0
|
* Remove trailing semicolon, it is a typo.davidxu2012-03-301-1/+1
|
* Fix COMPAT_FREEBSD32 build.davidxu2012-03-301-3/+3
| | | | Submitted by: Andreas Tobler < andreast at fgznet dot ch >
* Remove trailing space.davidxu2012-03-301-1/+1
|
* Merge umtxq_sleep and umtxq_nanosleep into a single function by usingdavidxu2012-03-301-264/+172
| | | | an abs_timeout structure which describes timeout info.
* Reduce code size by creating common timed sleeping function.davidxu2012-03-291-93/+60
|
* Add rudimentary profiling of the hash table used in the in the umtx code todavide2012-03-161-0/+51
| | | | | | | | hold active lock queues. Reviewed by: attilio Approved by: davidxu, gnn (mentor) MFC after: 3 weeks
* initialize clock ID and flags only when copying timespec, a _umtx_timedavidxu2012-02-291-4/+4
| | | | copy already contains these fields.
* Follow changes made in revision 232144, pass absolute timeout to kernel,davidxu2012-02-271-41/+47
| | | | this eliminates a clock_gettime() syscall.
* In revision 231989, we pass a 16-bit clock ID into kernel, howeverdavidxu2012-02-251-98/+154
| | | | | | | | | | | | according to POSIX document, the clock ID may be dynamically allocated, it unlikely will be in 64K forever. To make it future compatible, we pack all timeout information into a new structure called _umtx_time, and use fourth argument as a size indication, a zero means it is old code using timespec as timeout value, but the new structure also includes flags and a clock ID, so the size argument is different than before, and it is non-zero. With this change, it is possible that a thread can sleep on any supported clock, though current kernel code does not have such a POSIX clock driver system.
* Fix typo.davidxu2012-02-221-1/+1
|
* Use unused fourth argument of umtx_op to pass flags to kernel for operationdavidxu2012-02-221-21/+42
| | | | | | UMTX_OP_WAIT. Upper 16bits is enough to hold a clock id, and lower 16bits is used to pass flags. The change saves a clock_gettime() syscall from libthr.
* Eliminate branch and insert an explicit reader memory barrier to ensuredavidxu2012-01-161-3/+2
| | | | that waiter bit is set before reading semaphore count.
* Add umtx_copyin_timeout() and move parameter checks here.pho2011-12-031-53/+25
| | | | | In collaboration with: kib MFC after: 1 week
* Rename copyin_timeout32 to umtx_copyin_timeout32 and move parameterpho2011-12-031-42/+18
| | | | | | | check here. Include check for negative seconds value. In collaboration with: kib MFC after: 1 week
* Mark all SYSCTL_NODEs static that have no corresponding SYSCTL_DECLs.ed2011-11-071-1/+1
| | | | | | The SYSCTL_NODE macro defines a list that stores all child-elements of that node. If there's no SYSCTL_DECL macro anywhere else, there's no reason why it shouldn't be static.
* In order to maximize the re-usability of kernel code in user space thiskmacy2011-09-161-3/+3
| | | | | | | | | | | | | patch modifies makesyscalls.sh to prefix all of the non-compatibility calls (e.g. not linux_, freebsd32_) with sys_ and updates the kernel entry points and all places in the code that use them. It also fixes an additional name space collision between the kernel function psignal and the libc function of the same name by renaming the kernel psignal kern_psignal(). By introducing this change now we will ease future MFCs that change syscalls. Reviewed by: rwatson Approved by: re (bz)
* 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.
OpenPOWER on IntegriCloud