Message ID | 1520578234-5565-3-git-send-email-jasowang@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
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@redhat.com> > Signed-off-by: Jason Wang <jasowang@redhat.com> Acked-by: Michael S. Tsirkin <mst@redhat.com> > --- > 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
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;