diff mbox series

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

Message ID 1572996938-23957-1-git-send-email-u9012063@gmail.com
State Awaiting Upstream
Headers show
Series [ovs-dev,net-next] xsk: Enable shared umem support. | expand

Commit Message

William Tu Nov. 5, 2019, 11:35 p.m. UTC
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.

Tested using OVS at:
https://mail.openvswitch.org/pipermail/ovs-dev/2019-November/364392.html

Signed-off-by: William Tu <u9012063@gmail.com>
---
 net/xdp/xsk.c       |  5 -----
 tools/lib/bpf/xsk.c | 10 +++++-----
 2 files changed, 5 insertions(+), 10 deletions(-)

Comments

Magnus Karlsson Nov. 6, 2019, 4:53 p.m. UTC | #1
On Wed, Nov 6, 2019 at 12:41 AM William Tu <u9012063@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@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
>
William Tu Nov. 6, 2019, 5:38 p.m. UTC | #2
On Wed, Nov 06, 2019 at 05:53:09PM +0100, Magnus Karlsson wrote:
> On Wed, Nov 6, 2019 at 12:41 AM William Tu <u9012063@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
> 
Hi Magnus,

Thank you. I will wait for your patch set.

William
diff mbox series

Patch

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;