diff options
Diffstat (limited to 'drivers/vhost/net.c')
| -rw-r--r-- | drivers/vhost/net.c | 16 | 
1 files changed, 12 insertions, 4 deletions
diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c index 7c8008225ee..17927b1f933 100644 --- a/drivers/vhost/net.c +++ b/drivers/vhost/net.c @@ -127,7 +127,10 @@ static void handle_tx(struct vhost_net *net)  	size_t len, total_len = 0;  	int err, wmem;  	size_t hdr_size; -	struct socket *sock = rcu_dereference(vq->private_data); +	struct socket *sock; + +	sock = rcu_dereference_check(vq->private_data, +				     lockdep_is_held(&vq->mutex));  	if (!sock)  		return; @@ -582,7 +585,10 @@ static void vhost_net_disable_vq(struct vhost_net *n,  static void vhost_net_enable_vq(struct vhost_net *n,  				struct vhost_virtqueue *vq)  { -	struct socket *sock = vq->private_data; +	struct socket *sock; + +	sock = rcu_dereference_protected(vq->private_data, +					 lockdep_is_held(&vq->mutex));  	if (!sock)  		return;  	if (vq == n->vqs + VHOST_NET_VQ_TX) { @@ -598,7 +604,8 @@ static struct socket *vhost_net_stop_vq(struct vhost_net *n,  	struct socket *sock;  	mutex_lock(&vq->mutex); -	sock = vq->private_data; +	sock = rcu_dereference_protected(vq->private_data, +					 lockdep_is_held(&vq->mutex));  	vhost_net_disable_vq(n, vq);  	rcu_assign_pointer(vq->private_data, NULL);  	mutex_unlock(&vq->mutex); @@ -736,7 +743,8 @@ static long vhost_net_set_backend(struct vhost_net *n, unsigned index, int fd)  	}  	/* start polling new socket */ -	oldsock = vq->private_data; +	oldsock = rcu_dereference_protected(vq->private_data, +					    lockdep_is_held(&vq->mutex));  	if (sock != oldsock) {                  vhost_net_disable_vq(n, vq);                  rcu_assign_pointer(vq->private_data, sock);  |