diff options
author | attilio <attilio@FreeBSD.org> | 2010-01-24 15:07:00 +0000 |
---|---|---|
committer | attilio <attilio@FreeBSD.org> | 2010-01-24 15:07:00 +0000 |
commit | a4281bb8848a39a697bf8c77c4e958baf048bdea (patch) | |
tree | b9469e81eedd64257cbfcad33ebdccc86a58a8d2 /sys/sys/kthread.h | |
parent | 62a013da482cd3be2013620de2512c32e56adb68 (diff) | |
download | FreeBSD-src-a4281bb8848a39a697bf8c77c4e958baf048bdea.zip FreeBSD-src-a4281bb8848a39a697bf8c77c4e958baf048bdea.tar.gz |
- Fix the kthread_{suspend, resume, suspend_check}() locking.
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
Diffstat (limited to 'sys/sys/kthread.h')
-rw-r--r-- | sys/sys/kthread.h | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/sys/sys/kthread.h b/sys/sys/kthread.h index e4d9c5a..b06ff69 100644 --- a/sys/sys/kthread.h +++ b/sys/sys/kthread.h @@ -73,7 +73,7 @@ int kthread_resume(struct thread *); void kthread_shutdown(void *, int); void kthread_start(const void *); int kthread_suspend(struct thread *, int); -void kthread_suspend_check(struct thread *); +void kthread_suspend_check(void); #endif /* !_SYS_KTHREAD_H_ */ |