On Fri, Mar 09, 2018 at 02:50:33PM +0800, Jason Wang wrote: > 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@xxxxxxxxxx> > Signed-off-by: Jason Wang <jasowang@xxxxxxxxxx> Acked-by: Michael S. Tsirkin <mst@xxxxxxxxxx> > --- > drivers/vhost/net.c | 5 +++-- > 1 file changed, 3 insertions(+), 2 deletions(-) > > diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c > index 60f1080..efb9306 100644 > --- a/drivers/vhost/net.c > +++ b/drivers/vhost/net.c > @@ -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; > -- > 2.7.4