summaryrefslogtreecommitdiff
path: root/sys/kern/subr_trap.c
Commit message (Collapse)AuthorAgeFilesLines
...
* - Fail an assert if we attempt to return with any lockmgr locks held inJeff Roberson2005-03-241-0/+2
| | | | | | | | | userret(). Sponsored by: Isilon Systems, Inc. Notes: svn path=/head/; revision=144061
* Whitespace fix.John Baldwin2004-12-301-0/+1
| | | | Notes: svn path=/head/; revision=139452
* - Run sched_userret() after thread_userret(). Before, sched_userret() wouldJeff Roberson2004-12-261-5/+4
| | | | | | | | | | | | lower the priority of the returning thread to a user priority before calling into thread_userret() which would call wakeup() which in turn would cause the returning thread to eventually context switch rather than completing its slice. Allowing this thread to complete its slice first yields a 15% performance improvement in super-smack on my dual opteron with 4BSD. Notes: svn path=/head/; revision=139324
* Add a new per-thread private flag: TDP_GEOM.Poul-Henning Kamp2004-10-231-0/+7
| | | | | | | | | | | | | | | | | This flag gets set whenever the thread posts an event on the GEOM event queue, and if the flag is set when the thread is prepared to return to userland from the kernel, g_waitidle() will be called to make sure that the posted events have completed. This can replace an insufficient number of g_waitidle() calls in various other places, and has the advantage of being failsafe: Any system call which does a VOP_OPEN()/VOP_CLOSE will now correctly wait for any geom events it posted as part of spoils or tastes. Assert that topology and Giant is not held in g_waitidle(). Notes: svn path=/head/; revision=136837
* Rework how we store process times in the kernel such that we always storeJohn Baldwin2004-10-051-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | the raw values including for child process statistics and only compute the system and user timevals on demand. - Fix the various kern_wait() syscall wrappers to only pass in a rusage pointer if they are going to use the result. - Add a kern_getrusage() function for the ABI syscalls to use so that they don't have to play stackgap games to call getrusage(). - Fix the svr4_sys_times() syscall to just call calcru() to calculate the times it needs rather than calling getrusage() twice with associated stackgap, etc. - Add a new rusage_ext structure to store raw time stats such as tick counts for user, system, and interrupt time as well as a bintime of the total runtime. A new p_rux field in struct proc replaces the same inline fields from struct proc (i.e. p_[isu]ticks, p_[isu]u, and p_runtime). A new p_crux field in struct proc contains the "raw" child time usage statistics. ruadd() has been changed to handle adding the associated rusage_ext structures as well as the values in rusage. Effectively, the values in rusage_ext replace the ru_utime and ru_stime values in struct rusage. These two fields in struct rusage are no longer used in the kernel. - calcru() has been split into a static worker function calcru1() that calculates appropriate timevals for user and system time as well as updating the rux_[isu]u fields of a passed in rusage_ext structure. calcru() uses a copy of the process' p_rux structure to compute the timevals after updating the runtime appropriately if any of the threads in that process are currently executing. It also now only locks sched_lock internally while doing the rux_runtime fixup. calcru() now only requires the caller to hold the proc lock and calcru1() only requires the proc lock internally. calcru() also no longer allows callers to ask for an interrupt timeval since none of them actually did. - calcru() now correctly handles threads executing on other CPUs. - A new calccru() function computes the child system and user timevals by calling calcru1() on p_crux. Note that this means that any code that wants child times must now call this function rather than reading from p_cru directly. This function also requires the proc lock. - This finishes the locking for rusage and friends so some of the Giant locks in exit1() and kern_wait() are now gone. - The locking in ttyinfo() has been tweaked so that a shared lock of the proctree lock is used to protect the process group rather than the process group lock. By holding this lock until the end of the function we now ensure that the process/thread that we pick to dump info about will no longer vanish while we are trying to output its info to the console. Submitted by: bde (mostly) MFC after: 1 month Notes: svn path=/head/; revision=136152
* Don't try to protect td_sticks with sched_lock. It doesn't need it as itJohn Baldwin2004-09-231-3/+1
| | | | | | | is only accessed by curthread. Notes: svn path=/head/; revision=135635
* Various small style fixes.John Baldwin2004-09-221-1/+2
| | | | Notes: svn path=/head/; revision=135573
* Remove an unneeded argument..Julian Elischer2004-08-311-1/+1
| | | | | | | | | | | | The removed argument could trivially be derived from the remaining one. That in turn should be the same as curthread, but it is possible that curthread could be expensive to derive on some syste,s so leave it as an argument. Having both proc and thread as an argumen tjust gives an opportunity for them to get out sync. MFC after: 3 days Notes: svn path=/head/; revision=134571
* Remove sched_free_thread() which was only usedJulian Elischer2004-08-311-3/+0
| | | | | | | | | | | in diagnostics. It has outlived its usefulness and has started causing panics for people who turn on DIAGNOSTIC, in what is otherwise good code. MFC after: 2 days Notes: svn path=/head/; revision=134568
* Call thread_user_enter for M:N thread, ast() should be treated as anotherDavid Xu2004-08-081-0/+2
| | | | | | | entrance of kernel. Notes: svn path=/head/; revision=133340
* - Move TDF_OWEPREEMPT, TDF_OWEUPC, and TDF_USTATCLOCK over to td_pflagsJohn Baldwin2004-07-161-5/+5
| | | | | | | | | | | | since they are only accessed by curthread and thus do not need any locking. - Move pr_addr and pr_ticks out of struct uprof (which is per-process) and directly into struct thread as td_profil_addr and td_profil_ticks as these variables are really per-thread. (They are used to defer an addupc_intr() that was too "hard" until ast()). Notes: svn path=/head/; revision=132266
* - Change mi_switch() and sched_switch() to accept an optional thread toJohn Baldwin2004-07-021-1/+1
| | | | | | | | | | | | | | | | 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. Notes: svn path=/head/; revision=131473
* Tidy up uprof locking. Mostly the fields are protected by both the procJohn Baldwin2004-07-021-8/+6
| | | | | | | | | | lock and sched_lock so they can be read with either lock held. Document the locking as well. The one remaining bogosity is that pr_addr and pr_ticks should be per-thread but profiling of multithreaded apps is currently undefined. Notes: svn path=/head/; revision=131437
* Remove unused variable.Julian Elischer2004-03-311-2/+0
| | | | Notes: svn path=/head/; revision=127661
* Push Giant down a little further:Peter Wemm2004-03-131-2/+1
| | | | | | | | | | | | | | | | | | - no longer serialize on Giant for thread_single*() and family in fork, exit and exec - thread_wait() is mpsafe, assert no Giant - reduce scope of Giant in exit to not cover thread_wait and just do vm_waitproc(). - assert that thread_single() family are not called with Giant - remove the DROP/PICKUP_GIANT macros from thread_single() family - assert that thread_suspend_check() s not called with Giant - remove manual drop_giant hack in thread_suspend_check since we know it isn't held. - remove the DROP/PICKUP_GIANT macros from thread_suspend_check() family - mark kse_create() mpsafe Notes: svn path=/head/; revision=126932
* Put "failed to set signal flags properly for ast()" check underRobert Watson2004-03-051-1/+1
| | | | | | | | | | | | | DIAGNOSTIC instead of INVARIANTS. INVARIANTS is intended for tests that don't substantially change code flow or behavior (passive), but this test required locking both the proc lock and scheduler lock in order to execute. It also appears to be a very advisory diagnostic as opposed to an invariant violation. Following discussion with: bde Notes: svn path=/head/; revision=126661
* Locking for the per-process resource limits structure.John Baldwin2004-02-041-4/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | - struct plimit includes a mutex to protect a reference count. The plimit structure is treated similarly to struct ucred in that is is always copy on write, so having a reference to a structure is sufficient to read from it without needing a further lock. - The proc lock protects the p_limit pointer and must be held while reading limits from a process to keep the limit structure from changing out from under you while reading from it. - Various global limits that are ints are not protected by a lock since int writes are atomic on all the archs we support and thus a lock wouldn't buy us anything. - All accesses to individual resource limits from a process are abstracted behind a simple lim_rlimit(), lim_max(), and lim_cur() API that return either an rlimit, or the current or max individual limit of the specified resource from a process. - dosetrlimit() was renamed to kern_setrlimit() to match existing style of other similar syscall helper functions. - The alpha OSF/1 compat layer no longer calls getrlimit() and setrlimit() (it didn't used the stackgap when it should have) but uses lim_rlimit() and kern_setrlimit() instead. - The svr4 compat no longer uses the stackgap for resource limits calls, but uses lim_rlimit() and kern_setrlimit() instead. - The ibcs2 compat no longer uses the stackgap for resource limits. It also no longer uses the stackgap for accessing sysctl's for the ibcs2_sysconf() syscall but uses kernel_sysctl() instead. As a result, ibcs2_sysconf() no longer needs Giant. - The p_rlimit macro no longer exists. Submitted by: mtm (mostly, I only did a few cleanups and catchups) Tested on: i386 Compiled on: alpha, amd64 Notes: svn path=/head/; revision=125454
* - Add a flags parameter to mi_switch. The value of flags may be SW_VOL orJeff Roberson2004-01-251-2/+1
| | | | | | | | | | | | | SW_INVOL. Assert that one of these is set in mi_switch() and propery adjust the rusage statistics. This is to simplify the large number of users of this interface which were previously all required to adjust the proper counter prior to calling mi_switch(). This also facilitates more switch and locking optimizations. - Change all callers of mi_switch() to pass the appropriate paramter and remove direct references to the process statistics. Notes: svn path=/head/; revision=124944
* Log involuntary context switches correctly.Peter Wemm2003-09-051-2/+2
| | | | Notes: svn path=/head/; revision=119781
* kse.h is not needed for these files.David Xu2003-08-051-1/+0
| | | | Notes: svn path=/head/; revision=118488
* When ktracing context switches, make sure we record involuntary switches.Peter Wemm2003-07-311-0/+14
| | | | | | | | Otherwise, when we get a evicted from the cpu, there is no record of it. This is not a default ktrace flag. Notes: svn path=/head/; revision=118240
* o Change kse_thr_interrupt to allow send a signal to a specified thread,David Xu2003-06-281-15/+2
| | | | | | | | | | | | | | | | | | | | or unblock a thread in kernel, and allow UTS to specify whether syscall should be restarted. o Add ability for UTS to monitor signal comes in and removed from process, the flag PS_SIGEVENT is used to indicate the events. o Add a KMF_WAITSIGEVENT for KSE mailbox flag, UTS call kse_release with this flag set to wait for above signal event. o For SA based thread, kernel masks all signal in its signal mask, let UTS to use kse_thr_interrupt interrupt a thread, and install a signal frame in userland for the thread. o Add a tm_syncsig in thread mailbox, when a hardware trap occurs, it is used to deliver synchronous signal to userland, and upcall is schedule, so UTS can process the synchronous signal for the thread. Reviewed by: julian (mentor) Notes: svn path=/head/; revision=116963
* 1. Add code to support bound thread. when blocked, a bound thread neverDavid Xu2003-06-151-1/+1
| | | | | | | | | | schedules an upcall. Signal delivering to a bound thread is same as non-threaded process. This is intended to be used by libpthread to implement PTHREAD_SCOPE_SYSTEM thread. 2. Simplify kse_release() a bit, remove sleep loop. Notes: svn path=/head/; revision=116401
* Rename P_THREADED to P_SA. P_SA means a process is using schedulerDavid Xu2003-06-151-2/+2
| | | | | | | activations. Notes: svn path=/head/; revision=116361
* Use __FBSDID().David E. O'Brien2003-06-111-1/+3
| | | | Notes: svn path=/head/; revision=116182
* - Merge struct procsig with struct sigacts.John Baldwin2003-05-131-0/+2
| | | | | | | | | | | | | | | | | | | | - Move struct sigacts out of the u-area and malloc() it using the M_SUBPROC malloc bucket. - Add a small sigacts_*() API for managing sigacts structures: sigacts_alloc(), sigacts_free(), sigacts_copy(), sigacts_share(), and sigacts_shared(). - Remove the p_sigignore, p_sigacts, and p_sigcatch macros. - Add a mutex to struct sigacts that protects all the members of the struct. - Add sigacts locking. - Remove Giant from nosys(), kill(), killpg(), and kern_sigaction() now that sigacts is locked. - Several in-kernel functions such as psignal(), tdsignal(), trapsignal(), and thread_stopped() are now MP safe. Reviewed by: arch@ Approved by: re (rwatson) Notes: svn path=/head/; revision=114983
* The signotify() sanity check in userret() doesn't need Giant anymore.John Baldwin2003-04-231-2/+0
| | | | Notes: svn path=/head/; revision=113924
* - Move PS_PROFIL and its new cousin PS_STOPPROF back over to p_flag andJohn Baldwin2003-04-221-6/+3
| | | | | | | | | | rename them appropriately. Protect both flags with both the proc lock and the sched_lock. - Protect p_profthreads with the proc lock. - Remove Giant from profil(2). Notes: svn path=/head/; revision=113874
* Tweak locking in the PS_XCPU handler to hold the sched_lock while readingJohn Baldwin2003-04-171-4/+5
| | | | | | | p_runtime. Notes: svn path=/head/; revision=113636
* - Move p->p_sigmask to td->td_sigmask. Signal masks will be per thread withJeff Roberson2003-03-311-4/+5
| | | | | | | | | | a follow on commit to kern_sig.c - signotify() now operates on a thread since unmasked pending signals are stored in the thread. - PS_NEEDSIGCHK moves to TDF_NEEDSIGCHK. Notes: svn path=/head/; revision=112888
* - Change trapsignal() to accept a thread and not a proc.Jeff Roberson2003-03-311-1/+1
| | | | | | | | | | - Change all consumers to pass in a thread. Right now this does not cause any functional changes but it will be important later when signals can be delivered to specific threads. Notes: svn path=/head/; revision=112883
* Fix signal delivering bug for threaded process.David Xu2003-03-111-2/+8
| | | | Notes: svn path=/head/; revision=112077
* Replace calls to WITNESS_SLEEP() and witness_list() with equivalent callsJohn Baldwin2003-03-041-4/+1
| | | | | | | to WITNESS_WARN(). Notes: svn path=/head/; revision=111883
* Change the process flags P_KSES to be P_THREADED.Julian Elischer2003-02-271-2/+2
| | | | | | | This is just a cosmetic change but I've been meaning to do it for about a year. Notes: svn path=/head/; revision=111585
* - Add a new function, thread_signal_add(), that is called from postsig toJeff Roberson2003-02-171-1/+8
| | | | | | | | | | | add a signal to a mailbox's pending set. - Add a new function, thread_signal_upcall(), this causes the current thread to upcall so that we can deliver pending signals. Reviewed by: mini Notes: svn path=/head/; revision=111033
* Move a bunch of flags from the KSE to the thread.Julian Elischer2003-02-171-9/+8
| | | | | | | | | | | I was in two minds as to where to put them in the first case.. I should have listenned to the other mind. Submitted by: parts by davidxu@ Reviewed by: jeff@ mini@ Notes: svn path=/head/; revision=111032
* - Move ke_sticks, ke_iticks, ke_uticks, ke_uu, ke_su, and ke_iu back intoJeff Roberson2003-02-171-2/+2
| | | | | | | | | | the proc. These counters are only examined through calcru. Submitted by: davidxu Tested on: x86, alpha, UP/SMP Notes: svn path=/head/; revision=111024
* Reversion of commit by Davidxu plus fixes since applied.Julian Elischer2003-02-011-32/+24
| | | | | | | | | | | I'm not convinced there is anything major wrong with the patch but them's the rules.. I am using my "David's mentor" hat to revert this as he's offline for a while. Notes: svn path=/head/; revision=110190
* Use a local variable to store the number of ticks that elapsed inTim J. Robbins2003-01-311-2/+3
| | | | | | | | kernel mode instead of (unintentionally) using the global `ticks'. This error completely broke profiling. Notes: svn path=/head/; revision=110140
* Move UPCALL related data structure out of kse, introduce a newDavid Xu2003-01-261-24/+31
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | data structure called kse_upcall to manage UPCALL. All KSE binding and loaning code are gone. A thread owns an upcall can collect all completed syscall contexts in its ksegrp, turn itself into UPCALL mode, and takes those contexts back to userland. Any thread without upcall structure has to export their contexts and exit at user boundary. Any thread running in user mode owns an upcall structure, when it enters kernel, if the kse mailbox's current thread pointer is not NULL, then when the thread is blocked in kernel, a new UPCALL thread is created and the upcall structure is transfered to the new UPCALL thread. if the kse mailbox's current thread pointer is NULL, then when a thread is blocked in kernel, no UPCALL thread will be created. Each upcall always has an owner thread. Userland can remove an upcall by calling kse_exit, when all upcalls in ksegrp are removed, the group is atomatically shutdown. An upcall owner thread also exits when process is in exiting state. when an owner thread exits, the upcall it owns is also removed. KSE is a pure scheduler entity. it represents a virtual cpu. when a thread is running, it always has a KSE associated with it. scheduler is free to assign a KSE to thread according thread priority, if thread priority is changed, KSE can be moved from one thread to another. When a ksegrp is created, there is always N KSEs created in the group. the N is the number of physical cpu in the current system. This makes it is possible that even an userland UTS is single CPU safe, threads in kernel still can execute on different cpu in parallel. Userland calls kse_create to add more upcall structures into ksegrp to increase concurrent in userland itself, kernel is not restricted by number of upcalls userland provides. The code hasn't been tested under SMP by author due to lack of hardware. Reviewed by: julian Notes: svn path=/head/; revision=109877
* Add code to ddb to allow backtracing an arbitrary thread.Julian Elischer2002-12-281-1/+0
| | | | | | | | | | | | | | | | | | | | | | | | | | | (show thread {address}) Remove the IDLE kse state and replace it with a change in the way threads sahre KSEs. Every KSE now has a thread, which is considered its "owner" however a KSE may also be lent to other threads in the same group to allow completion of in-kernel work. n this case the owner remains the same and the KSE will revert to the owner when the other work has been completed. All creations of upcalls etc. is now done from kse_reassign() which in turn is called from mi_switch or thread_exit(). This means that special code can be removed from msleep() and cv_wait(). kse_release() does not leave a KSE with no thread any more but converts the existing thread into teh KSE's owner, and sets it up for doing an upcall. It is just inhibitted from being scheduled until there is some reason to do an upcall. Remove all trace of the kse_idle queue since it is no-longer needed. "Idle" KSEs are now on the loanable queue. Notes: svn path=/head/; revision=108338
* To reduce per-return overhead of userret(), call intoRobert Watson2002-11-081-4/+7
| | | | | | | | | | | | | | | | | | mac_thread_userret() only if PS_MACPEND is set in the process AST mask. This avoids the cost of the entry point in the common case, but requires policies interested in the userret event to set the flag (protected by the scheduler lock) if they do want the event. Since all the policies that we're working with which use mac_thread_userret() use the entry point only selectively to perform operations deferred for locking reasons, this maintains the desired semantics. Approved by: re Requested by: bde Obtained from: TrustedBSD Project Sponsored by: DARPA, Network Associates Laboratories Notes: svn path=/head/; revision=106655
* iBack out david's last commit. the suspension code needs to be calledJulian Elischer2002-10-261-2/+13
| | | | | | | for non KSE processes too. Notes: svn path=/head/; revision=105974
* Move suspension checking code from userret() into thread_userret().David Xu2002-10-261-13/+2
| | | | Notes: svn path=/head/; revision=105972
* - Create a new scheduler api that is defined in sys/sched.hJeff Roberson2002-10-121-14/+4
| | | | | | | | | | | | | - 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
* - Move p_cpulimit to struct proc from struct plimit and protect it withJohn Baldwin2002-10-091-3/+4
| | | | | | | | | | | | | | | | | | sched_lock. This means that we no longer access p_limit in mi_switch() and the p_limit pointer can be protected by the proc lock. - Remove PRS_ZOMBIE check from CPU limit test in mi_switch(). PRS_ZOMBIE processes don't call mi_switch(), and even if they did there is no longer the danger of p_limit being NULL (which is what the original zombie check was added for). - When we bump the current processes soft CPU limit in ast(), just bump the private p_cpulimit instead of the shared rlimit. This fixes an XXX for some value of fix. There is still a (probably benign) bug in that this code doesn't check that the new soft limit exceeds the hard limit. Inspired by: bde (2) Notes: svn path=/head/; revision=104719
* Access td->td_kse inside sched_lock.Juli Mallett2002-10-021-2/+2
| | | | | | | Submitted by: julian Notes: svn path=/head/; revision=104383
* De-obfuscate local use of members of 'struct thread', for which we haveJuli Mallett2002-10-021-3/+4
| | | | | | | local variables, and group assignment. Notes: svn path=/head/; revision=104378
* Add a new MAC entry point, mac_thread_userret(td), which permits policyRobert Watson2002-10-021-0/+6
| | | | | | | | | | | | | | | | | | | modules to perform MAC-related events when a thread returns to user space. This is required for policies that have floating process labels, as it's not always possible to acquire the process lock at arbitrary points in the stack during system call processing; process labels might represent traditional authentication data, process history information, or other data. LOMAC will use this entry point to perform the process label update prior to the thread returning to userspace, when plugged into the MAC framework. Obtained from: TrustedBSD Project Sponsored by: DARPA, Network Associates Laboratories Notes: svn path=/head/; revision=104338
* Back our kernel support for reliable signal queues.Juli Mallett2002-10-011-3/+1
| | | | | | | Requested by: rwatson, phk, and many others Notes: svn path=/head/; revision=104306