Thread (1 message) flat view 1 message, 1 author, 2018-08-03

Re: [PATCH net-next v7 3/4] net: vhost: factor out busy polling logic to vhost_net_busy_poll()

From: Toshiaki Makita <hidden>
Date: 2018-08-03 04:25:59
Also in: netdev

On 2018/08/03 13:14, Tonghao Zhang wrote:
On Fri, Aug 3, 2018 at 11:40 AM Toshiaki Makita
[off-list ref] wrote:
quoted
On 2018/08/03 12:24, Tonghao Zhang wrote:
quoted
On Fri, Aug 3, 2018 at 11:07 AM Jason Wang [off-list ref] wrote:
quoted
On 2018年08月03日 10:51, Tonghao Zhang wrote:
quoted
On Thu, Aug 2, 2018 at 5:23 PM Jason Wang [off-list ref] wrote:
quoted
On 2018年08月02日 16:41, Toshiaki Makita wrote:
quoted
On 2018/08/02 17:18, Jason Wang wrote:
quoted
On 2018年08月01日 17:52, Tonghao Zhang wrote:
quoted
quoted
+static void vhost_net_busy_poll_check(struct vhost_net *net,
+                                   struct vhost_virtqueue *rvq,
+                                   struct vhost_virtqueue *tvq,
+                                   bool rx)
+{
+     struct socket *sock = rvq->private_data;
+
+     if (rx)
+             vhost_net_busy_poll_try_queue(net, tvq);
+     else if (sock && sk_has_rx_data(sock->sk))
+             vhost_net_busy_poll_try_queue(net, rvq);
+     else {
+             /* On tx here, sock has no rx data, so we
+              * will wait for sock wakeup for rx, and
+              * vhost_enable_notify() is not needed. */
A possible case is we do have rx data but guest does not refill the rx
queue. In this case we may lose notifications from guest.
Yes, should consider this case. thanks.
I'm a bit confused. Isn't this covered by the previous
"else if (sock && sk_has_rx_data(...))" block?
The problem is it does nothing if vhost_vq_avail_empty() is true and
vhost_enble_notify() is false.
quoted
quoted
quoted
quoted
quoted
+
+             cpu_relax();
+     }
+
+     preempt_enable();
+
+     if (!rx)
+             vhost_net_enable_vq(net, vq);
No need to enable rx virtqueue, if we are sure handle_rx() will be
called soon.
If we disable rx virtqueue in handle_tx and don't send packets from
guest anymore(handle_tx is not called), so we can wake up for sock rx.
so the network is broken.
Not sure I understand here. I mean is we schedule work for handle_rx(),
there's no need to enable it since handle_rx() will do this for us.
Looks like in the last "else" block in vhost_net_busy_poll_check() we
need to enable vq since in that case we have no rx data and handle_rx()
is not scheduled.
Yes.
So we will use the vhost_has_work() to check whether or not the
handle_rx is scheduled ?
If we use the vhost_has_work(), the work in the dev work_list may be
rx work, or tx work, right ?
Yes. We can add a boolean to record whether or not we've called
vhost_poll_queue() for rvq. And avoid calling vhost_net_enable_vq() if
it was true.
so, the commit be294a51a "vhost_net: Avoid rx queue wake-ups during busypoll"
may not consider the case: work is tx work in the dev work list.
Not sure what you are concerned but what I can say is that we need to
poll rx work if vhost_has_work() detects tx work in
vhost_net_rx_peek_head_len() since rx busypoll exits prematurely in that
case.
In the handle_rx, when we busy poll, the vhost_has_work() return true,
because the tx but not rx work is in the dev work list.
and it is the most case, because tx work may be added to dev work list
anytime(not during busy poll) when guest kick the vhost-net.
so it is not necessary to add it., right ?
I'm lost.
What is the part you think is not needed?

1. When there is a tx work we exit rx busypoll.
2. When we exit rx busypoll by tx work, we poll rx work (so that we can
   continue rx busypoll later).

-- 
Toshiaki Makita

_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help