|
@@ -547,34 +547,27 @@ static void vhost_net_busy_poll(struct vhost_net *net,
|
|
|
mutex_unlock(&vq->mutex);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
static int vhost_net_tx_get_vq_desc(struct vhost_net *net,
|
|
|
- struct vhost_net_virtqueue *nvq,
|
|
|
+ struct vhost_net_virtqueue *tnvq,
|
|
|
unsigned int *out_num, unsigned int *in_num,
|
|
|
struct msghdr *msghdr, bool *busyloop_intr)
|
|
|
{
|
|
|
- struct vhost_virtqueue *vq = &nvq->vq;
|
|
|
- unsigned long uninitialized_var(endtime);
|
|
|
- int r = vhost_get_vq_desc(vq, vq->iov, ARRAY_SIZE(vq->iov),
|
|
|
+ struct vhost_net_virtqueue *rnvq = &net->vqs[VHOST_NET_VQ_RX];
|
|
|
+ struct vhost_virtqueue *rvq = &rnvq->vq;
|
|
|
+ struct vhost_virtqueue *tvq = &tnvq->vq;
|
|
|
+
|
|
|
+ int r = vhost_get_vq_desc(tvq, tvq->iov, ARRAY_SIZE(tvq->iov),
|
|
|
out_num, in_num, NULL, NULL);
|
|
|
|
|
|
- if (r == vq->num && vq->busyloop_timeout) {
|
|
|
+ if (r == tvq->num && tvq->busyloop_timeout) {
|
|
|
/* Flush batched packets first */
|
|
|
- if (!vhost_sock_zcopy(vq->private_data))
|
|
|
- vhost_tx_batch(net, nvq, vq->private_data, msghdr);
|
|
|
- preempt_disable();
|
|
|
- endtime = busy_clock() + vq->busyloop_timeout;
|
|
|
- while (vhost_can_busy_poll(endtime)) {
|
|
|
- if (vhost_has_work(vq->dev)) {
|
|
|
- *busyloop_intr = true;
|
|
|
- break;
|
|
|
- }
|
|
|
- if (!vhost_vq_avail_empty(vq->dev, vq))
|
|
|
- break;
|
|
|
- cpu_relax();
|
|
|
- }
|
|
|
- preempt_enable();
|
|
|
- r = vhost_get_vq_desc(vq, vq->iov, ARRAY_SIZE(vq->iov),
|
|
|
+ if (!vhost_sock_zcopy(tvq->private_data))
|
|
|
+ // vhost_net_signal_used(tnvq);
|
|
|
+ vhost_tx_batch(net, tnvq, tvq->private_data, msghdr);
|
|
|
+
|
|
|
+ vhost_net_busy_poll(net, rvq, tvq, busyloop_intr, false);
|
|
|
+
|
|
|
+ r = vhost_get_vq_desc(tvq, tvq->iov, ARRAY_SIZE(tvq->iov),
|
|
|
out_num, in_num, NULL, NULL);
|
|
|
}
|
|
|
|