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 | |
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
-rw-r--r-- | sys/arm/arm/vm_machdep.c | 2 | ||||
-rw-r--r-- | sys/i386/i386/vm_machdep.c | 2 | ||||
-rw-r--r-- | sys/mips/mips/vm_machdep.c | 2 | ||||
-rw-r--r-- | sys/powerpc/aim/vm_machdep.c | 2 | ||||
-rw-r--r-- | sys/powerpc/booke/vm_machdep.c | 2 | ||||
-rw-r--r-- | sys/sparc64/sparc64/vm_machdep.c | 2 |
6 files changed, 6 insertions, 6 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 diff --git a/sys/i386/i386/vm_machdep.c b/sys/i386/i386/vm_machdep.c index 68e02fe..232e1a1 100644 --- a/sys/i386/i386/vm_machdep.c +++ b/sys/i386/i386/vm_machdep.c @@ -916,7 +916,7 @@ sf_buf_free(struct sf_buf *sf) LIST_REMOVE(sf, list_entry); #endif if (sf_buf_alloc_want > 0) - wakeup_one(&sf_buf_freelist); + wakeup(&sf_buf_freelist); } mtx_unlock(&sf_buf_lock); } diff --git a/sys/mips/mips/vm_machdep.c b/sys/mips/mips/vm_machdep.c index b4059e6..eb92090 100644 --- a/sys/mips/mips/vm_machdep.c +++ b/sys/mips/mips/vm_machdep.c @@ -528,7 +528,7 @@ sf_buf_free(struct sf_buf *sf) SLIST_INSERT_HEAD(&sf_freelist.sf_head, sf, free_list); nsfbufsused--; if (sf_buf_alloc_want > 0) - wakeup_one(&sf_freelist); + wakeup(&sf_freelist); mtx_unlock(&sf_freelist.sf_lock); } diff --git a/sys/powerpc/aim/vm_machdep.c b/sys/powerpc/aim/vm_machdep.c index 0f7d989..8deb821 100644 --- a/sys/powerpc/aim/vm_machdep.c +++ b/sys/powerpc/aim/vm_machdep.c @@ -347,7 +347,7 @@ sf_buf_free(struct sf_buf *sf) nsfbufsused--; if (sf_buf_alloc_want > 0) - wakeup_one(&sf_buf_freelist); + wakeup(&sf_buf_freelist); } mtx_unlock(&sf_buf_lock); } diff --git a/sys/powerpc/booke/vm_machdep.c b/sys/powerpc/booke/vm_machdep.c index 8d36793..54a0b01 100644 --- a/sys/powerpc/booke/vm_machdep.c +++ b/sys/powerpc/booke/vm_machdep.c @@ -346,7 +346,7 @@ sf_buf_free(struct sf_buf *sf) nsfbufsused--; if (sf_buf_alloc_want > 0) - wakeup_one(&sf_buf_freelist); + wakeup(&sf_buf_freelist); } mtx_unlock(&sf_buf_lock); } diff --git a/sys/sparc64/sparc64/vm_machdep.c b/sys/sparc64/sparc64/vm_machdep.c index 1b9e123..9aa9f84 100644 --- a/sys/sparc64/sparc64/vm_machdep.c +++ b/sys/sparc64/sparc64/vm_machdep.c @@ -483,7 +483,7 @@ sf_buf_free(struct sf_buf *sf) SLIST_INSERT_HEAD(&sf_freelist.sf_head, sf, free_list); nsfbufsused--; if (sf_buf_alloc_want > 0) - wakeup_one(&sf_freelist); + wakeup(&sf_freelist); mtx_unlock(&sf_freelist.sf_lock); } |