diff options
author | Kevin Traynor <kevin.traynor@intel.com> | 2015-03-27 11:06:57 -0700 |
---|---|---|
committer | Pravin B Shelar <pshelar@nicira.com> | 2015-03-27 11:12:39 -0700 |
commit | 618f44f7a406d6c3e90110420a7fd183d40f1bff (patch) | |
tree | 4dec589cc343ec1a12b318ca4ef06e3c4095c895 /lib | |
parent | a19083996c4f7ec20d5f6abf8ea4e25157cf9820 (diff) | |
download | openvswitch-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.c | 13 |
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 |