This patch adds busy-poll support for XDP sockets to libbpf. A new
option is provided in the xsk_socket_config struct called
busy_poll. The value of it is the desired batch size. A value between
1 and NAPI_WEIGHT (64) will turn it on, 0 will turn it off and any
other value will return an error.

Signed-off-by: Magnus Karlsson <magnus.karls...@intel.com>
---
 tools/include/uapi/linux/if_xdp.h |  1 +
 tools/lib/bpf/xsk.c               | 23 +++++++++++++----------
 tools/lib/bpf/xsk.h               |  1 +
 3 files changed, 15 insertions(+), 10 deletions(-)

diff --git a/tools/include/uapi/linux/if_xdp.h 
b/tools/include/uapi/linux/if_xdp.h
index caed8b1..be28a78 100644
--- a/tools/include/uapi/linux/if_xdp.h
+++ b/tools/include/uapi/linux/if_xdp.h
@@ -46,6 +46,7 @@ struct xdp_mmap_offsets {
 #define XDP_UMEM_FILL_RING             5
 #define XDP_UMEM_COMPLETION_RING       6
 #define XDP_STATISTICS                 7
+#define XDP_BUSY_POLL_BATCH_SIZE       8
 
 struct xdp_umem_reg {
        __u64 addr; /* Start of packet data area */
diff --git a/tools/lib/bpf/xsk.c b/tools/lib/bpf/xsk.c
index 557ef8d..b5538f1 100644
--- a/tools/lib/bpf/xsk.c
+++ b/tools/lib/bpf/xsk.c
@@ -120,10 +120,7 @@ static void xsk_set_umem_config(struct xsk_umem_config 
*cfg,
                return;
        }
 
-       cfg->fill_size = usr_cfg->fill_size;
-       cfg->comp_size = usr_cfg->comp_size;
-       cfg->frame_size = usr_cfg->frame_size;
-       cfg->frame_headroom = usr_cfg->frame_headroom;
+       memcpy(cfg, usr_cfg, sizeof(*usr_cfg));
 }
 
 static int xsk_set_xdp_socket_config(struct xsk_socket_config *cfg,
@@ -135,18 +132,14 @@ static int xsk_set_xdp_socket_config(struct 
xsk_socket_config *cfg,
                cfg->libbpf_flags = 0;
                cfg->xdp_flags = 0;
                cfg->bind_flags = 0;
+               cfg->busy_poll = 0;
                return 0;
        }
 
        if (usr_cfg->libbpf_flags & ~XSK_LIBBPF_FLAGS__INHIBIT_PROG_LOAD)
                return -EINVAL;
 
-       cfg->rx_size = usr_cfg->rx_size;
-       cfg->tx_size = usr_cfg->tx_size;
-       cfg->libbpf_flags = usr_cfg->libbpf_flags;
-       cfg->xdp_flags = usr_cfg->xdp_flags;
-       cfg->bind_flags = usr_cfg->bind_flags;
-
+       memcpy(cfg, usr_cfg, sizeof(*usr_cfg));
        return 0;
 }
 
@@ -632,6 +625,16 @@ int xsk_socket__create(struct xsk_socket **xsk_ptr, const 
char *ifname,
        }
        xsk->tx = tx;
 
+       if (xsk->config.busy_poll) {
+               err = setsockopt(xsk->fd, SOL_XDP, XDP_BUSY_POLL_BATCH_SIZE,
+                                &xsk->config.busy_poll,
+                                sizeof(xsk->config.busy_poll));
+               if (err) {
+                       err = -errno;
+                       goto out_mmap_tx;
+               }
+       }
+
        sxdp.sxdp_family = PF_XDP;
        sxdp.sxdp_ifindex = xsk->ifindex;
        sxdp.sxdp_queue_id = xsk->queue_id;
diff --git a/tools/lib/bpf/xsk.h b/tools/lib/bpf/xsk.h
index 82ea71a..517a56a 100644
--- a/tools/lib/bpf/xsk.h
+++ b/tools/lib/bpf/xsk.h
@@ -187,6 +187,7 @@ struct xsk_socket_config {
        __u32 libbpf_flags;
        __u32 xdp_flags;
        __u16 bind_flags;
+       __u16 busy_poll;
 };
 
 /* Set config to NULL to get the default configuration. */
-- 
2.7.4

Reply via email to