summaryrefslogtreecommitdiffstats
path: root/sbin/hastd
diff options
context:
space:
mode:
authortrociny <trociny@FreeBSD.org>2013-09-19 20:15:24 +0000
committertrociny <trociny@FreeBSD.org>2013-09-19 20:15:24 +0000
commit2604d523b6631d11bcc72412ec3d3c2fd27dffc9 (patch)
tree59bea261baea2bce02ac05f712aa4647dfd2b99a /sbin/hastd
parenta54f6a964507b7e14c57243c46abf6e66752282e (diff)
downloadFreeBSD-src-2604d523b6631d11bcc72412ec3d3c2fd27dffc9.zip
FreeBSD-src-2604d523b6631d11bcc72412ec3d3c2fd27dffc9.tar.gz
Use cv_broadcast() instead of cv_signal() when waking up threads
waiting on an empty queue as the queue may have several consumers. Before the fix the following scenario was possible: 2 threads are waiting on empty queue, 2 threads are inserting simultaneously. The first inserting thread detects that the queue is empty and is going to send the signal, but before it sends the second thread inserts too. When the first sends the signal only one of the waiting threads receive it while the other one may wait forever. The scenario above is is believed to be the cause of the observed cases, when ggate_recv_thread() was getting stuck on taking free request, while the free queue was not empty. Reviewed by: pjd Tested by: Yamagi Burmeister yamagi.org Approved by: re (marius) MFC after: 2 weeks
Diffstat (limited to 'sbin/hastd')
-rw-r--r--sbin/hastd/primary.c4
-rw-r--r--sbin/hastd/secondary.c2
2 files changed, 3 insertions, 3 deletions
diff --git a/sbin/hastd/primary.c b/sbin/hastd/primary.c
index 92d1d9e..5758f41 100644
--- a/sbin/hastd/primary.c
+++ b/sbin/hastd/primary.c
@@ -172,7 +172,7 @@ static pthread_mutex_t metadata_lock;
hio_next[(ncomp)]); \
mtx_unlock(&hio_##name##_list_lock[ncomp]); \
if (_wakeup) \
- cv_signal(&hio_##name##_list_cond[(ncomp)]); \
+ cv_broadcast(&hio_##name##_list_cond[(ncomp)]); \
} while (0)
#define QUEUE_INSERT2(hio, name) do { \
bool _wakeup; \
@@ -182,7 +182,7 @@ static pthread_mutex_t metadata_lock;
TAILQ_INSERT_TAIL(&hio_##name##_list, (hio), hio_##name##_next);\
mtx_unlock(&hio_##name##_list_lock); \
if (_wakeup) \
- cv_signal(&hio_##name##_list_cond); \
+ cv_broadcast(&hio_##name##_list_cond); \
} while (0)
#define QUEUE_TAKE1(hio, name, ncomp, timeout) do { \
bool _last; \
diff --git a/sbin/hastd/secondary.c b/sbin/hastd/secondary.c
index c0c67c6..f766003 100644
--- a/sbin/hastd/secondary.c
+++ b/sbin/hastd/secondary.c
@@ -115,7 +115,7 @@ static void *send_thread(void *arg);
TAILQ_INSERT_TAIL(&hio_##name##_list, (hio), hio_next); \
mtx_unlock(&hio_##name##_list_lock); \
if (_wakeup) \
- cv_signal(&hio_##name##_list_cond); \
+ cv_broadcast(&hio_##name##_list_cond); \
} while (0)
#define QUEUE_TAKE(name, hio) do { \
mtx_lock(&hio_##name##_list_lock); \
OpenPOWER on IntegriCloud