• Björn Töpel's avatar
    bpf, xdp: Restructure redirect actions · ee75aef2
    Björn Töpel authored
    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.
    
    Here, the map type and id are added to bpf_redirect_info, instead of
    the actual map. Map type, map item/ifindex, and the map_id (if any) is
    passed to xdp_do_redirect().
    
    For ifindex-based redirect, used by the bpf_redirect() XDP BFP helper,
    a special map type/id are used. Map type of UNSPEC together with map id
    equal to INT_MAX has the special meaning of an ifindex based
    redirect. Note that valid map ids are 1 inclusive, INT_MAX exclusive
    ([1,INT_MAX[).
    
    In addition to making the code easier to follow, using explicit type
    and id in bpf_redirect_info has a slight positive performance impact
    by avoiding a pointer indirection for the map type lookup, and instead
    use the cacheline for bpf_redirect_info.
    
    Since the actual map is not passed via bpf_redirect_info anymore, the
    map lookup is only done in the BPF helper. This means that the
    bpf_clear_redirect_map() function can be removed. The actual map item
    is RCU protected.
    
    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.
    Signed-off-by: default avatarBjörn Töpel <bjorn.topel@intel.com>
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Reviewed-by: default avatarMaciej Fijalkowski <maciej.fijalkowski@intel.com>
    Acked-by: default avatarJesper Dangaard Brouer <brouer@redhat.com>
    Acked-by: default avatarToke Høiland-Jørgensen <toke@redhat.com>
    Link: https://lore.kernel.org/bpf/20210308112907.559576-3-bjorn.topel@gmail.com
    ee75aef2
devmap.c 23.1 KB