Commit 303fd71b authored by Jason Wang's avatar Jason Wang Committed by David S. Miller

vhost_net: keep private_data and rx_ring synced

We get pointer ring from the exported sock, this means we should keep
rx_ring and vq->private synced during both vq stop and backend set,
otherwise we may see stale rx_ring.

Fixes: c67df11f ("vhost_net: try batch dequing from skb array")
Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
Signed-off-by: default avatarJason Wang <jasowang@redhat.com>
Acked-by: default avatarMichael S. Tsirkin <mst@redhat.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent ab7e34b3
...@@ -973,6 +973,7 @@ static struct socket *vhost_net_stop_vq(struct vhost_net *n, ...@@ -973,6 +973,7 @@ static struct socket *vhost_net_stop_vq(struct vhost_net *n,
vhost_net_disable_vq(n, vq); vhost_net_disable_vq(n, vq);
vq->private_data = NULL; vq->private_data = NULL;
vhost_net_buf_unproduce(nvq); vhost_net_buf_unproduce(nvq);
nvq->rx_ring = NULL;
mutex_unlock(&vq->mutex); mutex_unlock(&vq->mutex);
return sock; return sock;
} }
...@@ -1162,14 +1163,14 @@ static long vhost_net_set_backend(struct vhost_net *n, unsigned index, int fd) ...@@ -1162,14 +1163,14 @@ static long vhost_net_set_backend(struct vhost_net *n, unsigned index, int fd)
vhost_net_disable_vq(n, vq); vhost_net_disable_vq(n, vq);
vq->private_data = sock; vq->private_data = sock;
vhost_net_buf_unproduce(nvq); vhost_net_buf_unproduce(nvq);
if (index == VHOST_NET_VQ_RX)
nvq->rx_ring = get_tap_ptr_ring(fd);
r = vhost_vq_init_access(vq); r = vhost_vq_init_access(vq);
if (r) if (r)
goto err_used; goto err_used;
r = vhost_net_enable_vq(n, vq); r = vhost_net_enable_vq(n, vq);
if (r) if (r)
goto err_used; goto err_used;
if (index == VHOST_NET_VQ_RX)
nvq->rx_ring = get_tap_ptr_ring(fd);
oldubufs = nvq->ubufs; oldubufs = nvq->ubufs;
nvq->ubufs = ubufs; nvq->ubufs = ubufs;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment