summaryrefslogtreecommitdiff
path: root/sys/kern/kern_kthread.c
Commit message (Collapse)AuthorAgeFilesLines
* Provide ABI modules hooks for process exec/exit and thread exit.Konstantin Belousov2020-11-231-0/+5
| | | | | | | | | | | | | | | Exec and exit are same as corresponding eventhandler hooks. Thread exit hook is called somewhat earlier, while thread is still owned by the process and enough context is available. Note that the process lock is owned when the hook is called. Reviewed by: markj Sponsored by: The FreeBSD Foundation Differential revision: https://reviews.freebsd.org/D27309 Notes: svn path=/head/; revision=367959
* thread: rework tidhash vs proc lock interactionMateusz Guzik2020-11-111-4/+1
| | | | | | | | Apart from minor clean up this gets rid of proc unlock/lock cycle on thread exit to work around LOR against tidhash lock. Notes: svn path=/head/; revision=367584
* Do a lockless check in kthread_suspend_checkMateusz Guzik2020-07-251-4/+7
| | | | | | | | | | Otherwise an idle system running lockstat sleep 10 reports contention on process lock comming from bufdaemon. While here fix a style nit. Notes: svn path=/head/; revision=363511
* Remove duplicated empty lines from kern/*.cMateusz Guzik2020-01-301-1/+0
| | | | | | | No functional changes. Notes: svn path=/head/; revision=357312
* schedlock 1/4Jeff Roberson2019-12-151-2/+2
| | | | | | | | | | | | | | | Eliminate recursion from most thread_lock consumers. Return from sched_add() without the thread_lock held. This eliminates unnecessary atomics and lock word loads as well as reducing the hold time for scheduler locks. This will eventually allow for lockless remote adds. Discussed with: kib Reviewed by: jhb Tested by: pho Differential Revision: https://reviews.freebsd.org/D22626 Notes: svn path=/head/; revision=355779
* proc: always store parent pid in p_oppidMateusz Guzik2018-11-161-1/+1
| | | | | | | | | | | | Doing so removes the dependency on proctree lock from sysctl process list export which further reduces contention during poudriere -j 128 runs. Reviewed by: kib (previous version) Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D17825 Notes: svn path=/head/; revision=340482
* hwpmc: log name->pid, name->tid mappingsMatt Macy2018-06-051-1/+14
| | | | | | | | | | | | | | By logging all threads and processes 'pmc filter' can now filter on process or thread name, relieving the user of the burden of determining which tid or pid was which when the sample was taken. % pmc filter -T if_io_tqg -P nginx pmc.log pmc-iflib.log % pmc filter -x -T idle pmc.log pmc-noidle.log Notes: svn path=/head/; revision=334647
* Implement several enhancements to NUMA policies.Jeff Roberson2018-03-291-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | | Add a new "interleave" allocation policy which stripes pages across domains with a stride or width keeping contiguity within a multi-page region. Move the kernel to the dedicated numbered cpuset #2 making it possible to assign kernel threads and memory policy separately from user. This also eliminates the need for the complicated interrupt binding code. Add a sysctl API for viewing and manipulating domainsets. Refactor some of the cpuset_t manipulation code using the generic bitset type so that it can be used for both. This probably belongs in a dedicated subr file. Attempt to improve the include situation. Reviewed by: kib Discussed with: jhb (cpuset parts) Tested by: pho (before review feedback) Sponsored by: Netflix, Dell/EMC Isilon Differential Revision: https://reviews.freebsd.org/D14839 Notes: svn path=/head/; revision=331723
* Instrument thread creations for the the benefit of the TSLOG framework.Colin Percival2017-12-311-0/+4
| | | | | | | | This assists in tracking time spent while the boot is being "held" waiting for something to happen. Notes: svn path=/head/; revision=327431
* sys/kern: adoption of SPDX licensing ID tags.Pedro F. Giffuni2017-11-271-0/+2
| | | | | | | | | | | | | | | Mainly focus on files that use BSD 2-Clause license, however the tool I was using misidentified many licenses so this was mostly a manual - error prone - task. The Software Package Data Exchange (SPDX) group provides a specification to make it easier for automated tools to detect and summarize well known opensource licenses. We are gradually adopting the specification, noting that the tags are considered only advisory and do not, in any way, superceed or replace the license texts. Notes: svn path=/head/; revision=326271
* Re-schedule signals after kthread exits, since apparently there areKonstantin Belousov2016-08-101-4/+7
| | | | | | | | | | | | | processes which combine kernel and non-kernel threads, e.g. nfsd. For such processes, termination of a kthread must recheck signal delivery among other threads according to masks. Reported and tested by: pho Sponsored by: The FreeBSD Foundation MFC after: 1 week Notes: svn path=/head/; revision=303914
* Update comments for the MD functions managing contexts for newKonstantin Belousov2016-06-161-8/+5
| | | | | | | | | | | | | | | | | | | threads, to make it less confusing and using modern kernel terms. Rename the functions to reflect current use of the functions, instead of the historic KSE conventions: cpu_set_fork_handler -> cpu_fork_kthread_handler (for kthreads) cpu_set_upcall -> cpu_copy_thread (for forks) cpu_set_upcall_kse -> cpu_set_upcall (for new threads creation) Reviewed by: jhb (previous version) Sponsored by: The FreeBSD Foundation MFC after: 1 week Approved by: re (hrs) Differential revision: https://reviews.freebsd.org/D6731 Notes: svn path=/head/; revision=301961
* kern: for pointers replace 0 with NULL.Pedro F. Giffuni2016-04-151-1/+1
| | | | | | | | | These are mostly cosmetical, no functional change. Found with devel/coccinelle. Notes: svn path=/head/; revision=298069
* Rename P_KTHREAD struct proc p_flag to P_KPROC.Konstantin Belousov2016-02-091-4/+4
| | | | | | | | | | | I left as is an apparent bug in ntoskrnl_var.h:AT_PASSIVE_LEVEL() definition. Suggested by: jhb Sponsored by: The FreeBSD Foundation Notes: svn path=/head/; revision=295435
* fork: pass arguments to fork1 in a dedicated structureMateusz Guzik2016-02-041-2/+6
| | | | | | | Suggested by: kib Notes: svn path=/head/; revision=295232
* Limit rights on process descriptors.Ed Schouten2015-07-311-1/+1
| | | | | | | | | | | | | | | | | | | | | On CloudABI, the rights bits returned by cap_rights_get() match up with the operations that you can actually perform on the file descriptor. Limiting the rights is good, because it makes it easier to get uniform behaviour across different operating systems. If process descriptors on FreeBSD would suddenly gain support for any new file operation, this wouldn't become exposed to CloudABI processes without first extending the rights. Extend fork1() to gain a 'struct filecaps' argument that allows you to construct process descriptors with custom rights. Use this in cloudabi_sys_proc_fork() to limit the rights to just fstat() and pdwait(). Obtained from: https://github.com/NuxiNL/freebsd Notes: svn path=/head/; revision=286122
* The si_status field of the siginfo_t, provided by the waitid(2) andKonstantin Belousov2015-07-181-1/+1
| | | | | | | | | | | | | | | | | | | SIGCHLD signal, should keep full 32 bits of the status passed to the _exit(2). Split the combined p_xstat of the struct proc into the separate exit status p_xexit for normal process exit, and signalled termination information p_xsig. Kernel-visible macro KW_EXITCODE() reconstructs old p_xstat from p_xexit and p_xsig. p_xexit contains complete status and copied out into si_status. Requested by: Joerg Schilling Reviewed by: jilles (previous version), pho Tested by: pho Sponsored by: The FreeBSD Foundation Notes: svn path=/head/; revision=285670
* Ansify another function. This is the last in the file, I hope.Mark Murray2015-06-281-2/+1
| | | | Notes: svn path=/head/; revision=284910
* ANSIfy the only function that uses K&R definition in this file.Mark Murray2015-06-281-2/+1
| | | | Notes: svn path=/head/; revision=284909
* Generalised support for copy-on-write structures shared by threads.Mateusz Guzik2015-06-101-1/+1
| | | | | | | | | | | | Thread credentials are maintained as follows: each thread has a pointer to creds and a reference on them. The pointer is compared with proc's creds on userspace<->kernel boundary and updated if needed. This patch introduces a counter which can be compared instead, so that more structures can use this scheme without adding more comparisons on the boundary. Notes: svn path=/head/; revision=284214
* The umtx_lock mutex is used by top-half of the kernel, but isKonstantin Belousov2015-02-281-0/+2
| | | | | | | | | | | | | | | | | | | | currently a spin lock. Apparently, the only reason for this is that umtx_thread_exit() is called under the process spinlock, which put the requirement on the umtx_lock. Note that the witness static order list is wrong for the umtx_lock, umtx_lock is explicitely before any thread lock, so it is also before sleepq locks. Change umtx_lock to be the sleepable mutex. For the reason above, the calls to umtx_thread_exit() are moved from thread_exit() earlier in each caller, when the process spin lock is not yet taken. Discussed with: jhb Tested by: pho (previous version) Sponsored by: The FreeBSD Foundation MFC after: 3 weeks Notes: svn path=/head/; revision=279390
* Do not use potentially stale thread in kthread_add()Bryan Venteicher2013-08-171-6/+4
| | | | | | | | | | | | When an existing process is provided, the thread selected to use to initialize the new thread could have exited and be reaped. Acquire the proc lock earlier to ensure the thread remains valid. Reviewed by: jhb, julian (previous version) MFC after: 3 days Notes: svn path=/head/; revision=254457
* Stop treating td_sigmask specially for the purposes of new threadKonstantin Belousov2012-05-261-2/+0
| | | | | | | | | | | | creation. Move it into the copied region of the struct thread. Update some comments. Requested by: bde X-MFC after: never Notes: svn path=/head/; revision=236117
* Revert previous revision, misunderstood the code :(Xin LI2012-05-111-1/+0
| | | | Notes: svn path=/head/; revision=235301
* Release proc lock after setting signal queue.Xin LI2012-05-111-0/+1
| | | | | | | | | PR: kern/167727 Submitted by: Jinjun Gao <gjinjun gmail com> MFC after: 2 weeks Notes: svn path=/head/; revision=235300
* Add a new sched_clear_name() method to the scheduler interface to clearJohn Baldwin2012-03-081-0/+6
| | | | | | | | | | | the cached name used for KTR_SCHED traces when a thread's name changes. This way KTR_SCHED traces (and thus schedgraph) will notice when a thread's name changes, most commonly via execve(). MFC after: 2 weeks Notes: svn path=/head/; revision=232700
* Whenever a new kernel thread is spawned, explicitly clear any CPU affinityRyan Stone2012-02-041-0/+7
| | | | | | | | | | | | set on the new thread. This prevents the thread from inadvertently inheriting affinity from a random sibling. Submitted by: attilio Tested by: pho MFC after: 1 week Notes: svn path=/head/; revision=230984
* Add experimental support for process descriptorsJonathan Anderson2011-08-181-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | A "process descriptor" file descriptor is used to manage processes without using the PID namespace. This is required for Capsicum's Capability Mode, where the PID namespace is unavailable. New system calls pdfork(2) and pdkill(2) offer the functional equivalents of fork(2) and kill(2). pdgetpid(2) allows querying the PID of the remote process for debugging purposes. The currently-unimplemented pdwait(2) will, in the future, allow querying rusage/exit status. In the interim, poll(2) may be used to check (and wait for) process termination. When a process is referenced by a process descriptor, it does not issue SIGCHLD to the parent, making it suitable for use in libraries---a common scenario when using library compartmentalisation from within large applications (such as web browsers). Some observers may note a similarity to Mach task ports; process descriptors provide a subset of this behaviour, but in a UNIX style. This feature is enabled by "options PROCDESC", but as with several other Capsicum kernel features, is not enabled by default in GENERIC 9.0. Reviewed by: jhb, kib Approved by: re (kib), mentor (rwatson) Sponsored by: Google Inc Notes: svn path=/head/; revision=224987
* - Properly initialize the base priority (td_base_pri) of thread0 to PVMJohn Baldwin2011-01-061-4/+5
| | | | | | | | | | | | | to match the desired priority in td_priority. Otherwise the first time thread0 used a borrowed priority it would drop down to PUSER instead of PVM. - Explicitly initialize the starting priority of new kprocs to PVM to avoid inheriting some random priority from thread0. MFC after: 2 weeks Notes: svn path=/head/; revision=217079
* kproc_exit() is already marked __dead2 so a NOTREACHED comment here isn'tJohn Baldwin2011-01-041-1/+0
| | | | | | | | | needed for lint. Submitted by: bde Notes: svn path=/head/; revision=216954
* Small whitespace nits and add a comment explaining why kthread_exit() canJohn Baldwin2011-01-031-3/+6
| | | | | | | call kproc_exit() that was lost earlier. Notes: svn path=/head/; revision=216921
* In thr_exit() and kthread_exit(), only remove thread fromDavid Xu2010-10-231-1/+5
| | | | | | | | | hash if it can directly exit, otherwise let exit1() do it. The change should be in r213950, but for unknown reason, it was lost. Notes: svn path=/head/; revision=214238
* Create a global thread hash table to speed up thread lookup, useDavid Xu2010-10-091-0/+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 Notes: svn path=/head/; revision=213642
* Allow a const char * to be passed as the process name to kproc_kthread_add()John Baldwin2010-05-211-1/+1
| | | | | | | | | without generating a warning. MFC after: 1 month Notes: svn path=/head/; revision=208390
* Use the cached value within comparison.Attilio Rao2010-02-191-1/+1
| | | | | | | Submitted by: jhb Notes: svn path=/head/; revision=204089
* Fix the grammar.Attilio Rao2010-02-191-4/+4
| | | | | | | Submitted by: Brandon Gooch <bgooch at se dot edu> Notes: svn path=/head/; revision=204088
* Fix a race in regard of p_numthreads.Attilio Rao2010-02-191-9/+8
| | | | | | | | Submitted by: Giovanni Trematerra <giovanni dot trematerra at gmail dot com> Notes: svn path=/head/; revision=204087
* - Fix the kthread_{suspend, resume, suspend_check}() locking.Attilio Rao2010-01-241-18/+52
| | | | | | | | | | | | | | | | | | | | | | | | | | In the current code, the locking is completely broken and may lead easilly to deadlocks. Fix it by using the proc_mtx, linked to the suspending thread, as lock for the operation. Keep using the thread_lock for setting and reading the flag even if it is not entirely necessary (atomic ops may do it as well, but this way the code is more readable). - Fix a deadlock within kthread_suspend(). The suspender should not sleep on a different channel wrt the suspended thread, or, otherwise, the awaker should wakeup both. Uniform the interface to what the kproc_* counterparts do (sleeping on the same channel). - Change the kthread_suspend_check() prototype. kthread_suspend_check() always assumes curthread and must only refer to it, so skip the thread pointer as it may be easilly mistaken. If curthread is not a kthread, the system will panic. In collabouration with: jhb Tested by: Giovanni Trematerra <giovanni dot trematerra at gmail dot com> MFC: 2 weeks Notes: svn path=/head/; revision=202933
* Reintroduce the r196640, after fixing the problem with my testing.Konstantin Belousov2009-09-011-4/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Remove the altkstacks, instead instantiate threads with kernel stack allocated with the right size from the start. For the thread that has kernel stack cached, verify that requested stack size is equial to the actual, and reallocate the stack if sizes differ [1]. This fixes the bug introduced by r173361 that was committed several days after r173004 and consisted of kthread_add(9) ignoring the non-default kernel stack size. Also, r173361 removed the caching of the kernel stacks for a non-first thread in the process. Introduce separate kernel stack cache that keeps some limited amount of preallocated kernel stacks to lower the latency of thread allocation. Add vm_lowmem handler to prune the cache on low memory condition. This way, system with reasonable amount of the threads get lower latency of thread creation, while still not exhausting significant portion of KVA for unused kstacks. Submitted by: peter [1] Discussed with: jhb, julian, peter Reviewed by: jhb Tested by: pho (and retested according to new test scenarious) MFC after: 1 week Notes: svn path=/head/; revision=196730
* Reverse r196640 and r196644 for now.Konstantin Belousov2009-08-291-1/+4
| | | | Notes: svn path=/head/; revision=196648
* Remove the altkstacks, instead instantiate threads with kernel stackKonstantin Belousov2009-08-291-4/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | allocated with the right size from the start. For the thread that has kernel stack cached, verify that requested stack size is equial to the actual, and reallocate the stack if sizes differ [1]. This fixes the bug introduced by r173361 that was committed several days after r173004 and consisted of kthread_add(9) ignoring the non-default kernel stack size. Also, r173361 removed the caching of the kernel stacks for a non-first thread in the process. Introduce separate kernel stack cache that keeps some limited amount of preallocated kernel stacks to lower the latency of thread allocation. Add vm_lowmem handler to prune the cache on low memory condition. This way, system with reasonable amount of the threads get lower latency of thread creation, while still not exhausting significant portion of KVA for unused kstacks. Submitted by: peter [1] Discussed with: jhb, julian, peter Reviewed by: jhb Tested by: pho MFC after: 1 week Notes: svn path=/head/; revision=196640
* Kill a dead variableAntoine Brodin2008-08-031-2/+0
| | | | | | | | PR: 126223 Submitted by: Mateusz Guzik Notes: svn path=/head/; revision=181263
* Document the kproc_kthread_add() callJulian Elischer2008-04-291-1/+2
| | | | | | | | and fix a small detail of its implementation. MFC after: 1 week Notes: svn path=/head/; revision=178682
* - Relax requirements for p_numthreads, p_threads, p_swtick, and p_nice fromJeff Roberson2008-03-191-2/+0
| | | | | | | | | | requiring the per-process spinlock to only requiring the process lock. - Reflect these changes in the proc.h documentation and consumers throughout the kernel. This is a substantial reduction in locking cost for these fields and was made possible by recent changes to threading support. Notes: svn path=/head/; revision=177368
* Acquire the process mutex and spin locks before calling thread_exit() inJohn Baldwin2007-11-151-1/+8
| | | | | | | kthread_exit() to fix panics when using INVARIANTS. Notes: svn path=/head/; revision=173658
* Add support for the pre-exisiting module shutdoen handshake.Julian Elischer2007-10-271-7/+6
| | | | | | | Fix some comments. Notes: svn path=/head/; revision=173052
* If kthread_exit() is called on the last kthread in a kproc, thenJulian Elischer2007-10-261-0/+6
| | | | | | | | all the work in kproc_exit must be done. We don't actually have a user of this yet but why leave it to chance. Notes: svn path=/head/; revision=173046
* kthread_exit needs no stinkin argument.Julian Elischer2007-10-261-2/+5
| | | | Notes: svn path=/head/; revision=173031
* Introduce a way to make pure kernal threads.Julian Elischer2007-10-261-3/+208
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | kthread_add() takes the same parameters as the old kthread_create() plus a pointer to a process structure, and adds a kernel thread to that process. kproc_kthread_add() takes the parameters for kthread_add, plus a process name and a pointer to a pointer to a process instead of just a pointer, and if the proc * is NULL, it creates the process to the specifications required, before adding the thread to it. All other old kthread_xxx() calls return, but act on (struct thread *) instead of (struct proc *). One reason to change the name is so that any old kernel modules that are lying around and expect kthread_create() to make a process will not just accidentally link. fix top to show kernel threads by their thread name in -SH mode add a tdnam formatting option to ps to show thread names. make all idle threads actual kthreads and put them into their own idled process. make all interrupt threads kthreads and put them in an interd process (mainly for aesthetic and accounting reasons) rename proc 0 to be 'kernel' and it's swapper thread is now 'swapper' man page fixes to follow. Notes: svn path=/head/; revision=173004
* Rename the kthread_xxx (e.g. kthread_create()) callsJulian Elischer2007-10-201-7/+7
| | | | | | | | | | | | | | to kproc_xxx as they actually make whole processes. Thos makes way for us to add REAL kthread_create() and friends that actually make theads. it turns out that most of these calls actually end up being moved back to the thread version when it's added. but we need to make this cosmetic change first. I'd LOVE to do this rename in 7.0 so that we can eventually MFC the new kthread_xxx() calls. Notes: svn path=/head/; revision=172836