On Mon, Apr 23, 2018 at 9:56 AM, Björn Töpel <bjorn.to...@gmail.com> wrote:
> From: Björn Töpel <bjorn.to...@intel.com>
>
> The xskmap is yet another BPF map, very much inspired by
> dev/cpu/sockmap, and is a holder of AF_XDP sockets. A user application
> adds AF_XDP sockets into the map, and by using the bpf_redirect_map
> helper, an XDP program can redirect XDP frames to an AF_XDP socket.
>
> Note that a socket that is bound to certain ifindex/queue index will
> *only* accept XDP frames from that netdev/queue index. If an XDP
> program tries to redirect from a netdev/queue index other than what
> the socket is bound to, the frame will not be received on the socket.
>
> A socket can reside in multiple maps.
>
> Signed-off-by: Björn Töpel <bjorn.to...@intel.com>

> +struct xsk_map_entry {
> +       struct xdp_sock *xs;
> +       struct rcu_head rcu;
> +};

> +struct xdp_sock *__xsk_map_lookup_elem(struct bpf_map *map, u32 key)
> +{
> +       struct xsk_map *m = container_of(map, struct xsk_map, map);
> +       struct xsk_map_entry *entry;
> +
> +       if (key >= map->max_entries)
> +               return NULL;
> +
> +       entry = READ_ONCE(m->xsk_map[key]);
> +       return entry ? entry->xs : NULL;
> +}

This dynamically allocated structure adds an extra cacheline lookup. If
xdp_sock gets an rcu_head, it can be linked into the map directly.

Reply via email to