[ovs-dev] [PATCH v7 11/16] ovs-thread: Do not quiesce in ovs_mutex_cond_wait().
Kavanagh, Mark B
mark.b.kavanagh at intel.com
Thu Apr 14 12:36:40 UTC 2016
Hi Daniele,
One comment inline.
Cheers,
Mark
>
>ovs_mutex_cond_wait() is used in many functions in dpif-netdev to
>synchronize with pmd threads, but we can't guarantee that the callers do
>not hold RCU references, so it's better to avoid quiescing.
You'll need to update the following comment in lib/rcu.h accordingly:
<snip>
For example, poll_block() includes a quiescent state, as does ovs_mutex_cond_wait().
</snip>
>
>In system_stats_thread_func() the code relied on ovs_mutex_cond_wait()
>to introduce a quiescent state, so explicit calls to
>ovsrcu_quiesce_start() and ovsrcu_quiesce_end() are added there.
>
>Signed-off-by: Daniele Di Proietto <diproiettod at vmware.com>
>---
> lib/ovs-thread.c | 2 --
> vswitchd/system-stats.c | 6 ++++++
> 2 files changed, 6 insertions(+), 2 deletions(-)
>
>diff --git a/lib/ovs-thread.c b/lib/ovs-thread.c
>index 3c065cf..26dd928 100644
>--- a/lib/ovs-thread.c
>+++ b/lib/ovs-thread.c
>@@ -253,9 +253,7 @@ ovs_mutex_cond_wait(pthread_cond_t *cond, const struct ovs_mutex *mutex_)
> struct ovs_mutex *mutex = CONST_CAST(struct ovs_mutex *, mutex_);
> int error;
>
>- ovsrcu_quiesce_start();
> error = pthread_cond_wait(cond, &mutex->lock);
>- ovsrcu_quiesce_end();
>
> if (OVS_UNLIKELY(error)) {
> ovs_abort(error, "pthread_cond_wait failed");
>diff --git a/vswitchd/system-stats.c b/vswitchd/system-stats.c
>index df4971e..129f0cf 100644
>--- a/vswitchd/system-stats.c
>+++ b/vswitchd/system-stats.c
>@@ -37,6 +37,7 @@
> #include "json.h"
> #include "latch.h"
> #include "openvswitch/ofpbuf.h"
>+#include "ovs-rcu.h"
> #include "ovs-thread.h"
> #include "poll-loop.h"
> #include "shash.h"
>@@ -615,7 +616,12 @@ system_stats_thread_func(void *arg OVS_UNUSED)
>
> ovs_mutex_lock(&mutex);
> while (!enabled) {
>+ /* The thread is sleeping, potentially for a long time, and it's
>+ * not holding RCU protected references, so it makes sense to
>+ * quiesce */
>+ ovsrcu_quiesce_start();
> ovs_mutex_cond_wait(&cond, &mutex);
>+ ovsrcu_quiesce_end();
> }
> ovs_mutex_unlock(&mutex);
>
>--
>2.1.4
More information about the dev
mailing list