Thread (58 messages) 58 messages, 11 authors, 2021-10-06

Re: [PATCH v14 bpf-next 00/18] mvneta: introduce XDP multi-buffer support

From: Magnus Karlsson <hidden>
Date: 2021-09-28 11:48:42
Also in: bpf

On Tue, Sep 21, 2021 at 12:04 PM Eelco Chaudron [off-list ref] wrote:


On 21 Sep 2021, at 0:44, Toke Høiland-Jørgensen wrote:
quoted
Jakub Kicinski [off-list ref] writes:
quoted
On Mon, 20 Sep 2021 23:01:48 +0200 Toke Høiland-Jørgensen wrote:
quoted
quoted
In fact I don't think there is anything infra can do better for
flushing than the prog itself:

   bool mod = false;

   ptr = bpf_header_pointer(...);
   ...
   if (some_cond(...)) {
           change_packet(...);
           mod = true;
   }
   ...
   if (mod)
to have an additional check like:

if (mod && ptr == stack)

(or something to that effect). No?
Good point. Do you think we should have the kernel add/inline this
optimization or have the user do it explicitly.
Hmm, good question. On the one hand it seems like an easy optimisation
to add, but on the other hand maybe the caller has other logic that can
better know how/when to omit the check.

Hmm, but the helper needs to check it anyway, doesn't it? At least it
can't just blindly memcpy() if the source and destination would be the
same...
quoted
The draft API was:

void *xdp_mb_pointer_flush(struct xdp_buff *xdp_md, u32 flags,
                           u32 offset, u32 len, void *stack_buf)

Which does not take the ptr returned by header_pointer(), but that's
easy to add (well, easy other than the fact it'd be the 6th arg).
I guess we could play some trickery with stuffing offset/len/flags into
one or two u64s to save an argument or two?
quoted
BTW I drafted the API this way to cater to the case where flush()
is called without a prior call to header_pointer(). For when packet
trailer or header is populated directly from a map value. Dunno if
that's actually useful, either.
Ah, didn't think of that; so then it really becomes a generic
xdp_store_bytes()-type helper? Might be useful, I suppose. Adding
headers is certainly a fairly common occurrence, but dunno to what
extent they'd be copied wholesale from a map (hadn't thought about doing
that before either).

Sorry for commenting late but I was busy and had to catch up on emails...

I like the idea, as these APIs are exactly what I proposed in April, https://lore.kernel.org/bpf/FD3E6E08-DE78-4FBA-96F6-646C93E88631@redhat.com/ (local)

I did not call it flush, as it can be used as a general function to copy data to a specific location.
Here is some performance data (throughput) for this patch set on i40e
(40 Gbit/s NIC). All using the xdp_rxq_info sample and NO multi-buffer
packets.

With v14 only:

XDP_DROP: +4%
XDP_TX: +1%
XDP_PASS: -1%

With v14 plus multi-buffer support implemented in i40e courtesy of Tirtha:

XDP_DROP: +3%
XDP_TX: -1%
XDP_PASS: -2%

/Magnus
//Eelco
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help