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 <[email protected]>
---
 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

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to