Re: [PATCH bpf-next v2 4/8] xsk: register XDP sockets at bind(), and add new AF_XDP BPF helper
From: Toke Høiland-Jørgensen <hidden>
Date: 2021-01-20 20:37:23
Also in:
bpf
Björn Töpel [off-list ref] writes:
On 2021-01-20 18:29, Toke Høiland-Jørgensen wrote:quoted
Björn Töpel [off-list ref] writes:quoted
On 2021-01-20 15:54, Toke Høiland-Jørgensen wrote:quoted
Björn Töpel [off-list ref] writes:quoted
On 2021-01-20 13:50, Toke Høiland-Jørgensen wrote:quoted
Björn Töpel [off-list ref] writes:quoted
diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h index c001766adcbc..bbc7d9a57262 100644 --- a/include/uapi/linux/bpf.h +++ b/include/uapi/linux/bpf.h@@ -3836,6 +3836,12 @@ union bpf_attr { * Return * A pointer to a struct socket on success or NULL if the file is * not a socket. + * + * long bpf_redirect_xsk(struct xdp_buff *xdp_md, u64 action) + * Description + * Redirect to the registered AF_XDP socket. + * Return + * **XDP_REDIRECT** on success, otherwise the action parameter is returned. */I think it would be better to make the second argument a 'flags' argument and make values > XDP_TX invalid (like we do in bpf_xdp_redirect_map() now). By allowing any value as return you lose the ability to turn it into a flags argument later...Yes, but that adds a run-time check. I prefer this non-checked version, even though it is a bit less futureproof.That...seems a bit short-sighted? :) Can you actually see a difference in your performance numbers?I would rather add an additional helper *if* we see the need for flags, instead of paying for that upfront. For me, BPF is about being able to specialize, and not having one call with tons of checks.I get that, I'm just pushing back because omitting a 'flags' argument is literally among the most frequent reasons for having to replace a syscall (see e.g., [0]) instead of extending it. And yeah, I do realise that the performance implications are different for XDP than for syscalls, but maintainability of the API is also important; it's all a tradeoff. This will be the third redirect helper variant for XDP and I'd hate for the fourth one to have to be bpf_redirect_xsk_flags() because it did turn out to be needed... (One potential concrete reason for this: I believe Magnus was talking about an API that would allow a BPF program to redirect a packet into more than one socket (cloning it in the process), or to redirect to a socket+another target. How would you do that with this new helper?) [0] https://lwn.net/Articles/585415/I have a bit of different view. One of the really nice parts about BPF is exactly specialization. A user can tailor the kernel do a specific thing. I *don't* see an issue with yet another helper, if that is needed in the future. I think that is better than bloated helpers trying to cope for all scenarios. I don't mean we should just add helpers all over the place, but I do see more lightly on adding helpers, than adding syscalls. Elaborating a bit on this: many device drivers try to handle all the things in the fast-path. I see BPF as one way forward to moving away from that. Setup what you need, and only run what you currently need, instead of the current "Is bleh on, then baz? Is this on, then that." So, I would like to avoid "future proofing" the helpers, if that makes sense. Use what you need. That's why BPF is so good (one of the things)!
Well, it's a tradeoff. We're still defining an API that should not be (too) confusing...
As for bpf_redirect_xsk() it's a leaner version of bpf_redirect_map(). You want flags/shared sockets/...? Well go use bpf_redirect_map() and XSKMAP. bpf_redirect_xsk() is not for you.
This argument, however, I buy: bpf_redirect() is the single-purpose helper for redirecting to an ifindex, bpf_redirect_xsk() is the single-purpose helper for redirecting to an XSK, and bpf_redirect_map() is the generic one that does both of those and more. Fair enough, consider me convinced :)
A lot of back-and-forth for *one* if-statement, but it's kind of a design thing for me. ;-)
Surely you don't mean to imply that you have *better* things to do with your time than have a 10-emails-long argument over a single if statement? ;) -Toke