#
f0393f06 |
| 23-Jan-2007 |
Jeff Roberson <jeff@FreeBSD.org> |
- Remove setrunqueue and replace it with direct calls to sched_add(). setrunqueue() was mostly empty. The few asserts and thread state setting were moved to the individual schedulers. sched_a
- Remove setrunqueue and replace it with direct calls to sched_add(). setrunqueue() was mostly empty. The few asserts and thread state setting were moved to the individual schedulers. sched_add() was chosen to displace it for naming consistency reasons. - Remove adjustrunqueue, it was 4 lines of code that was ifdef'd to be different on all three schedulers where it was only called in one place each. - Remove the long ifdef'd out remrunqueue code. - Remove the now redundant ts_state. Inspect the thread state directly. - Don't set TSF_* flags from kern_switch.c, we were only doing this to support a feature in one scheduler. - Change sched_choose() to return a thread rather than a td_sched. Also, rely on the schedulers to return the idlethread. This simplifies the logic in choosethread(). Aside from the run queue links kern_switch.c mostly does not care about the contents of td_sched.
Discussed with: julian
- Move the idle thread loop into the per scheduler area. ULE wants to do something different from the other schedulers.
Suggested by: jhb
Tested on: x86/amd64 sched_{4BSD, ULE, CORE}.
show more ...
|
#
4f506694 |
| 17-Jan-2007 |
Xin LI <delphij@FreeBSD.org> |
Use FOREACH_PROC_IN_SYSTEM instead of using its unrolled form.
|
Revision tags: release/6.2.0_cvs, release/6.2.0 |
|
#
19c80b26 |
| 11-Jan-2007 |
John Baldwin <jhb@FreeBSD.org> |
Wrap propagate_priority() in a critical section to prevent unwanted preemptions when adjusting the priority of a thread that is on a run queue. This was only observed when FULL_PREEMPTION was enable
Wrap propagate_priority() in a critical section to prevent unwanted preemptions when adjusting the priority of a thread that is on a run queue. This was only observed when FULL_PREEMPTION was enabled.
Reported by: kris Diagnosed by: ups MFC after: 1 week
show more ...
|
#
462a7add |
| 15-Aug-2006 |
John Baldwin <jhb@FreeBSD.org> |
Add a new 'show sleepchain' ddb command similar to 'show lockchain' except that it operates on lockmgr and sx locks. This can be useful for tracking down vnode deadlocks in VFS for example. Note th
Add a new 'show sleepchain' ddb command similar to 'show lockchain' except that it operates on lockmgr and sx locks. This can be useful for tracking down vnode deadlocks in VFS for example. Note that this command is a bit more fragile than 'show lockchain' as we have to poke around at the wait channel of a thread to see if it points to either a struct lock or a condition variable inside of a struct sx. If td_wchan points to something unmapped, then this command will terminate early due to a fault, but no harm will be done.
show more ...
|
#
77e66268 |
| 15-Aug-2006 |
John Baldwin <jhb@FreeBSD.org> |
Rename 'show lockchain' to 'show locktree' and 'show threadchain' to 'show lockchain'. The churn is because I'm about to add a new 'show sleepchain' similar to 'show lockchain' for sleep locks (lock
Rename 'show lockchain' to 'show locktree' and 'show threadchain' to 'show lockchain'. The churn is because I'm about to add a new 'show sleepchain' similar to 'show lockchain' for sleep locks (lockmgr and sx) and 'show threadchain' was a bit ambiguous as both commands show a chain of thread dependencies, 'lockchain' is for non-sleepable locks (mtx and rw) and 'sleepchain' is for sleepable locks.
show more ...
|
#
fed79884 |
| 12-Jul-2006 |
John Baldwin <jhb@FreeBSD.org> |
Honor db_pager_quit in 'show threadchain', 'show allchains', and 'show lockchain'. This is especially helpful for the first 2 as a threadchain could get stuck in an infinite loop during a mutex dead
Honor db_pager_quit in 'show threadchain', 'show allchains', and 'show lockchain'. This is especially helpful for the first 2 as a threadchain could get stuck in an infinite loop during a mutex deadlock.
show more ...
|
Revision tags: release/5.5.0_cvs, release/5.5.0, release/6.1.0_cvs, release/6.1.0 |
|
#
ae110b53 |
| 25-Apr-2006 |
John Baldwin <jhb@FreeBSD.org> |
Add some new commands to hopefully make it easier to diagnose lock-related problems in ddb: - "show threadchain [thread]" will start with the specified thread (or the current kdb thread by default)
Add some new commands to hopefully make it easier to diagnose lock-related problems in ddb: - "show threadchain [thread]" will start with the specified thread (or the current kdb thread by default) and show it's state. If it is blocked on a lock, it will find the owner of the lock and show its state, etc. - "show allchains" will find all of the threads that are blocked on a lock (but do not have any threads blocked on a lock they hold) and show the resulting thread chain. - "show lockchain <lock>" takes a pointer to a lock_object (such as a mutex or rwlock). If there is a turnstile for that lock, then it will display all the threads blocked on the lock. In addition, for each thread blocked on the lock, it will display any contested locks they hold, and recurse on those locks to show any threads blocked on those locks, etc.
show more ...
|
#
f9ab2f13 |
| 21-Apr-2006 |
John Baldwin <jhb@FreeBSD.org> |
Print td_name instead of p_comm if td_name is non-empty for 'show turnstile' and 'show sleepq'.
|
#
f1a4b852 |
| 18-Apr-2006 |
John Baldwin <jhb@FreeBSD.org> |
- Bring back turnstile_empty() which can check to see if an individual queue on a turnstile is empty. - Add a turnstile_disown() function that allows a thread to give up ownership of a turnstile
- Bring back turnstile_empty() which can check to see if an individual queue on a turnstile is empty. - Add a turnstile_disown() function that allows a thread to give up ownership of a turnstile w/o waking up any waiters.
show more ...
|
#
4b3b0413 |
| 30-Mar-2006 |
John Baldwin <jhb@FreeBSD.org> |
Always explicitly panic in propogate_priority() if we try to propogate a lock's priority to a sleeping thread. When we panic, dump a stack trace of the thread that is asleep if DDB is compiled into
Always explicitly panic in propogate_priority() if we try to propogate a lock's priority to a sleeping thread. When we panic, dump a stack trace of the thread that is asleep if DDB is compiled into the kernel just before calling panic(). This is much more informative and useful for debugging than the current behavior of getting a page fault and not having an easy way of determining which thread caused the original problem.
MFC after: 1 week
show more ...
|
#
7aa4f685 |
| 27-Jan-2006 |
John Baldwin <jhb@FreeBSD.org> |
- Add support for having both a shared and exclusive queue of threads in each turnstile. Also, allow for the owner thread pointer of a turnstile to be NULL. This is needed for the upcoming read
- Add support for having both a shared and exclusive queue of threads in each turnstile. Also, allow for the owner thread pointer of a turnstile to be NULL. This is needed for the upcoming reader/writer lock implementation. - Add a new ddb command 'show turnstile' that will look up the turnstile associated with the given lock argument and display useful information like the list of threads blocked on each queue, etc. If there isn't an active turnstile for a lock at the specified address, then the function will see if there is an active turnstile at the specified address and display info about it if so. - Adjust the mutex code to handle the turnstile API changes.
Tested on: i386 (all), alpha, amd64, sparc64 (1 and 3)
show more ...
|
#
550d1c93 |
| 17-Jan-2006 |
John Baldwin <jhb@FreeBSD.org> |
Initialize thread0.td_contested in init_turnstiles() rather than mutex_init() as it is used by the turnstile code and is not mutex-specific.
|
#
3eb9cab0 |
| 17-Jan-2006 |
John Baldwin <jhb@FreeBSD.org> |
Garbage collect turnstile_empty() since it is unused.
|
Revision tags: release/6.0.0_cvs, release/6.0.0 |
|
#
b65089cc |
| 29-Sep-2005 |
John Baldwin <jhb@FreeBSD.org> |
Trim a couple of unneeded includes.
|
Revision tags: release/5.4.0_cvs, release/5.4.0 |
|
#
c711aea6 |
| 10-Feb-2005 |
Poul-Henning Kamp <phk@FreeBSD.org> |
Make a bunch of malloc types static.
Found by: src/tools/tools/kernxref
|
Revision tags: release/4.11.0_cvs, release/4.11.0 |
|
#
f5c157d9 |
| 30-Dec-2004 |
John Baldwin <jhb@FreeBSD.org> |
Rework the interface between priority propagation (lending) and the schedulers a bit to ensure more correct handling of priorities and fewer priority inversions: - Add two functions to the sched(9) A
Rework the interface between priority propagation (lending) and the schedulers a bit to ensure more correct handling of priorities and fewer priority inversions: - Add two functions to the sched(9) API to handle priority lending: sched_lend_prio() and sched_unlend_prio(). The turnstile code uses these functions to ask the scheduler to lend a thread a set priority and to tell the scheduler when it thinks it is ok for a thread to stop borrowing priority. The unlend case is slightly complex in that the turnstile code tells the scheduler what the minimum priority of the thread needs to be to satisfy the requirements of any other threads blocked on locks owned by the thread in question. The scheduler then decides where the thread can go back to normal mode (if it's normal priority is high enough to satisfy the pending lock requests) or it it should continue to use the priority specified to the sched_unlend_prio() call. This involves adding a new per-thread flag TDF_BORROWING that replaces the ULE-only kse flag for priority elevation. - Schedulers now refuse to lower the priority of a thread that is currently borrowing another therad's priority. - If a scheduler changes the priority of a thread that is currently sitting on a turnstile, it will call a new function turnstile_adjust() to inform the turnstile code of the change. This function resorts the thread on the priority list of the turnstile if needed, and if the thread ends up at the head of the list (due to having the highest priority) and its priority was raised, then it will propagate that new priority to the owner of the lock it is blocked on.
Some additional fixes specific to the 4BSD scheduler include: - Common code for updating the priority of a thread when the user priority of its associated kse group has been consolidated in a new static function resetpriority_thread(). One change to this function is that it will now only adjust the priority of a thread if it already has a time sharing priority, thus preserving any boosts from a tsleep() until the thread returns to userland. Also, resetpriority() no longer calls maybe_resched() on each thread in the group. Instead, the code calling resetpriority() is responsible for calling resetpriority_thread() on any threads that need to be updated. - schedcpu() now uses resetpriority_thread() instead of just calling sched_prio() directly after it updates a kse group's user priority. - sched_clock() now uses resetpriority_thread() rather than writing directly to td_priority. - sched_nice() now updates all the priorities of the threads after the group priority has been adjusted.
Discussed with: bde Reviewed by: ups, jeffr Tested on: 4bsd, ule Tested on: i386, alpha, sparc64
show more ...
|
Revision tags: release/5.3.0_cvs, release/5.3.0 |
|
#
2ff0e645 |
| 12-Oct-2004 |
John Baldwin <jhb@FreeBSD.org> |
Refine the turnstile and sleep queue interfaces just a bit: - Add a new _lock() call to each API that locks the associated chain lock for a lock_object pointer or wait channel. The _lookup() funct
Refine the turnstile and sleep queue interfaces just a bit: - Add a new _lock() call to each API that locks the associated chain lock for a lock_object pointer or wait channel. The _lookup() functions now require that the chain lock be locked via _lock() when they are called. - Change sleepq_add(), turnstile_wait() and turnstile_claim() to lookup the associated queue structure internally via _lookup() rather than accepting a pointer from the caller. For turnstiles, this means that the actual lookup of the turnstile in the hash table is only done when the thread actually blocks rather than being done on each loop iteration in _mtx_lock_sleep(). For sleep queues, this means that sleepq_lookup() is no longer used outside of the sleep queue code except to implement an assertion in cv_destroy(). - Change sleepq_broadcast() and sleepq_signal() to require that the chain lock is already required. For condition variables, this lets the cv_broadcast() and cv_signal() functions lock the sleep queue chain lock while testing the waiters count. This means that the waiters count internal to condition variables is no longer protected by the interlock mutex and cv_broadcast() and cv_signal() now no longer require that the interlock be held when they are called. This lets consumers of condition variables drop the lock before waking other threads which can result in fewer context switches.
MFC after: 1 month
show more ...
|
#
b8597527 |
| 05-Oct-2004 |
John Baldwin <jhb@FreeBSD.org> |
Add a critical section in turnstile_unpend() from before dropping the turnstile chain lock until after making all the awakened threads runnable. First, this fixes a priority inversion race. Second,
Add a critical section in turnstile_unpend() from before dropping the turnstile chain lock until after making all the awakened threads runnable. First, this fixes a priority inversion race. Second, this attempts to finish waking up all of the threads waiting on a turnstile before doing a preemption.
Reviewed by: Stephan Uphoff (who found the priority inversion race)
show more ...
|
#
2630e4c9 |
| 01-Sep-2004 |
Julian Elischer <julian@FreeBSD.org> |
Give setrunqueue() and sched_add() more of a clue as to where they are coming from and what is expected from them.
MFC after: 2 days
|
#
feb9bd18 |
| 26-Jul-2004 |
Robert Watson <rwatson@FreeBSD.org> |
Revert modification of subr_turnstile.c accidentally included in the last commit; this assertion was provided by jhb for local debugging and not intended for broader consumption.
|
#
fd179ee9 |
| 26-Jul-2004 |
Robert Watson <rwatson@FreeBSD.org> |
In uipc_connect(), assert that the passed thread is curthread, and pass td into unp_connect() instead of reading curthread.
|
#
bf0acc27 |
| 02-Jul-2004 |
John Baldwin <jhb@FreeBSD.org> |
- Change mi_switch() and sched_switch() to accept an optional thread to switch to. If a non-NULL thread pointer is passed in, then the CPU will switch to that thread directly rather than calling
- Change mi_switch() and sched_switch() to accept an optional thread to switch to. If a non-NULL thread pointer is passed in, then the CPU will switch to that thread directly rather than calling choosethread() to pick a thread to choose to. - Make sched_switch() aware of idle threads and know to do TD_SET_CAN_RUN() instead of sticking them on the run queue rather than requiring all callers of mi_switch() to know to do this if they can be called from an idlethread. - Move constants for arguments to mi_switch() and thread_single() out of the middle of the function prototypes and up above into their own section.
show more ...
|
#
01bd10e1 |
| 29-Jun-2004 |
John Baldwin <jhb@FreeBSD.org> |
Oops, this didn't make it into my submit before I committed: Defer creation of the sysctl tree for the turnstile profiling stats until a SI_SUB_LOCK sysinit. Doing it in init_turnstiles() is too ea
Oops, this didn't make it into my submit before I committed: Defer creation of the sysctl tree for the turnstile profiling stats until a SI_SUB_LOCK sysinit. Doing it in init_turnstiles() is too early as it is called before mi_startup().
show more ...
|
#
ef0ebfc3 |
| 29-Jun-2004 |
John Baldwin <jhb@FreeBSD.org> |
Add two new kernel options to allow rudimentary profiling of the internal hash tables used in the sleep queue and turnstile code. Each option adds a sysctl tree under debug containing the maximum de
Add two new kernel options to allow rudimentary profiling of the internal hash tables used in the sleep queue and turnstile code. Each option adds a sysctl tree under debug containing the maximum depth of any bucket in the hash table as well as a separate node for each bucket (or chain) containing the current depth and maximum depth for that bucket.
show more ...
|
Revision tags: release/4.10.0_cvs, release/4.10.0 |
|
#
ef2c0ba7 |
| 06-Apr-2004 |
John Baldwin <jhb@FreeBSD.org> |
Rename turnstile_wakeup() to turnstile_broadcast() to make the naming more consistent with other APIs. sleepq and cv's use signal/broadcast, and msleep uses wakeup_one/wakeup. Prior to this turnstil
Rename turnstile_wakeup() to turnstile_broadcast() to make the naming more consistent with other APIs. sleepq and cv's use signal/broadcast, and msleep uses wakeup_one/wakeup. Prior to this turnstiles were using a signal/wakeup mixture.
show more ...
|