[ovs-dev] [PATCH net-next] xsk: Enable shared umem support.

Magnus Karlsson magnus.karlsson at gmail.com
Wed Nov 6 16:53:09 UTC 2019


On Wed, Nov 6, 2019 at 12:41 AM William Tu <u9012063 at gmail.com> wrote:
>
> Currently the shared umem feature is not supported in libbpf.
> The patch removes the refcount check in libbpf to enable use of
> shared umem.  Also, a umem can be shared by multiple netdevs,
> so remove the checking at xsk_bind.

Hi William,

I do have a five part patch set sitting on the shelf that implements
this as well as a sample, added documentation and support for Rx-only
and Tx-only sockets. Let me just rebase it, retest it then submit it
to the list and you can see what you think of it. It is along the
lines of what you are suggesting here. I am travelling at the moment,
so this might not happen until tomorrow.

Structure of the patch set that I will submit:

Patch 1: Adds shared umem support to libbpf
Patch 2: Shared umem support and example XPD program added to xdpsock sample
Patch 3: Adds Rx-only and Tx-only support to libbpf
Patch 4: Uses Rx-only sockets for rxdrop and Tx-only sockets for txpush in
         the xdpsock sample
Patch 5: Add documentation entries for these two features

> Tested using OVS at:
> https://mail.openvswitch.org/pipermail/ovs-dev/2019-November/364392.html
>
> Signed-off-by: William Tu <u9012063 at gmail.com>
> ---
>  net/xdp/xsk.c       |  5 -----
>  tools/lib/bpf/xsk.c | 10 +++++-----
>  2 files changed, 5 insertions(+), 10 deletions(-)
>
> diff --git a/net/xdp/xsk.c b/net/xdp/xsk.c
> index 6040bc2b0088..0f2b16e275e3 100644
> --- a/net/xdp/xsk.c
> +++ b/net/xdp/xsk.c
> @@ -697,11 +697,6 @@ static int xsk_bind(struct socket *sock, struct sockaddr *addr, int addr_len)
>                         sockfd_put(sock);
>                         goto out_unlock;
>                 }
> -               if (umem_xs->dev != dev || umem_xs->queue_id != qid) {
> -                       err = -EINVAL;
> -                       sockfd_put(sock);
> -                       goto out_unlock;
> -               }
>
>                 xdp_get_umem(umem_xs->umem);
>                 WRITE_ONCE(xs->umem, umem_xs->umem);
> diff --git a/tools/lib/bpf/xsk.c b/tools/lib/bpf/xsk.c
> index 74d84f36a5b2..e6c4eb077dcd 100644
> --- a/tools/lib/bpf/xsk.c
> +++ b/tools/lib/bpf/xsk.c
> @@ -579,16 +579,13 @@ int xsk_socket__create(struct xsk_socket **xsk_ptr, const char *ifname,
>         struct sockaddr_xdp sxdp = {};
>         struct xdp_mmap_offsets off;
>         struct xsk_socket *xsk;
> +       bool shared;
>         int err;
>
>         if (!umem || !xsk_ptr || !rx || !tx)
>                 return -EFAULT;
>
> -       if (umem->refcount) {
> -               pr_warn("Error: shared umems not supported by libbpf.\n");
> -               return -EBUSY;
> -       }
> -
> +       shared = !!(usr_config->bind_flags & XDP_SHARED_UMEM);
>         xsk = calloc(1, sizeof(*xsk));
>         if (!xsk)
>                 return -ENOMEM;
> @@ -687,6 +684,9 @@ int xsk_socket__create(struct xsk_socket **xsk_ptr, const char *ifname,
>         sxdp.sxdp_queue_id = xsk->queue_id;
>         sxdp.sxdp_flags = xsk->config.bind_flags;
>
> +       if (shared)
> +               sxdp.sxdp_shared_umem_fd = umem->fd;
> +
>         err = bind(xsk->fd, (struct sockaddr *)&sxdp, sizeof(sxdp));
>         if (err) {
>                 err = -errno;
> --
> 2.7.4
>


More information about the dev mailing list