1eac307937
2 locks are executed in 2 places in opposite orders. Consider the following scenario, threads A and B: (A) * fdset_event_dispatch() start * pfdentry->busy = 1; (lock #1) * vhost_user_read_cb() start * vhost_destroy_device() start (B) * rte_vhost_driver_unregister() start * pthread_mutex_lock(&vsocket->conn_mutex); (lock #2) * fdset_del() * endless loop, waiting for pfdentry->busy == 0 (lock #1) (A) * vhost_destroy_device() end * pthread_mutex_lock(&vsocket->conn_mutex); (lock #2) (mutex already locked - deadlock at this point) Thread B has locked vsocket->conn_mutex and is in while(1) loop waiting for given fd to change it's busy flag to 0. Thread A would have to finish vhost_user_read_cb() in order to set busy flag back to 0, but that can't happen due to the vsocket->conn_mutex lock. This patch defers the fdset_del(), so that it's called outside of vsocket->conn_mutex. Change-Id: Ifb5d4699bdafe96a573444c11ad4eae3adc359f5 Signed-off-by: Dariusz Stojaczyk <dariuszx.stojaczyk@intel.com> Reviewed-on: https://review.gerrithub.io/375910 Tested-by: SPDK Automated Test System <sys_sgsw@intel.com> Reviewed-by: Pawel Wodkowski <pawelx.wodkowski@intel.com> Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com> |
||
---|---|---|
.. | ||
rte_vhost | ||
Makefile | ||
test_plan.md | ||
vhost_blk.c | ||
vhost_internal.h | ||
vhost_iommu.c | ||
vhost_iommu.h | ||
vhost_rpc.c | ||
vhost_scsi.c | ||
vhost.c |