aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZbigniew Bodek <zbb@FreeBSD.org>2015-11-27 18:19:11 +0000
committerZbigniew Bodek <zbb@FreeBSD.org>2015-11-27 18:19:11 +0000
commit5bb01ba335a75ac10d4a8723101b1fc88ffa2397 (patch)
tree645b775f513f6c80dfbe0dd1ce3d6fd2e32caa2f
parentbbcfaa4eb8d2dd993c46f4432caa148b8f48e9ff (diff)
downloadsrc-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.c9
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);
}