diff options
Diffstat (limited to 'drivers/vhost/net.c')
-rw-r--r-- | drivers/vhost/net.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c index b5fb56b822fd..a31d9b240af8 100644 --- a/drivers/vhost/net.c +++ b/drivers/vhost/net.c | |||
@@ -170,7 +170,7 @@ static void vhost_net_buf_unproduce(struct vhost_net_virtqueue *nvq) | |||
170 | if (nvq->rx_ring && !vhost_net_buf_is_empty(rxq)) { | 170 | if (nvq->rx_ring && !vhost_net_buf_is_empty(rxq)) { |
171 | ptr_ring_unconsume(nvq->rx_ring, rxq->queue + rxq->head, | 171 | ptr_ring_unconsume(nvq->rx_ring, rxq->queue + rxq->head, |
172 | vhost_net_buf_get_size(rxq), | 172 | vhost_net_buf_get_size(rxq), |
173 | __skb_array_destroy_skb); | 173 | tun_ptr_free); |
174 | rxq->head = rxq->tail = 0; | 174 | rxq->head = rxq->tail = 0; |
175 | } | 175 | } |
176 | } | 176 | } |
@@ -948,6 +948,7 @@ static int vhost_net_open(struct inode *inode, struct file *f) | |||
948 | n->vqs[i].done_idx = 0; | 948 | n->vqs[i].done_idx = 0; |
949 | n->vqs[i].vhost_hlen = 0; | 949 | n->vqs[i].vhost_hlen = 0; |
950 | n->vqs[i].sock_hlen = 0; | 950 | n->vqs[i].sock_hlen = 0; |
951 | n->vqs[i].rx_ring = NULL; | ||
951 | vhost_net_buf_init(&n->vqs[i].rxq); | 952 | vhost_net_buf_init(&n->vqs[i].rxq); |
952 | } | 953 | } |
953 | vhost_dev_init(dev, vqs, VHOST_NET_VQ_MAX); | 954 | vhost_dev_init(dev, vqs, VHOST_NET_VQ_MAX); |
@@ -972,6 +973,7 @@ static struct socket *vhost_net_stop_vq(struct vhost_net *n, | |||
972 | vhost_net_disable_vq(n, vq); | 973 | vhost_net_disable_vq(n, vq); |
973 | vq->private_data = NULL; | 974 | vq->private_data = NULL; |
974 | vhost_net_buf_unproduce(nvq); | 975 | vhost_net_buf_unproduce(nvq); |
976 | nvq->rx_ring = NULL; | ||
975 | mutex_unlock(&vq->mutex); | 977 | mutex_unlock(&vq->mutex); |
976 | return sock; | 978 | return sock; |
977 | } | 979 | } |
@@ -1160,14 +1162,14 @@ static long vhost_net_set_backend(struct vhost_net *n, unsigned index, int fd) | |||
1160 | vhost_net_disable_vq(n, vq); | 1162 | vhost_net_disable_vq(n, vq); |
1161 | vq->private_data = sock; | 1163 | vq->private_data = sock; |
1162 | vhost_net_buf_unproduce(nvq); | 1164 | vhost_net_buf_unproduce(nvq); |
1163 | if (index == VHOST_NET_VQ_RX) | ||
1164 | nvq->rx_ring = get_tap_ptr_ring(fd); | ||
1165 | r = vhost_vq_init_access(vq); | 1165 | r = vhost_vq_init_access(vq); |
1166 | if (r) | 1166 | if (r) |
1167 | goto err_used; | 1167 | goto err_used; |
1168 | r = vhost_net_enable_vq(n, vq); | 1168 | r = vhost_net_enable_vq(n, vq); |
1169 | if (r) | 1169 | if (r) |
1170 | goto err_used; | 1170 | goto err_used; |
1171 | if (index == VHOST_NET_VQ_RX) | ||
1172 | nvq->rx_ring = get_tap_ptr_ring(fd); | ||
1171 | 1173 | ||
1172 | oldubufs = nvq->ubufs; | 1174 | oldubufs = nvq->ubufs; |
1173 | nvq->ubufs = ubufs; | 1175 | nvq->ubufs = ubufs; |