* performance bug in virtio net xdp
@ 2020-05-06 8:08 Michael S. Tsirkin
2020-05-06 8:37 ` Jason Wang
2020-05-06 8:37 ` Jesper Dangaard Brouer
0 siblings, 2 replies; 5+ messages in thread
From: Michael S. Tsirkin @ 2020-05-06 8:08 UTC (permalink / raw)
To: Jason Wang
Cc: virtualization, netdev, linux-kernel, bpf, Jesper Dangaard Brouer,
Eugenio Perez Martin
So for mergeable bufs, we use ewma machinery to guess the correct buffer
size. If we don't guess correctly, XDP has to do aggressive copies.
Problem is, xdp paths do not update the ewma at all, except
sometimes with XDP_PASS. So whatever we happen to have
before we attach XDP, will mostly stay around.
The fix is probably to update ewma unconditionally.
--
MST
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: performance bug in virtio net xdp
2020-05-06 8:08 performance bug in virtio net xdp Michael S. Tsirkin
@ 2020-05-06 8:37 ` Jason Wang
2020-05-06 11:57 ` Michael S. Tsirkin
2020-05-06 8:37 ` Jesper Dangaard Brouer
1 sibling, 1 reply; 5+ messages in thread
From: Jason Wang @ 2020-05-06 8:37 UTC (permalink / raw)
To: Michael S. Tsirkin
Cc: virtualization, netdev, linux-kernel, bpf, Jesper Dangaard Brouer,
Eugenio Perez Martin
On 2020/5/6 下午4:08, Michael S. Tsirkin wrote:
> So for mergeable bufs, we use ewma machinery to guess the correct buffer
> size. If we don't guess correctly, XDP has to do aggressive copies.
>
> Problem is, xdp paths do not update the ewma at all, except
> sometimes with XDP_PASS. So whatever we happen to have
> before we attach XDP, will mostly stay around.
It looks ok to me since we always use PAGE_SIZE when XDP is enabled in
get_mergeable_buf_len()?
Thanks
>
> The fix is probably to update ewma unconditionally.
>
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: performance bug in virtio net xdp
2020-05-06 8:08 performance bug in virtio net xdp Michael S. Tsirkin
2020-05-06 8:37 ` Jason Wang
@ 2020-05-06 8:37 ` Jesper Dangaard Brouer
2020-05-06 11:57 ` Michael S. Tsirkin
1 sibling, 1 reply; 5+ messages in thread
From: Jesper Dangaard Brouer @ 2020-05-06 8:37 UTC (permalink / raw)
To: Michael S. Tsirkin
Cc: Jason Wang, virtualization, netdev, linux-kernel, bpf,
Eugenio Perez Martin, brouer
On Wed, 6 May 2020 04:08:27 -0400
"Michael S. Tsirkin" <mst@redhat.com> wrote:
> So for mergeable bufs, we use ewma machinery to guess the correct buffer
> size. If we don't guess correctly, XDP has to do aggressive copies.
>
> Problem is, xdp paths do not update the ewma at all, except
> sometimes with XDP_PASS. So whatever we happen to have
> before we attach XDP, will mostly stay around.
>
> The fix is probably to update ewma unconditionally.
I personally find the code hard to follow, and (I admit) that it took
me some time to understand this code path (so I might still be wrong).
In patch[1] I tried to explain (my understanding):
In receive_mergeable() the frame size is more dynamic. There are two
basic cases: (1) buffer size is based on a exponentially weighted
moving average (see DECLARE_EWMA) of packet length. Or (2) in case
virtnet_get_headroom() have any headroom then buffer size is
PAGE_SIZE. The ctx pointer is this time used for encoding two values;
the buffer len "truesize" and headroom. In case (1) if the rx buffer
size is underestimated, the packet will have been split over more
buffers (num_buf info in virtio_net_hdr_mrg_rxbuf placed in top of
buffer area). If that happens the XDP path does a xdp_linearize_page
operation.
The EWMA code is not used when headroom is defined, which e.g. gets
enabled when running XDP.
[1] https://lore.kernel.org/netdev/158824572816.2172139.1358700000273697123.stgit@firesoul/
--
Best regards,
Jesper Dangaard Brouer
MSc.CS, Principal Kernel Engineer at Red Hat
LinkedIn: http://www.linkedin.com/in/brouer
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: performance bug in virtio net xdp
2020-05-06 8:37 ` Jesper Dangaard Brouer
@ 2020-05-06 11:57 ` Michael S. Tsirkin
0 siblings, 0 replies; 5+ messages in thread
From: Michael S. Tsirkin @ 2020-05-06 11:57 UTC (permalink / raw)
To: Jesper Dangaard Brouer
Cc: Jason Wang, virtualization, netdev, linux-kernel, bpf,
Eugenio Perez Martin
On Wed, May 06, 2020 at 10:37:57AM +0200, Jesper Dangaard Brouer wrote:
> On Wed, 6 May 2020 04:08:27 -0400
> "Michael S. Tsirkin" <mst@redhat.com> wrote:
>
> > So for mergeable bufs, we use ewma machinery to guess the correct buffer
> > size. If we don't guess correctly, XDP has to do aggressive copies.
> >
> > Problem is, xdp paths do not update the ewma at all, except
> > sometimes with XDP_PASS. So whatever we happen to have
> > before we attach XDP, will mostly stay around.
> >
> > The fix is probably to update ewma unconditionally.
>
> I personally find the code hard to follow, and (I admit) that it took
> me some time to understand this code path (so I might still be wrong).
>
> In patch[1] I tried to explain (my understanding):
>
> In receive_mergeable() the frame size is more dynamic. There are two
> basic cases: (1) buffer size is based on a exponentially weighted
> moving average (see DECLARE_EWMA) of packet length. Or (2) in case
> virtnet_get_headroom() have any headroom then buffer size is
> PAGE_SIZE. The ctx pointer is this time used for encoding two values;
> the buffer len "truesize" and headroom. In case (1) if the rx buffer
> size is underestimated, the packet will have been split over more
> buffers (num_buf info in virtio_net_hdr_mrg_rxbuf placed in top of
> buffer area). If that happens the XDP path does a xdp_linearize_page
> operation.
>
>
> The EWMA code is not used when headroom is defined, which e.g. gets
> enabled when running XDP.
>
>
> [1] https://lore.kernel.org/netdev/158824572816.2172139.1358700000273697123.stgit@firesoul/
You are right.
So I guess the problem is just inconsistency?
When XDP program returns XDP_PASS, and it all fits in one page,
then we trigger
ewma_pkt_len_add(&rq->mrg_avg_pkt_len, head_skb->len);
if it does not trigger XDP_PASS, or does not fit in one page,
then we don't.
Given XDP does not use ewma for sizing, let's not update the average
either.
> --
> Best regards,
> Jesper Dangaard Brouer
> MSc.CS, Principal Kernel Engineer at Red Hat
> LinkedIn: http://www.linkedin.com/in/brouer
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: performance bug in virtio net xdp
2020-05-06 8:37 ` Jason Wang
@ 2020-05-06 11:57 ` Michael S. Tsirkin
0 siblings, 0 replies; 5+ messages in thread
From: Michael S. Tsirkin @ 2020-05-06 11:57 UTC (permalink / raw)
To: Jason Wang
Cc: virtualization, netdev, linux-kernel, bpf, Jesper Dangaard Brouer,
Eugenio Perez Martin
On Wed, May 06, 2020 at 04:37:41PM +0800, Jason Wang wrote:
>
> On 2020/5/6 下午4:08, Michael S. Tsirkin wrote:
> > So for mergeable bufs, we use ewma machinery to guess the correct buffer
> > size. If we don't guess correctly, XDP has to do aggressive copies.
> >
> > Problem is, xdp paths do not update the ewma at all, except
> > sometimes with XDP_PASS. So whatever we happen to have
> > before we attach XDP, will mostly stay around.
>
>
> It looks ok to me since we always use PAGE_SIZE when XDP is enabled in
> get_mergeable_buf_len()?
>
> Thanks
>
Oh right. Good point! Answered in another thread.
> >
> > The fix is probably to update ewma unconditionally.
> >
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2020-05-06 11:57 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-05-06 8:08 performance bug in virtio net xdp Michael S. Tsirkin
2020-05-06 8:37 ` Jason Wang
2020-05-06 11:57 ` Michael S. Tsirkin
2020-05-06 8:37 ` Jesper Dangaard Brouer
2020-05-06 11:57 ` Michael S. Tsirkin
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).