diff options
author | Zbigniew Bodek <zbb@FreeBSD.org> | 2015-11-27 18:19:11 +0000 |
---|---|---|
committer | Zbigniew Bodek <zbb@FreeBSD.org> | 2015-11-27 18:19:11 +0000 |
commit | 5bb01ba335a75ac10d4a8723101b1fc88ffa2397 (patch) | |
tree | 645b775f513f6c80dfbe0dd1ce3d6fd2e32caa2f | |
parent | bbcfaa4eb8d2dd993c46f4432caa148b8f48e9ff (diff) | |
download | src-5bb01ba335a75ac10d4a8723101b1fc88ffa2397.tar.gz src-5bb01ba335a75ac10d4a8723101b1fc88ffa2397.zip |
Run callouts during infinite waiting inside cv_wait
During cv_wait we may be waiting for an event triggered by callout.
Run callbacks here to avoid code blocking.
Reviewed by: hselasky
Submitted by: Wojciech Macek <wma@semihalf.com>
Obtained from: Semihalf
Sponsored by: Juniper Networks Inc.
Differential Revision: https://reviews.freebsd.org/D4144
Notes
Notes:
svn path=/head/; revision=291403
-rw-r--r-- | sys/boot/kshim/bsd_kernel.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/sys/boot/kshim/bsd_kernel.c b/sys/boot/kshim/bsd_kernel.c index d41b9f4dc0de..eaa437cb23a2 100644 --- a/sys/boot/kshim/bsd_kernel.c +++ b/sys/boot/kshim/bsd_kernel.c @@ -138,6 +138,7 @@ cv_timedwait(struct cv *cv, struct mtx *mtx, int timo) { int start = ticks; int delta; + int time = 0; if (cv->sleeping) return (EWOULDBLOCK); /* not allowed */ @@ -154,6 +155,14 @@ cv_timedwait(struct cv *cv, struct mtx *mtx, int timo) usb_idle(); + if (++time >= (1000000 / hz)) { + time = 0; + callout_process(1); + } + + /* Sleep for 1 us */ + delay(1); + mtx_lock(mtx); } |