aboutsummaryrefslogtreecommitdiff
path: root/sys/kern/kern_mutex.c
Commit message (Collapse)AuthorAgeFilesLines
...
* If a spin lock is held for too long and WITNESS is enabled, then callJohn Baldwin2003-07-311-3/+9
| | | | | | | | witness_display_spinlock() to see if we can find out where the current owner of the spin lock last acquired the lock. Notes: svn path=/head/; revision=118272
* When complaining about a sleeping thread owning a mutex, display theJohn Baldwin2003-07-301-1/+3
| | | | | | | | | | thread's pid to make debugging easier for people who don't want to have to use the intended tool for these panics (witness). Indirectly prodded by: kris Notes: svn path=/head/; revision=118227
* - Add comments about the maintenance of the per-thread list of contestedJohn Baldwin2003-07-021-4/+9
| | | | | | | | | | | | | | | | locks held by each thread. - Fix a bug in the original BSD/OS code where a contested lock was not properly handed off from the old thread to the new thread when a contested lock with more than one blocked thread was transferred from one thread to another. - Don't use an atomic operation to write the MTX_CONTESTED value to mtx_lock in the aforementioned special case. The memory barriers and exclusion provided by sched_lock are sufficient. Spotted by: alc (2) Notes: svn path=/head/; revision=117168
* Use __FBSDID().David E. O'Brien2003-06-111-1/+3
| | | | Notes: svn path=/head/; revision=116182
* Add "" around mutex name to make message less confusing.Poul-Henning Kamp2003-05-311-1/+1
| | | | Notes: svn path=/head/; revision=115568
* Use TD_IS_RUNNING() instead of thread_running() in the adaptive mutexJohn Baldwin2003-04-171-7/+2
| | | | | | | code. Notes: svn path=/head/; revision=113632
* Move the _oncpu entry from the KSE to the thread.Julian Elischer2003-04-101-1/+2
| | | | | | | | The entry in the KSE still exists but it's purpose will change a bit when we add the ability to lock a KSE to a cpu. Notes: svn path=/head/; revision=113339
* Remove unused mtx_lock_giant(), mtx_unlock_giant(), related globalsTim J. Robbins2003-03-231-43/+0
| | | | | | | and sysctls. Notes: svn path=/head/; revision=112513
* Including <sys/stdint.h> is (almost?) universally only to be able to usePoul-Henning Kamp2003-03-181-1/+0
| | | | | | | | %j in printfs, so put a newsted include in <sys/systm.h> where the printf prototype lives and save everybody else the trouble. Notes: svn path=/head/; revision=112367
* Axe the useless MTX_SLEEPABLE flag. mutexes are not sleepable locks.John Baldwin2003-03-111-3/+1
| | | | | | | | Nothing used this flag and WITNESS would have panic'd during mtx_init() if anything had. Notes: svn path=/head/; revision=112108
* Remove safety belt: it is now ok to do a mtx_trylock() on a mutex youJohn Baldwin2003-03-041-5/+4
| | | | | | | | | | already own. The mtx_trylock() will fail however. Enhance the comment at the top of the try lock function to explain this. Requested by: jlemon and his evil netisr locking Notes: svn path=/head/; revision=111885
* Miscellaneous cleanups to _mtx_lock_sleep():John Baldwin2003-03-041-4/+6
| | | | | | | | | | | - Declare some local variables at the top of the function instead of in a nested block. - Use mtx_owned() instead of masking off bits from mtx_lock manually. - Read the value of mtx_lock into 'v' as a separate line rather than inside an if statement for clarity. This code is hairy enough as it is. Notes: svn path=/head/; revision=111880
* Properly assert that mtx_trylock() is not called on a mutex we alreadyJohn Baldwin2003-03-041-8/+4
| | | | | | | | | | owned. Previously the KASSERT would only trigger if we successfully acquired a lock that we already held. However, _obtain_lock() fails to acquire locks that we already hold, so the KASSERT was never checked in the case it was supposed to fail. Notes: svn path=/head/; revision=111879
* Unbreak mutex profiling (at least for me).Mike Makonnen2003-02-251-3/+15
| | | | | | | | | | | | | o Always check for null when dereferencing the filename component. o Implement a try-and-backoff method for allocating memory to dump stats to avoid a spin-lock -> sleep-lock mutex lock order panic with WITNESS. Approved by: des, markm (mentor) Not objected: jhb Notes: svn path=/head/; revision=111508
* There's absolutely no need for a struct-within-a-struct, so move theDag-Erling Smørgrav2003-01-211-14/+12
| | | | | | | counters out of the inner struct and remove it. Notes: svn path=/head/; revision=109654
* Disable the kernacc() check in mtx_validate() until such time that kernaccPoul-Henning Kamp2002-10-251-0/+5
| | | | | | | | | | | | does not require Giant. This means that we may miss panics on a class of mutex programming bugs, but only if running with a Chernobyl setting of debug-flags. Spotted by: Pete Carah <pete@ns.altadena.net> Notes: svn path=/head/; revision=105919
* Whitespace cleanup.Dag-Erling Smørgrav2002-10-231-10/+9
| | | | Notes: svn path=/head/; revision=105782
* Change the `mutex_prof' structure to use three variables containedRobert Drehmel2002-10-221-18/+14
| | | | | | | | | in an anonymous structure as counters, instead of an array with preprocessor-defined names for indices. Remove the associated XXX- comment. Notes: svn path=/head/; revision=105719
* Reduce the overhead of the mutex statistics gathering code, try to produceDag-Erling Smørgrav2002-10-211-19/+28
| | | | | | | shorter lines in the report, and clean up some minor style issues. Notes: svn path=/head/; revision=105644
* - Create a new scheduler api that is defined in sys/sched.hJeff Roberson2002-10-121-4/+2
| | | | | | | | | | | | | - Begin moving scheduler specific functionality into sched_4bsd.c - Replace direct manipulation of scheduler data with hooks provided by the new api. - Remove KSE specific state modifications and single runq assumptions from kern_switch.c Reviewed by: -arch Notes: svn path=/head/; revision=104964
* Rename the mutex thread and process states to use a more generic 'LOCK'John Baldwin2002-10-021-13/+13
| | | | | | | | | | | | name instead. (e.g., SLOCK instead of SMTX, TD_ON_LOCK() instead of TD_ON_MUTEX()) Eventually a turnstile abstraction will be added that will be shared with mutexes and other types of locks. SLOCK/TDI_LOCK will be used internally by the turnstile code and will not be specific to mutexes. Making the change now ensures that turnstiles can be dropped in at a later date without affecting the ABI of userland applications. Notes: svn path=/head/; revision=104387
* uh, commit all of the patchJulian Elischer2002-09-291-0/+1
| | | | Notes: svn path=/head/; revision=104161
* commit the version I actually tested..Julian Elischer2002-09-291-2/+4
| | | | | | | Submitted by: davidxu Notes: svn path=/head/; revision=104160
* Implement basic KSE loaning. This stops a hread that is blocked in BOUND modeJulian Elischer2002-09-291-1/+2
| | | | | | | | | | | | from stopping another thread from completing a syscall, and this allows it to release its resources etc. Probably more related commits to follow (at least one I know of) Initial concept by: julian, dillon Submitted by: davidxu Notes: svn path=/head/; revision=104157
* Completely redo thread states.Julian Elischer2002-09-111-7/+6
| | | | | | | Reviewed by: davidxu@freebsd.org Notes: svn path=/head/; revision=103216
* Add some KASSERT()'s to ensure that we don't perform spin mutex ops onJohn Baldwin2002-09-031-4/+16
| | | | | | | | | sleep mutexes and vice versa. WITNESS normally should catch this but not everyone uses WITNESS so this is a fallback to catch nasty but easy to do bugs. Notes: svn path=/head/; revision=102907
* Add a new KTR type KTR_CONTENTION, and use it in the mutex code toIan Dowse2002-08-261-0/+20
| | | | | | | | | | | log the start and end of periods during which mtx_lock() is waiting to acquire a sleep mutex. The log message includes the file and line of both the waiter and the holder. Reviewed by: jhb, jake Notes: svn path=/head/; revision=102450
* Disable optimization of spinlocks on UP kernels w/o debugging for nowJohn Baldwin2002-07-271-2/+2
| | | | | | | | | | | since it breaks mtx_owned() on spin mutexes when used outside of mtx_assert(). Unfortunately we currently use it in the i386 MD code and in the sio(4) driver. Reported by: bde Notes: svn path=/head/; revision=100754
* Add mtx_ prefixes to the fields used for mutex profiling, and fix a bugDag-Erling Smørgrav2002-07-031-11/+12
| | | | | | | | | | where the profiling code would report the release point instead of the acquisition point. Requested by: bde Notes: svn path=/head/; revision=99324
* Part 1 of KSE-IIIJulian Elischer2002-06-291-15/+16
| | | | | | | | | | | | | | | | The ability to schedule multiple threads per process (one one cpu) by making ALL system calls optionally asynchronous. to come: ia64 and power-pc patches, patches for gdb, test program (in tools) Reviewed by: Almost everyone who counts (at various times, peter, jhb, matt, alfred, mini, bernd, and a cast of thousands) NOTE: this is still Beta code, and contains lots of debugging stuff. expect slight instability in signals.. Notes: svn path=/head/; revision=99072
* Replace thread_runnable() with thread_running() as the latter is moreJohn Baldwin2002-06-041-6/+5
| | | | | | | | | accurate. Suggested by: julian Notes: svn path=/head/; revision=97839
* Optimize the adaptive mutex spin a bit. Use a simple while loop withJohn Baldwin2002-06-041-1/+4
| | | | | | | | | | | | simple reads (and on IA32, a "pause" instruction for each interation of the loop) to spin until either the mutex owner field changes, or the lock owner stops executing. Suggested by: tanimura Tested on: i386 Notes: svn path=/head/; revision=97837
* Add a private thread_runnable() macro to make the code more readable andJohn Baldwin2002-06-041-3/+5
| | | | | | | make the KSE diff easier to maintain. Notes: svn path=/head/; revision=97836
* Make the counters uintmax_ts, and use %ju rather than %llu.Dag-Erling Smørgrav2002-05-231-2/+3
| | | | Notes: svn path=/head/; revision=97156
* Rename pause() to ia32_pause() so it doesn't conflict with the pause()John Baldwin2002-05-221-5/+5
| | | | | | | | function defined in <unistd.h>. I didn't #ifdef _KERNEL it because the mutex implementation in libpthread will probably need this. Notes: svn path=/head/; revision=97139
* Rename cpu_pause() to pause(). Originally I was going to make this anJohn Baldwin2002-05-221-5/+5
| | | | | | | | | | | | MI API with empty cpu_pause() functions on other arch's, but this functionality is definitely unique to IA-32, so I decided to leave it as i386-only and wrap it in #ifdef's. I should have dropped the cpu_ prefix when I made that decision. Requested by: bde Notes: svn path=/head/; revision=97113
* Add appropriate IA32 "pause" instructions to improve performanec onJohn Baldwin2002-05-211-1/+17
| | | | | | | | | Pentium 4's and newer IA32 processors. The "pause" instruction has been verified by Intel to be a NOP on all currently existing IA32 processors prior to the Pentium 4. Notes: svn path=/head/; revision=97086
* Fix an old cut 'n' paste bug inherited from BSD/OS: don't increment 'i'John Baldwin2002-05-211-1/+1
| | | | | | | twice once we are in the long wait stage of spinning on a spin mutex. Notes: svn path=/head/; revision=97084
* Whitespace fixup, properly indent the body of an else clause.John Baldwin2002-05-211-2/+2
| | | | Notes: svn path=/head/; revision=97082
* Add code to make default mutexes adaptive if the ADAPTIVE_MUTEXES kernelJohn Baldwin2002-05-211-0/+26
| | | | | | | | | | | | | | | | | | | | | | | | | option is used (not on by default). - In the case of trying to lock a mutex, if the MTX_CONTESTED flag is set, then we can safely read the thread pointer from the mtx_lock member while holding sched_lock. We then examine the thread to see if it is currently executing on another CPU. If it is, then we keep looping instead of blocking. - In the case of trying to unlock a mutex, it is now possible for a mutex to have MTX_CONTESTED set in mtx_lock but to not have any threads actually blocked on it, so we need to handle that case. In that case, we just release the lock as if MTX_CONTESTED was not set and return. - We do not adaptively spin on Giant as Giant is held for long times and it slows SMP systems down to a crawl (it was taking several minutes, like 5-10 or so for my test alpha and sparc64 SMP boxes to boot up when they adaptively spinned on Giant). - We only compile in the code to do this for SMP kernels, it doesn't make sense for UP kernels. Tested on: i386, alpha, sparc64 Notes: svn path=/head/; revision=97081
* Optimize spin mutexes for UP kernels without debugging to just enter andJohn Baldwin2002-05-211-0/+8
| | | | | | | | exit critical sections. We only contest on a spin mutex on an SMP kernel running on an SMP machine. Notes: svn path=/head/; revision=97079
* Change mtx_init() to now take an extra argument. The third argument isJohn Baldwin2002-04-041-8/+11
| | | | | | | | | the generic lock type for use with witness. If this argument is NULL then the lock name is used as the lock type. Add a macro for a lock type name for network driver locks. Notes: svn path=/head/; revision=93813
* Revert to open hashing. It makes the code simpler, and works farily wellDag-Erling Smørgrav2002-04-021-16/+10
| | | | | | | | | | even when the number of records approaches the size of the hash table. Besides, the previous implementation (using linear probing) was broken :) Also, use the newly introduced MTX_SYSINIT. Notes: svn path=/head/; revision=93705
* - Move the MI mutexes sched_lock and Giant from being declared in theJohn Baldwin2002-04-021-0/+27
| | | | | | | | | | | | | various machdep.c's to being declared in kern_mutex.c. - Add a new function mutex_init() used to perform early initialization needed for mutexes such as setting up thread0's contested lock list and initializing MI mutexes. Change the various MD startup routines to call this function instead of duplicating all the code themselves. Tested on: alpha, i386 Notes: svn path=/head/; revision=93702
* Spelling police.John Baldwin2002-04-021-1/+1
| | | | Notes: svn path=/head/; revision=93692
* - Add MTX_SYSINIT and SX_SYSINIT as macro glue for allowing sx and mtxAndrew R. Reiter2002-04-021-0/+11
| | | | | | | | | | | | | locks to be able to setup a SYSINIT call. This helps in places where a lock is needed to protect some data, but the data is not truly associated with a subsystem that can properly initialize it's lock. The macros use the mtx_sysinit() and sx_sysinit() functions, respectively, as the handler argument to SYSINIT(). Reviewed by: alfred, jhb, smp@ Notes: svn path=/head/; revision=93672
* Instead of get_cyclecount(9), use nanotime(9) to record acquisition andDag-Erling Smørgrav2002-04-021-19/+28
| | | | | | | | | | release times. Measurements are made and stored in nanoseconds but presented in microseconds, which should be sufficient for the locks for which we actually want this (those that are held long and / or often). Also, rename some variables and structure members to unit-agnostic names. Notes: svn path=/head/; revision=93667
* Mutex profiling code, conditional on the MUTEX_PROFILING option. Adds theDag-Erling Smørgrav2002-04-021-2/+159
| | | | | | | | | | | | | | | | | | | | | | | | | | following sysctl variables: debug.mutex.prof.enable enable / disable profiling debug.mutex.prof.acquisitions number of mutex acquisitions recorded debug.mutex.prof.records number of acquisition points recorded debug.mutex.prof.maxrecords max number of acquisition points debug.mutex.prof.rejected number of rejections (due to full table) debug.mutex.prof.hashsize hash size debug.mutex.prof.collisions number of hash collisions debug.mutex.prof.stats profiling statistics The code records four numbers for each acquisition point (identified by source file name and line number): longest time held, total time held, number of non-recursive acquisitions, average time held. The measurements are in clock cycles (as returned by get_cyclecount(9)); this may cause measurements on some SMP systems to be unreliable. This can probably be worked around by replacing get_cyclecount(9) by some incarnation of nanotime(9). This work was derived from initial patches by eivind. Notes: svn path=/head/; revision=93609
* Add a new mtx_init option "MTX_DUPOK" which allows duplicate acquires of locksJeff Roberson2002-03-271-1/+3
| | | | | | | | | | | | | | with this flag. Remove the dup_list and dup_ok code from subr_witness. Now we just check for the flag instead of doing string compares. Also, switch the process lock, process group lock, and uma per cpu locks over to this interface. The original mechanism did not work well for uma because per cpu lock names are unique to each zone. Approved by: jhb Notes: svn path=/head/; revision=93273
* Remove __P.Alfred Perlstein2002-03-191-1/+1
| | | | Notes: svn path=/head/; revision=92723