summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorKevin Traynor <kevin.traynor@intel.com>2015-03-27 11:06:57 -0700
committerPravin B Shelar <pshelar@nicira.com>2015-03-27 11:12:39 -0700
commit618f44f7a406d6c3e90110420a7fd183d40f1bff (patch)
tree4dec589cc343ec1a12b318ca4ef06e3c4095c895 /lib
parenta19083996c4f7ec20d5f6abf8ea4e25157cf9820 (diff)
downloadopenvswitch-618f44f7a406d6c3e90110420a7fd183d40f1bff.tar.gz
netdev-dpdk: Put cuse thread into quiescent state.
ovsrcu_synchronize() is used when setting virtio_dev to NULL. This results in an ovsrcu_quiesce_end() call which means the cuse thread may not go into quiescent state again for an indefinite time. Add an ovsrcu_quiesce_start() call to prevent this. Signed-off-by: Kevin Traynor <kevin.traynor@intel.com> Acked-by: Pravin B Shelar <pshelar@nicira.com>
Diffstat (limited to 'lib')
-rw-r--r--lib/netdev-dpdk.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
index 4e16f3916..f69154b07 100644
--- a/lib/netdev-dpdk.c
+++ b/lib/netdev-dpdk.c
@@ -1586,6 +1586,11 @@ destroy_device(volatile struct virtio_net *dev)
* setting the virtio_dev to NULL.
*/
ovsrcu_synchronize();
+ /*
+ * As call to ovsrcu_synchronize() will end the quiescent state,
+ * put thread back into quiescent state before returning.
+ */
+ ovsrcu_quiesce_start();
}
}
ovs_mutex_unlock(&dpdk_mutex);
@@ -1614,6 +1619,8 @@ static void *
start_cuse_session_loop(void *dummy OVS_UNUSED)
{
pthread_detach(pthread_self());
+ /* Put the cuse thread into quiescent state. */
+ ovsrcu_quiesce_start();
rte_vhost_driver_session_start();
return NULL;
}
@@ -1621,7 +1628,6 @@ start_cuse_session_loop(void *dummy OVS_UNUSED)
static int
dpdk_vhost_class_init(void)
{
- pthread_t thread;
int err = -1;
rte_vhost_driver_callback_register(&virtio_net_device_ops);
@@ -1637,9 +1643,8 @@ dpdk_vhost_class_init(void)
return -1;
}
- /* start_cuse_session_loop blocks OVS RCU quiescent state, so directly use
- * pthread API. */
- return pthread_create(&thread, NULL, start_cuse_session_loop, NULL);
+ ovs_thread_create("cuse_thread", start_cuse_session_loop, NULL);
+ return 0;
}
static void