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: c67df11f6e480 ("vhost_net: try batch dequing from skb array") Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Jason Wang <jasowang@redhat.com> Acked-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
ab7e34b343
commit
303fd71b37
@ -973,6 +973,7 @@ static struct socket *vhost_net_stop_vq(struct vhost_net *n,
|
||||
vhost_net_disable_vq(n, vq);
|
||||
vq->private_data = NULL;
|
||||
vhost_net_buf_unproduce(nvq);
|
||||
nvq->rx_ring = NULL;
|
||||
mutex_unlock(&vq->mutex);
|
||||
return sock;
|
||||
}
|
||||
@ -1162,14 +1163,14 @@ static long vhost_net_set_backend(struct vhost_net *n, unsigned index, int fd)
|
||||
vhost_net_disable_vq(n, vq);
|
||||
vq->private_data = sock;
|
||||
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);
|
||||
if (r)
|
||||
goto err_used;
|
||||
r = vhost_net_enable_vq(n, vq);
|
||||
if (r)
|
||||
goto err_used;
|
||||
if (index == VHOST_NET_VQ_RX)
|
||||
nvq->rx_ring = get_tap_ptr_ring(fd);
|
||||
|
||||
oldubufs = nvq->ubufs;
|
||||
nvq->ubufs = ubufs;
|
||||
|
Loading…
x
Reference in New Issue
Block a user