From: Michael S. Tsirkin Date: Thu, 15 Jul 2010 12:19:12 +0000 (+0300) Subject: vhost-net: avoid flush under lock X-Git-Tag: v2.6.35-rc6~15^2~5^2~1 X-Git-Url: https://openfabrics.org/gitweb/?a=commitdiff_plain;h=1680e9063ea28099a1efa8ca11cee069cc7a9bc3;p=~emulex%2Finfiniband.git vhost-net: avoid flush under lock We flush under vq mutex when changing backends. This creates a deadlock as workqueue being flushed needs this lock as well. https://bugzilla.redhat.com/show_bug.cgi?id=612421 Drop the vq mutex before flush: we have the device mutex which is sufficient to prevent another ioctl from touching the vq. Signed-off-by: Michael S. Tsirkin --- diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c index 2406377a6e5..2764e0fbf29 100644 --- a/drivers/vhost/net.c +++ b/drivers/vhost/net.c @@ -534,11 +534,16 @@ static long vhost_net_set_backend(struct vhost_net *n, unsigned index, int fd) rcu_assign_pointer(vq->private_data, sock); vhost_net_enable_vq(n, vq); done: + mutex_unlock(&vq->mutex); + if (oldsock) { vhost_net_flush_vq(n, index); fput(oldsock->file); } + mutex_unlock(&n->dev.mutex); + return 0; + err_vq: mutex_unlock(&vq->mutex); err: