diff options
author | kib <kib@FreeBSD.org> | 2011-01-18 21:57:02 +0000 |
---|---|---|
committer | kib <kib@FreeBSD.org> | 2011-01-18 21:57:02 +0000 |
commit | ef4e87bddcc27bda52c43072b85057f15a55b294 (patch) | |
tree | 07343029e503726ca752719a3c514cfa7fe23db6 /sys/arm | |
parent | fd06f750d54c2227cbe9f81185e43b1c51646032 (diff) | |
download | FreeBSD-src-ef4e87bddcc27bda52c43072b85057f15a55b294.zip FreeBSD-src-ef4e87bddcc27bda52c43072b85057f15a55b294.tar.gz |
For architectures not using direct map , and requiring real KVA page for
sf buf allocation, use wakeup() instead of wakeup_one() to notify sf
buffer waiters about free buffer.
sf_buf_alloc() calls msleep(PCATCH) when SFB_CATCH flag was given,
and for simultaneous wakeup and signal delivery, msleep() returns
EINTR/ERESTART despite the thread was selected for wakeup_one(). As
result, we loose a wakeup, and some other waiter will not be woken up.
Reported and tested by: az
Reviewed by: alc, jhb
MFC after: 1 week
Diffstat (limited to 'sys/arm')
-rw-r--r-- | sys/arm/arm/vm_machdep.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/sys/arm/arm/vm_machdep.c b/sys/arm/arm/vm_machdep.c index 9b530ab..05015e9 100644 --- a/sys/arm/arm/vm_machdep.c +++ b/sys/arm/arm/vm_machdep.c @@ -175,7 +175,7 @@ sf_buf_free(struct sf_buf *sf) sf->m = NULL; LIST_REMOVE(sf, list_entry); if (sf_buf_alloc_want > 0) - wakeup_one(&sf_buf_freelist); + wakeup(&sf_buf_freelist); } mtx_unlock(&sf_buf_lock); #endif |