bpf.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Re: [RFC PATCH bpf-next] bpf, xdp: per-map bpf_redirect_map functions for XDP
       [not found] <20210129153215.190888-1-bjorn.topel@gmail.com>
@ 2021-01-29 16:45 ` Toke Høiland-Jørgensen
  2021-02-01  6:27   ` Björn Töpel
       [not found] ` <CAJ+HfNiFtRd-KKMB1t3Mi3MZ=C+u5TTM5YFnzJFfR4Ruzc7c9Q@mail.gmail.com>
  1 sibling, 1 reply; 5+ messages in thread
From: Toke Høiland-Jørgensen @ 2021-01-29 16:45 UTC (permalink / raw)
  To: Björn Töpel, ast, daniel, netdev, bpf
  Cc: Björn Töpel, magnus.karlsson, maciej.fijalkowski, kuba,
	jonathan.lemon, maximmi, davem, hawk, john.fastabend

Björn Töpel <bjorn.topel@gmail.com> writes:

> From: Björn Töpel <bjorn.topel@intel.com>
>
> Currently the bpf_redirect_map() implementation dispatches to the
> correct map-lookup function via a switch-statement. To avoid the
> dispatching, this change adds one bpf_redirect_map() implementation per
> map. Correct function is automatically selected by the BPF verifier.
>
> Signed-off-by: Björn Töpel <bjorn.topel@intel.com>
> ---
> Hi XDP-folks!
>
> This is another take on my bpf_redirect_xsk() patch [1]. I figured I
> send it as an RFC for some early input. My plan is to include it as
> part of the xdp_do_redirect() optimization of [1].

Assuming the maintainers are OK with the special-casing in the verifier,
this looks like a neat way to avoid the runtime overhead to me. The
macro hackery is not the prettiest; I wonder if the same effect could be
achieved by using inline functions? If not, at least a comment
explaining the reasoning (and that the verifier will substitute the
right function) might be nice? Mostly in relation to this bit:

>  static const struct bpf_func_proto bpf_xdp_redirect_map_proto = {
> -	.func           = bpf_xdp_redirect_map,
> +	.func           = bpf_xdp_redirect_devmap,

Ah, if only we were writing the kernel in a language with proper macro
support... One can dream! :)

>> For AF_XDP rxdrop this yields +600Mpps. I'll do CPU/DEVMAP
>> measurements for the patch proper.
>>
>
> Kpps, not Mpps. :-P

Aww, too bad ;)
Still, nice!

-Toke


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [RFC PATCH bpf-next] bpf, xdp: per-map bpf_redirect_map functions for XDP
       [not found] ` <CAJ+HfNiFtRd-KKMB1t3Mi3MZ=C+u5TTM5YFnzJFfR4Ruzc7c9Q@mail.gmail.com>
@ 2021-01-29 18:06   ` Jesper Dangaard Brouer
  0 siblings, 0 replies; 5+ messages in thread
From: Jesper Dangaard Brouer @ 2021-01-29 18:06 UTC (permalink / raw)
  To: Björn Töpel
  Cc: Alexei Starovoitov, Daniel Borkmann, Netdev, bpf,
	Björn Töpel, Karlsson, Magnus, Fijalkowski, Maciej,
	Jakub Kicinski, Jonathan Lemon, maximmi, David Miller,
	Jesper Dangaard Brouer, John Fastabend,
	Toke Høiland-Jørgensen

On Fri, 29 Jan 2021 16:35:47 +0100
Björn Töpel <bjorn.topel@gmail.com> wrote:

> On Fri, 29 Jan 2021 at 16:32, Björn Töpel <bjorn.topel@gmail.com> wrote:
> >
> > From: Björn Töpel <bjorn.topel@intel.com>
> >  
> [...]
> >
> > For AF_XDP rxdrop this yields +600Mpps. I'll do CPU/DEVMAP
> > measurements for the patch proper.
> >  
> 
> Kpps, not Mpps. :-P

+600Kpps from 24Mpps to 24.6Mpps I assume.  This corresponds to approx
1 ns ((1/24-1/24.6)*1000 = 1.01626 ns).

This also correlate with saving one function call, which is basically
what the patch does.

Fresh measurement "Intel(R) Xeon(R) CPU E5-1650 v4 @ 3.60GHz" with [1]:
 time_bench: Type:funcion_call_cost Per elem: 3 cycles(tsc) 1.053 ns
 time_bench: Type:func_ptr_call_cost Per elem: 4 cycles(tsc) 1.317 ns

[1] https://github.com/netoptimizer/prototype-kernel/blob/master/kernel/lib/time_bench_sample.c
-- 
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: [RFC PATCH bpf-next] bpf, xdp: per-map bpf_redirect_map functions for XDP
  2021-01-29 16:45 ` [RFC PATCH bpf-next] bpf, xdp: per-map bpf_redirect_map functions for XDP Toke Høiland-Jørgensen
@ 2021-02-01  6:27   ` Björn Töpel
  2021-02-01  9:31     ` Jesper Dangaard Brouer
  0 siblings, 1 reply; 5+ messages in thread
From: Björn Töpel @ 2021-02-01  6:27 UTC (permalink / raw)
  To: Toke Høiland-Jørgensen, Björn Töpel, ast,
	daniel, netdev, bpf
  Cc: magnus.karlsson, maciej.fijalkowski, kuba, jonathan.lemon,
	maximmi, davem, hawk, john.fastabend

On 2021-01-29 17:45, Toke Høiland-Jørgensen wrote:
> Björn Töpel <bjorn.topel@gmail.com> writes:
> 
>> From: Björn Töpel <bjorn.topel@intel.com>
>>
>> Currently the bpf_redirect_map() implementation dispatches to the
>> correct map-lookup function via a switch-statement. To avoid the
>> dispatching, this change adds one bpf_redirect_map() implementation per
>> map. Correct function is automatically selected by the BPF verifier.
>>
>> Signed-off-by: Björn Töpel <bjorn.topel@intel.com>
>> ---
>> Hi XDP-folks!
>>
>> This is another take on my bpf_redirect_xsk() patch [1]. I figured I
>> send it as an RFC for some early input. My plan is to include it as
>> part of the xdp_do_redirect() optimization of [1].
> 
> Assuming the maintainers are OK with the special-casing in the verifier,
> this looks like a neat way to avoid the runtime overhead to me. The
> macro hackery is not the prettiest; I wonder if the same effect could be
> achieved by using inline functions? If not, at least a comment
> explaining the reasoning (and that the verifier will substitute the
> right function) might be nice? Mostly in relation to this bit:
>

Yeah, I agree with the macro part. I'll replace it with a
__always_inline function, instead.


>>   static const struct bpf_func_proto bpf_xdp_redirect_map_proto = {
>> -	.func           = bpf_xdp_redirect_map,
>> +	.func           = bpf_xdp_redirect_devmap,
>

I'll try to clean this up as well.

Thanks for taking a look!
Björn


> Ah, if only we were writing the kernel in a language with proper macro
> support... One can dream! :)
> 
>>> For AF_XDP rxdrop this yields +600Mpps. I'll do CPU/DEVMAP
>>> measurements for the patch proper.
>>>
>>
>> Kpps, not Mpps. :-P
> 
> Aww, too bad ;)
> Still, nice!
> 
> -Toke
> 

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [RFC PATCH bpf-next] bpf, xdp: per-map bpf_redirect_map functions for XDP
  2021-02-01  6:27   ` Björn Töpel
@ 2021-02-01  9:31     ` Jesper Dangaard Brouer
  2021-02-01  9:49       ` Björn Töpel
  0 siblings, 1 reply; 5+ messages in thread
From: Jesper Dangaard Brouer @ 2021-02-01  9:31 UTC (permalink / raw)
  To: Björn Töpel
  Cc: Toke Høiland-Jørgensen, Björn Töpel, ast,
	daniel, netdev, bpf, magnus.karlsson, maciej.fijalkowski, kuba,
	jonathan.lemon, maximmi, davem, hawk, john.fastabend

On Mon, 1 Feb 2021 07:27:57 +0100
Björn Töpel <bjorn.topel@intel.com> wrote:

> On 2021-01-29 17:45, Toke Høiland-Jørgensen wrote:
> > Björn Töpel <bjorn.topel@gmail.com> writes:
> >   
> >> From: Björn Töpel <bjorn.topel@intel.com>
> >>
> >> Currently the bpf_redirect_map() implementation dispatches to the
> >> correct map-lookup function via a switch-statement. To avoid the
> >> dispatching, this change adds one bpf_redirect_map() implementation per
> >> map. Correct function is automatically selected by the BPF verifier.
> >>
> >> Signed-off-by: Björn Töpel <bjorn.topel@intel.com>
> >> ---
> >> Hi XDP-folks!
> >>
> >> This is another take on my bpf_redirect_xsk() patch [1]. I figured I
> >> send it as an RFC for some early input. My plan is to include it as
> >> part of the xdp_do_redirect() optimization of [1].  
> > 
> > Assuming the maintainers are OK with the special-casing in the verifier,
> > this looks like a neat way to avoid the runtime overhead to me. The
> > macro hackery is not the prettiest; I wonder if the same effect could be
> > achieved by using inline functions? If not, at least a comment
> > explaining the reasoning (and that the verifier will substitute the
> > right function) might be nice? Mostly in relation to this bit:
> >  
> 
> Yeah, I agree with the macro part. I'll replace it with a
> __always_inline function, instead.
> 

Yes, I also prefer __always_inline over the macro.


> >>   static const struct bpf_func_proto bpf_xdp_redirect_map_proto = {
> >> -	.func           = bpf_xdp_redirect_map,
> >> +	.func           = bpf_xdp_redirect_devmap,  
> >  
> 
> I'll try to clean this up as well.

I do like the optimization of having the verifier call the right map
func directly.  Could you please add a descriptive comment that
describe this above "bpf_xdp_redirect_map_proto", that this is
happening in fixup_bpf_calls and use get_xdp_redirect_func (what you
define).  It is a cool trick, but people reading the code will have a
hard time following.

Surprisingly people do read this code and tries to follow.  I've had
discussions on the Cilium Slack channel, where people misunderstood how
our bpf_fib_lookup() calls gets mapped to two different functions
depending on context (SKB vs XDP).  And that remapping happens in the
same file (net/core/filter.c).

-- 
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: [RFC PATCH bpf-next] bpf, xdp: per-map bpf_redirect_map functions for XDP
  2021-02-01  9:31     ` Jesper Dangaard Brouer
@ 2021-02-01  9:49       ` Björn Töpel
  0 siblings, 0 replies; 5+ messages in thread
From: Björn Töpel @ 2021-02-01  9:49 UTC (permalink / raw)
  To: Jesper Dangaard Brouer
  Cc: Toke Høiland-Jørgensen, Björn Töpel, ast,
	daniel, netdev, bpf, magnus.karlsson, maciej.fijalkowski, kuba,
	jonathan.lemon, maximmi, davem, hawk, john.fastabend



On 2021-02-01 10:31, Jesper Dangaard Brouer wrote:
> On Mon, 1 Feb 2021 07:27:57 +0100
> Björn Töpel <bjorn.topel@intel.com> wrote:
> 
>> On 2021-01-29 17:45, Toke Høiland-Jørgensen wrote:
>>> Björn Töpel <bjorn.topel@gmail.com> writes:
>>>    
>>>> From: Björn Töpel <bjorn.topel@intel.com>
>>>>
>>>> Currently the bpf_redirect_map() implementation dispatches to the
>>>> correct map-lookup function via a switch-statement. To avoid the
>>>> dispatching, this change adds one bpf_redirect_map() implementation per
>>>> map. Correct function is automatically selected by the BPF verifier.
>>>>
>>>> Signed-off-by: Björn Töpel <bjorn.topel@intel.com>
>>>> ---
>>>> Hi XDP-folks!
>>>>
>>>> This is another take on my bpf_redirect_xsk() patch [1]. I figured I
>>>> send it as an RFC for some early input. My plan is to include it as
>>>> part of the xdp_do_redirect() optimization of [1].
>>>
>>> Assuming the maintainers are OK with the special-casing in the verifier,
>>> this looks like a neat way to avoid the runtime overhead to me. The
>>> macro hackery is not the prettiest; I wonder if the same effect could be
>>> achieved by using inline functions? If not, at least a comment
>>> explaining the reasoning (and that the verifier will substitute the
>>> right function) might be nice? Mostly in relation to this bit:
>>>   
>>
>> Yeah, I agree with the macro part. I'll replace it with a
>> __always_inline function, instead.
>>
> 
> Yes, I also prefer __always_inline over the macro.
>

Ok! Good!

> 
>>>>    static const struct bpf_func_proto bpf_xdp_redirect_map_proto = {
>>>> -	.func           = bpf_xdp_redirect_map,
>>>> +	.func           = bpf_xdp_redirect_devmap,
>>>   
>>
>> I'll try to clean this up as well.
> 
> I do like the optimization of having the verifier call the right map
> func directly.  Could you please add a descriptive comment that
> describe this above "bpf_xdp_redirect_map_proto", that this is
> happening in fixup_bpf_calls and use get_xdp_redirect_func (what you
> define).  It is a cool trick, but people reading the code will have a
> hard time following.
>

Good idea, and makes sense! I'll make sure to do that!

Thanks for the input!


Cheers,
Björn


> Surprisingly people do read this code and tries to follow.  I've had
> discussions on the Cilium Slack channel, where people misunderstood how
> our bpf_fib_lookup() calls gets mapped to two different functions
> depending on context (SKB vs XDP).  And that remapping happens in the
> same file (net/core/filter.c).
> 

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2021-02-01  9:50 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <20210129153215.190888-1-bjorn.topel@gmail.com>
2021-01-29 16:45 ` [RFC PATCH bpf-next] bpf, xdp: per-map bpf_redirect_map functions for XDP Toke Høiland-Jørgensen
2021-02-01  6:27   ` Björn Töpel
2021-02-01  9:31     ` Jesper Dangaard Brouer
2021-02-01  9:49       ` Björn Töpel
     [not found] ` <CAJ+HfNiFtRd-KKMB1t3Mi3MZ=C+u5TTM5YFnzJFfR4Ruzc7c9Q@mail.gmail.com>
2021-01-29 18:06   ` Jesper Dangaard Brouer

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).