On 06/28/2019 11:12 AM, Toke Høiland-Jørgensen wrote:
> When using the bpf_redirect_map() helper to redirect packets from XDP, the 
> eBPF
> program cannot currently know whether the redirect will succeed, which makes 
> it
> impossible to gracefully handle errors. To properly fix this will probably
> require deeper changes to the way TX resources are allocated, but one thing 
> that
> is fairly straight forward to fix is to allow lookups into devmaps, so 
> programs
> can at least know when a redirect is *guaranteed* to fail because there is no
> entry in the map. Currently, programs work around this by keeping a shadow map
> of another type which indicates whether a map index is valid.
> 
> This series contains two changes that are complementary ways to fix this 
> issue:
> 
> - Moving the map lookup into the bpf_redirect_map() helper (and caching the
>   result), so the helper can return an error if no value is found in the map.
>   This includes a refactoring of the devmap and cpumap code to not care about
>   the index on enqueue.
> 
> - Allowing regular lookups into devmaps from eBPF programs, using the 
> read-only
>   flag to make sure they don't change the values.
> 
> The performance impact of the series is negligible, in the sense that I cannot
> measure it because the variance between test runs is higher than the 
> difference
> pre/post series.
> 
> Changelog:
> 
> v6:
>   - Factor out list handling in maps to a helper in list.h (new patch 1)
>   - Rename variables in struct bpf_redirect_info (new patch 3 + patch 4)
>   - Explain why we are clearing out the map in the info struct on lookup 
> failure
>   - Remove unneeded check for forwarding target in tracepoint macro
> 
> v5:
>   - Rebase on latest bpf-next.
>   - Update documentation for bpf_redirect_map() with the new meaning of flags.
> 
> v4:
>   - Fix a few nits from Andrii
>   - Lose the #defines in bpf.h and just compare the flags argument directly to
>     XDP_TX in bpf_xdp_redirect_map().
> 
> v3:
>   - Adopt Jonathan's idea of using the lower two bits of the flag value as the
>     return code.
>   - Always do the lookup, and cache the result for use in xdp_do_redirect(); 
> to
>     achieve this, refactor the devmap and cpumap code to get rid the bitmap 
> for
>     selecting which devices to flush.
> 
> v2:
>   - For patch 1, make it clear that the change works for any map type.
>   - For patch 2, just use the new BPF_F_RDONLY_PROG flag to make the return
>     value read-only.
> 
> ---
> 
> Toke Høiland-Jørgensen (5):
>       xskmap: Move non-standard list manipulation to helper
>       devmap/cpumap: Use flush list instead of bitmap
>       devmap: Rename ifindex member in bpf_redirect_info
>       bpf_xdp_redirect_map: Perform map lookup in eBPF helper
>       devmap: Allow map lookups from eBPF
> 
> 
>  include/linux/filter.h     |    3 +
>  include/linux/list.h       |   14 ++++++
>  include/trace/events/xdp.h |    5 +-
>  include/uapi/linux/bpf.h   |    7 ++-
>  kernel/bpf/cpumap.c        |  105 +++++++++++++++++++----------------------
>  kernel/bpf/devmap.c        |  112 
> ++++++++++++++++++++------------------------
>  kernel/bpf/verifier.c      |    7 +--
>  kernel/bpf/xskmap.c        |    3 -
>  net/core/filter.c          |   60 ++++++++++++------------
>  9 files changed, 157 insertions(+), 159 deletions(-)
> 

Applied, thanks!

Reply via email to