On 2018/07/04 13:31, [email protected] wrote:
...
> +static void vhost_net_busy_poll(struct vhost_net *net,
> +                             struct vhost_virtqueue *rvq,
> +                             struct vhost_virtqueue *tvq,
> +                             bool rx)
> +{
> +     unsigned long uninitialized_var(endtime);
> +     unsigned long busyloop_timeout;
> +     struct socket *sock;
> +     struct vhost_virtqueue *vq = rx ? tvq : rvq;
> +
> +     mutex_lock_nested(&vq->mutex, rx ? VHOST_NET_VQ_TX: VHOST_NET_VQ_RX);
> +
> +     vhost_disable_notify(&net->dev, vq);
> +     sock = rvq->private_data;
> +     busyloop_timeout = rx ? rvq->busyloop_timeout : tvq->busyloop_timeout;
> +
> +     preempt_disable();
> +     endtime = busy_clock() + busyloop_timeout;
> +     while (vhost_can_busy_poll(tvq->dev, endtime) &&
> +            !(sock && sk_has_rx_data(sock->sk)) &&
> +            vhost_vq_avail_empty(tvq->dev, tvq))
> +             cpu_relax();
> +     preempt_enable();
> +
> +     if ((rx && !vhost_vq_avail_empty(&net->dev, vq)) ||
> +         (!rx && (sock && sk_has_rx_data(sock->sk)))) {
> +             vhost_poll_queue(&vq->poll);
> +     } else if (vhost_enable_notify(&net->dev, vq) && rx) {

Hmm... on tx here sock has no rx data, so you are waiting for sock
wakeup for rx and vhost_enable_notify() seems not needed. Do you want
this actually?

} else if (rx && vhost_enable_notify(&net->dev, vq)) {

> +             vhost_disable_notify(&net->dev, vq);
> +             vhost_poll_queue(&vq->poll);
> +     }

-- 
Toshiaki Makita

_______________________________________________
Virtualization mailing list
[email protected]
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

Reply via email to