diff options
Diffstat (limited to 'tools/lib/bpf/xsk.c')
| -rw-r--r-- | tools/lib/bpf/xsk.c | 97 | 
1 files changed, 48 insertions, 49 deletions
diff --git a/tools/lib/bpf/xsk.c b/tools/lib/bpf/xsk.c index 680e63066cf3..24fa313524fb 100644 --- a/tools/lib/bpf/xsk.c +++ b/tools/lib/bpf/xsk.c @@ -65,7 +65,6 @@ struct xsk_socket {  	int xsks_map_fd;  	__u32 queue_id;  	char ifname[IFNAMSIZ]; -	bool zc;  };  struct xsk_nl_info { @@ -74,23 +73,6 @@ struct xsk_nl_info {  	int fd;  }; -/* For 32-bit systems, we need to use mmap2 as the offsets are 64-bit. - * Unfortunately, it is not part of glibc. - */ -static inline void *xsk_mmap(void *addr, size_t length, int prot, int flags, -			     int fd, __u64 offset) -{ -#ifdef __NR_mmap2 -	unsigned int page_shift = __builtin_ffs(getpagesize()) - 1; -	long ret = syscall(__NR_mmap2, addr, length, prot, flags, fd, -			   (off_t)(offset >> page_shift)); - -	return (void *)ret; -#else -	return mmap(addr, length, prot, flags, fd, offset); -#endif -} -  int xsk_umem__fd(const struct xsk_umem *umem)  {  	return umem ? umem->fd : -EINVAL; @@ -116,6 +98,7 @@ static void xsk_set_umem_config(struct xsk_umem_config *cfg,  		cfg->comp_size = XSK_RING_CONS__DEFAULT_NUM_DESCS;  		cfg->frame_size = XSK_UMEM__DEFAULT_FRAME_SIZE;  		cfg->frame_headroom = XSK_UMEM__DEFAULT_FRAME_HEADROOM; +		cfg->flags = XSK_UMEM__DEFAULT_FLAGS;  		return;  	} @@ -123,6 +106,7 @@ static void xsk_set_umem_config(struct xsk_umem_config *cfg,  	cfg->comp_size = usr_cfg->comp_size;  	cfg->frame_size = usr_cfg->frame_size;  	cfg->frame_headroom = usr_cfg->frame_headroom; +	cfg->flags = usr_cfg->flags;  }  static int xsk_set_xdp_socket_config(struct xsk_socket_config *cfg, @@ -149,9 +133,10 @@ static int xsk_set_xdp_socket_config(struct xsk_socket_config *cfg,  	return 0;  } -int xsk_umem__create(struct xsk_umem **umem_ptr, void *umem_area, __u64 size, -		     struct xsk_ring_prod *fill, struct xsk_ring_cons *comp, -		     const struct xsk_umem_config *usr_config) +int xsk_umem__create_v0_0_4(struct xsk_umem **umem_ptr, void *umem_area, +			    __u64 size, struct xsk_ring_prod *fill, +			    struct xsk_ring_cons *comp, +			    const struct xsk_umem_config *usr_config)  {  	struct xdp_mmap_offsets off;  	struct xdp_umem_reg mr; @@ -182,6 +167,7 @@ int xsk_umem__create(struct xsk_umem **umem_ptr, void *umem_area, __u64 size,  	mr.len = size;  	mr.chunk_size = umem->config.frame_size;  	mr.headroom = umem->config.frame_headroom; +	mr.flags = umem->config.flags;  	err = setsockopt(umem->fd, SOL_XDP, XDP_UMEM_REG, &mr, sizeof(mr));  	if (err) { @@ -210,10 +196,9 @@ int xsk_umem__create(struct xsk_umem **umem_ptr, void *umem_area, __u64 size,  		goto out_socket;  	} -	map = xsk_mmap(NULL, off.fr.desc + -		       umem->config.fill_size * sizeof(__u64), -		       PROT_READ | PROT_WRITE, MAP_SHARED | MAP_POPULATE, -		       umem->fd, XDP_UMEM_PGOFF_FILL_RING); +	map = mmap(NULL, off.fr.desc + umem->config.fill_size * sizeof(__u64), +		   PROT_READ | PROT_WRITE, MAP_SHARED | MAP_POPULATE, umem->fd, +		   XDP_UMEM_PGOFF_FILL_RING);  	if (map == MAP_FAILED) {  		err = -errno;  		goto out_socket; @@ -224,13 +209,13 @@ int xsk_umem__create(struct xsk_umem **umem_ptr, void *umem_area, __u64 size,  	fill->size = umem->config.fill_size;  	fill->producer = map + off.fr.producer;  	fill->consumer = map + off.fr.consumer; +	fill->flags = map + off.fr.flags;  	fill->ring = map + off.fr.desc;  	fill->cached_cons = umem->config.fill_size; -	map = xsk_mmap(NULL, -		       off.cr.desc + umem->config.comp_size * sizeof(__u64), -		       PROT_READ | PROT_WRITE, MAP_SHARED | MAP_POPULATE, -		       umem->fd, XDP_UMEM_PGOFF_COMPLETION_RING); +	map = mmap(NULL, off.cr.desc + umem->config.comp_size * sizeof(__u64), +		   PROT_READ | PROT_WRITE, MAP_SHARED | MAP_POPULATE, umem->fd, +		   XDP_UMEM_PGOFF_COMPLETION_RING);  	if (map == MAP_FAILED) {  		err = -errno;  		goto out_mmap; @@ -241,6 +226,7 @@ int xsk_umem__create(struct xsk_umem **umem_ptr, void *umem_area, __u64 size,  	comp->size = umem->config.comp_size;  	comp->producer = map + off.cr.producer;  	comp->consumer = map + off.cr.consumer; +	comp->flags = map + off.cr.flags;  	comp->ring = map + off.cr.desc;  	*umem_ptr = umem; @@ -255,6 +241,29 @@ out_umem_alloc:  	return err;  } +struct xsk_umem_config_v1 { +	__u32 fill_size; +	__u32 comp_size; +	__u32 frame_size; +	__u32 frame_headroom; +}; + +int xsk_umem__create_v0_0_2(struct xsk_umem **umem_ptr, void *umem_area, +			    __u64 size, struct xsk_ring_prod *fill, +			    struct xsk_ring_cons *comp, +			    const struct xsk_umem_config *usr_config) +{ +	struct xsk_umem_config config; + +	memcpy(&config, usr_config, sizeof(struct xsk_umem_config_v1)); +	config.flags = 0; + +	return xsk_umem__create_v0_0_4(umem_ptr, umem_area, size, fill, comp, +					&config); +} +asm(".symver xsk_umem__create_v0_0_2, xsk_umem__create@LIBBPF_0.0.2"); +asm(".symver xsk_umem__create_v0_0_4, xsk_umem__create@@LIBBPF_0.0.4"); +  static int xsk_load_xdp_prog(struct xsk_socket *xsk)  {  	static const int log_buf_size = 16 * 1024; @@ -481,7 +490,6 @@ int xsk_socket__create(struct xsk_socket **xsk_ptr, const char *ifname,  	void *rx_map = NULL, *tx_map = NULL;  	struct sockaddr_xdp sxdp = {};  	struct xdp_mmap_offsets off; -	struct xdp_options opts;  	struct xsk_socket *xsk;  	socklen_t optlen;  	int err; @@ -550,11 +558,10 @@ int xsk_socket__create(struct xsk_socket **xsk_ptr, const char *ifname,  	}  	if (rx) { -		rx_map = xsk_mmap(NULL, off.rx.desc + -				  xsk->config.rx_size * sizeof(struct xdp_desc), -				  PROT_READ | PROT_WRITE, -				  MAP_SHARED | MAP_POPULATE, -				  xsk->fd, XDP_PGOFF_RX_RING); +		rx_map = mmap(NULL, off.rx.desc + +			      xsk->config.rx_size * sizeof(struct xdp_desc), +			      PROT_READ | PROT_WRITE, MAP_SHARED | MAP_POPULATE, +			      xsk->fd, XDP_PGOFF_RX_RING);  		if (rx_map == MAP_FAILED) {  			err = -errno;  			goto out_socket; @@ -564,16 +571,16 @@ int xsk_socket__create(struct xsk_socket **xsk_ptr, const char *ifname,  		rx->size = xsk->config.rx_size;  		rx->producer = rx_map + off.rx.producer;  		rx->consumer = rx_map + off.rx.consumer; +		rx->flags = rx_map + off.rx.flags;  		rx->ring = rx_map + off.rx.desc;  	}  	xsk->rx = rx;  	if (tx) { -		tx_map = xsk_mmap(NULL, off.tx.desc + -				  xsk->config.tx_size * sizeof(struct xdp_desc), -				  PROT_READ | PROT_WRITE, -				  MAP_SHARED | MAP_POPULATE, -				  xsk->fd, XDP_PGOFF_TX_RING); +		tx_map = mmap(NULL, off.tx.desc + +			      xsk->config.tx_size * sizeof(struct xdp_desc), +			      PROT_READ | PROT_WRITE, MAP_SHARED | MAP_POPULATE, +			      xsk->fd, XDP_PGOFF_TX_RING);  		if (tx_map == MAP_FAILED) {  			err = -errno;  			goto out_mmap_rx; @@ -583,6 +590,7 @@ int xsk_socket__create(struct xsk_socket **xsk_ptr, const char *ifname,  		tx->size = xsk->config.tx_size;  		tx->producer = tx_map + off.tx.producer;  		tx->consumer = tx_map + off.tx.consumer; +		tx->flags = tx_map + off.tx.flags;  		tx->ring = tx_map + off.tx.desc;  		tx->cached_cons = xsk->config.tx_size;  	} @@ -601,15 +609,6 @@ int xsk_socket__create(struct xsk_socket **xsk_ptr, const char *ifname,  	xsk->prog_fd = -1; -	optlen = sizeof(opts); -	err = getsockopt(xsk->fd, SOL_XDP, XDP_OPTIONS, &opts, &optlen); -	if (err) { -		err = -errno; -		goto out_mmap_tx; -	} - -	xsk->zc = opts.flags & XDP_OPTIONS_ZEROCOPY; -  	if (!(xsk->config.libbpf_flags & XSK_LIBBPF_FLAGS__INHIBIT_PROG_LOAD)) {  		err = xsk_setup_xdp_prog(xsk);  		if (err)  |