Björn Töpel <bjorn.topel@xxxxxxxxx> writes: > From: Björn Töpel <bjorn.topel@xxxxxxxxx> > > The XDP_REDIRECT implementations for maps and non-maps are fairly > similar, but obviously need to take different code paths depending on > if the target is using a map or not. Today, the redirect targets for > XDP either uses a map, or is based on ifindex. > > Future commits will introduce yet another redirect target via the a > new helper, bpf_redirect_xsk(). To pave the way for that, we introduce > an explicit redirect type to bpf_redirect_info. This makes the code > easier to follow, and makes it easier to add new redirect targets. > > Further, using an explicit type in bpf_redirect_info has a slight > positive performance impact by avoiding a pointer indirection for the > map type lookup, and instead use the hot cacheline for > bpf_redirect_info. > > The bpf_redirect_info flags member is not used by XDP, and not > read/written any more. The map member is only written to when > required/used, and not unconditionally. I like the simplification. However, the handling of map clearing becomes a bit murky with this change: You're not changing anything in bpf_clear_redirect_map(), and you're removing most of the reads and writes of ri->map. Instead, bpf_xdp_redirect_map() will store the bpf_dtab_netdev pointer in ri->tgt_value, which xdp_do_redirect() will just read and use without checking. But if the map element (or the entire map) has been freed in the meantime that will be a dangling pointer. I *think* the RCU callback in dev_map_delete_elem() and the rcu_barrier() in dev_map_free() protects against this, but that is by no means obvious. So confirming this, and explaining it in a comment would be good. Also, as far as I can tell after this, ri->map is only used for the tracepoint. So how about just storing the map ID and getting rid of the READ/WRITE_ONCE() entirely? (Oh, and related to this I think this patch set will conflict with Hangbin's multi-redirect series, so maybe you two ought to coordinate? :)) -Toke