diff options
author | davidxu <davidxu@FreeBSD.org> | 2010-10-09 02:50:23 +0000 |
---|---|---|
committer | davidxu <davidxu@FreeBSD.org> | 2010-10-09 02:50:23 +0000 |
commit | 55194e796cd9e8eb27d9bb4ec9f07184e390d01a (patch) | |
tree | 84ad0652e39fc58da6ca522cc6bf55a188109780 /sys/kern/sys_process.c | |
parent | 6afff59f3c11c8f879672f8dbcb0a74bcbae79a5 (diff) | |
download | FreeBSD-src-55194e796cd9e8eb27d9bb4ec9f07184e390d01a.zip FreeBSD-src-55194e796cd9e8eb27d9bb4ec9f07184e390d01a.tar.gz |
Create a global thread hash table to speed up thread lookup, use
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
Diffstat (limited to 'sys/kern/sys_process.c')
-rw-r--r-- | sys/kern/sys_process.c | 17 |
1 files changed, 3 insertions, 14 deletions
diff --git a/sys/kern/sys_process.c b/sys/kern/sys_process.c index 525c0e2..af6b298 100644 --- a/sys/kern/sys_process.c +++ b/sys/kern/sys_process.c @@ -721,24 +721,13 @@ kern_ptrace(struct thread *td, int req, pid_t pid, void *addr, int data) return (ESRCH); } } else { - /* this is slow, should be optimized */ - sx_slock(&allproc_lock); - FOREACH_PROC_IN_SYSTEM(p) { - PROC_LOCK(p); - FOREACH_THREAD_IN_PROC(p, td2) { - if (td2->td_tid == pid) - break; - } - if (td2 != NULL) - break; /* proc lock held */ - PROC_UNLOCK(p); - } - sx_sunlock(&allproc_lock); - if (p == NULL) { + td2 = tdfind(pid, -1); + if (td2 == NULL) { if (proctree_locked) sx_xunlock(&proctree_lock); return (ESRCH); } + p = td2->td_proc; tid = pid; pid = p->p_pid; } |