diff options
-rw-r--r-- | drivers/vhost/net.c | 29 |
1 files changed, 13 insertions, 16 deletions
diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c index 061a06dc12a3..2d9df786a9d3 100644 --- a/drivers/vhost/net.c +++ b/drivers/vhost/net.c | |||
@@ -773,7 +773,7 @@ static void handle_tx_copy(struct vhost_net *net, struct socket *sock) | |||
773 | int sent_pkts = 0; | 773 | int sent_pkts = 0; |
774 | bool sock_can_batch = (sock->sk->sk_sndbuf == INT_MAX); | 774 | bool sock_can_batch = (sock->sk->sk_sndbuf == INT_MAX); |
775 | 775 | ||
776 | for (;;) { | 776 | do { |
777 | bool busyloop_intr = false; | 777 | bool busyloop_intr = false; |
778 | 778 | ||
779 | if (nvq->done_idx == VHOST_NET_BATCH) | 779 | if (nvq->done_idx == VHOST_NET_BATCH) |
@@ -839,9 +839,7 @@ done: | |||
839 | vq->heads[nvq->done_idx].id = cpu_to_vhost32(vq, head); | 839 | vq->heads[nvq->done_idx].id = cpu_to_vhost32(vq, head); |
840 | vq->heads[nvq->done_idx].len = 0; | 840 | vq->heads[nvq->done_idx].len = 0; |
841 | ++nvq->done_idx; | 841 | ++nvq->done_idx; |
842 | if (vhost_exceeds_weight(vq, ++sent_pkts, total_len)) | 842 | } while (likely(!vhost_exceeds_weight(vq, ++sent_pkts, total_len))); |
843 | break; | ||
844 | } | ||
845 | 843 | ||
846 | vhost_tx_batch(net, nvq, sock, &msg); | 844 | vhost_tx_batch(net, nvq, sock, &msg); |
847 | } | 845 | } |
@@ -866,7 +864,7 @@ static void handle_tx_zerocopy(struct vhost_net *net, struct socket *sock) | |||
866 | bool zcopy_used; | 864 | bool zcopy_used; |
867 | int sent_pkts = 0; | 865 | int sent_pkts = 0; |
868 | 866 | ||
869 | for (;;) { | 867 | do { |
870 | bool busyloop_intr; | 868 | bool busyloop_intr; |
871 | 869 | ||
872 | /* Release DMAs done buffers first */ | 870 | /* Release DMAs done buffers first */ |
@@ -943,10 +941,7 @@ static void handle_tx_zerocopy(struct vhost_net *net, struct socket *sock) | |||
943 | else | 941 | else |
944 | vhost_zerocopy_signal_used(net, vq); | 942 | vhost_zerocopy_signal_used(net, vq); |
945 | vhost_net_tx_packet(net); | 943 | vhost_net_tx_packet(net); |
946 | if (unlikely(vhost_exceeds_weight(vq, ++sent_pkts, | 944 | } while (likely(!vhost_exceeds_weight(vq, ++sent_pkts, total_len))); |
947 | total_len))) | ||
948 | break; | ||
949 | } | ||
950 | } | 945 | } |
951 | 946 | ||
952 | /* Expects to be always run from workqueue - which acts as | 947 | /* Expects to be always run from workqueue - which acts as |
@@ -1144,8 +1139,11 @@ static void handle_rx(struct vhost_net *net) | |||
1144 | vq->log : NULL; | 1139 | vq->log : NULL; |
1145 | mergeable = vhost_has_feature(vq, VIRTIO_NET_F_MRG_RXBUF); | 1140 | mergeable = vhost_has_feature(vq, VIRTIO_NET_F_MRG_RXBUF); |
1146 | 1141 | ||
1147 | while ((sock_len = vhost_net_rx_peek_head_len(net, sock->sk, | 1142 | do { |
1148 | &busyloop_intr))) { | 1143 | sock_len = vhost_net_rx_peek_head_len(net, sock->sk, |
1144 | &busyloop_intr); | ||
1145 | if (!sock_len) | ||
1146 | break; | ||
1149 | sock_len += sock_hlen; | 1147 | sock_len += sock_hlen; |
1150 | vhost_len = sock_len + vhost_hlen; | 1148 | vhost_len = sock_len + vhost_hlen; |
1151 | headcount = get_rx_bufs(vq, vq->heads + nvq->done_idx, | 1149 | headcount = get_rx_bufs(vq, vq->heads + nvq->done_idx, |
@@ -1230,12 +1228,11 @@ static void handle_rx(struct vhost_net *net) | |||
1230 | vhost_log_write(vq, vq_log, log, vhost_len, | 1228 | vhost_log_write(vq, vq_log, log, vhost_len, |
1231 | vq->iov, in); | 1229 | vq->iov, in); |
1232 | total_len += vhost_len; | 1230 | total_len += vhost_len; |
1233 | if (unlikely(vhost_exceeds_weight(vq, ++recv_pkts, total_len))) | 1231 | } while (likely(!vhost_exceeds_weight(vq, ++recv_pkts, total_len))); |
1234 | goto out; | 1232 | |
1235 | } | ||
1236 | if (unlikely(busyloop_intr)) | 1233 | if (unlikely(busyloop_intr)) |
1237 | vhost_poll_queue(&vq->poll); | 1234 | vhost_poll_queue(&vq->poll); |
1238 | else | 1235 | else if (!sock_len) |
1239 | vhost_net_enable_vq(net, vq); | 1236 | vhost_net_enable_vq(net, vq); |
1240 | out: | 1237 | out: |
1241 | vhost_net_signal_used(nvq); | 1238 | vhost_net_signal_used(nvq); |
@@ -1328,7 +1325,7 @@ static int vhost_net_open(struct inode *inode, struct file *f) | |||
1328 | } | 1325 | } |
1329 | vhost_dev_init(dev, vqs, VHOST_NET_VQ_MAX, | 1326 | vhost_dev_init(dev, vqs, VHOST_NET_VQ_MAX, |
1330 | UIO_MAXIOV + VHOST_NET_BATCH, | 1327 | UIO_MAXIOV + VHOST_NET_BATCH, |
1331 | VHOST_NET_WEIGHT, VHOST_NET_PKT_WEIGHT); | 1328 | VHOST_NET_PKT_WEIGHT, VHOST_NET_WEIGHT); |
1332 | 1329 | ||
1333 | vhost_poll_init(n->poll + VHOST_NET_VQ_TX, handle_tx_net, EPOLLOUT, dev); | 1330 | vhost_poll_init(n->poll + VHOST_NET_VQ_TX, handle_tx_net, EPOLLOUT, dev); |
1334 | vhost_poll_init(n->poll + VHOST_NET_VQ_RX, handle_rx_net, EPOLLIN, dev); | 1331 | vhost_poll_init(n->poll + VHOST_NET_VQ_RX, handle_rx_net, EPOLLIN, dev); |