Skip to content

Commit 10d30e3

Browse files
kevin-laatz-intelborkmann
authored andcommitted
libbpf: add flags to umem config
This patch adds a 'flags' field to the umem_config and umem_reg structs. This will allow for more options to be added for configuring umems. The first use for the flags field is to add a flag for unaligned chunks mode. These flags can either be user-provided or filled with a default. Since we change the size of the xsk_umem_config struct, we need to version the ABI. This patch includes the ABI versioning for xsk_umem__create. The Makefile was also updated to handle multiple function versions in check-abi. Signed-off-by: Kevin Laatz <[email protected]> Signed-off-by: Ciara Loftus <[email protected]> Acked-by: Jonathan Lemon <[email protected]> Signed-off-by: Daniel Borkmann <[email protected]>
1 parent 282c0c7 commit 10d30e3

File tree

5 files changed

+71
-4
lines changed

5 files changed

+71
-4
lines changed

tools/include/uapi/linux/if_xdp.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@
2626
*/
2727
#define XDP_USE_NEED_WAKEUP (1 << 3)
2828

29+
/* Flags for xsk_umem_config flags */
30+
#define XDP_UMEM_UNALIGNED_CHUNK_FLAG (1 << 0)
31+
2932
struct sockaddr_xdp {
3033
__u16 sxdp_family;
3134
__u16 sxdp_flags;
@@ -66,6 +69,7 @@ struct xdp_umem_reg {
6669
__u64 len; /* Length of packet data area */
6770
__u32 chunk_size;
6871
__u32 headroom;
72+
__u32 flags;
6973
};
7074

7175
struct xdp_statistics {
@@ -87,6 +91,11 @@ struct xdp_options {
8791
#define XDP_UMEM_PGOFF_FILL_RING 0x100000000ULL
8892
#define XDP_UMEM_PGOFF_COMPLETION_RING 0x180000000ULL
8993

94+
/* Masks for unaligned chunks mode */
95+
#define XSK_UNALIGNED_BUF_OFFSET_SHIFT 48
96+
#define XSK_UNALIGNED_BUF_ADDR_MASK \
97+
((1ULL << XSK_UNALIGNED_BUF_OFFSET_SHIFT) - 1)
98+
9099
/* Rx/Tx descriptor */
91100
struct xdp_desc {
92101
__u64 addr;

tools/lib/bpf/Makefile

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,9 @@ LIB_FILE := $(addprefix $(OUTPUT),$(LIB_FILE))
134134
PC_FILE := $(addprefix $(OUTPUT),$(PC_FILE))
135135

136136
GLOBAL_SYM_COUNT = $(shell readelf -s --wide $(BPF_IN) | \
137-
awk '/GLOBAL/ && /DEFAULT/ && !/UND/ {s++} END{print s}')
137+
cut -d "@" -f1 | sed 's/_v[0-9]_[0-9]_[0-9].*//' | \
138+
awk '/GLOBAL/ && /DEFAULT/ && !/UND/ {print $$8}' | \
139+
sort -u | wc -l)
138140
VERSIONED_SYM_COUNT = $(shell readelf -s --wide $(OUTPUT)libbpf.so | \
139141
grep -Eo '[^ ]+@LIBBPF_' | cut -d@ -f1 | sort -u | wc -l)
140142

@@ -201,6 +203,7 @@ check_abi: $(OUTPUT)libbpf.so
201203
"Please make sure all LIBBPF_API symbols are" \
202204
"versioned in $(VERSION_SCRIPT)." >&2; \
203205
readelf -s --wide $(OUTPUT)libbpf-in.o | \
206+
cut -d "@" -f1 | sed 's/_v[0-9]_[0-9]_[0-9].*//' | \
204207
awk '/GLOBAL/ && /DEFAULT/ && !/UND/ {print $$8}'| \
205208
sort -u > $(OUTPUT)libbpf_global_syms.tmp; \
206209
readelf -s --wide $(OUTPUT)libbpf.so | \

tools/lib/bpf/libbpf.map

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,7 @@ LIBBPF_0.0.4 {
183183
perf_buffer__new;
184184
perf_buffer__new_raw;
185185
perf_buffer__poll;
186+
xsk_umem__create;
186187
} LIBBPF_0.0.3;
187188

188189
LIBBPF_0.0.5 {

tools/lib/bpf/xsk.c

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,13 +99,15 @@ static void xsk_set_umem_config(struct xsk_umem_config *cfg,
9999
cfg->comp_size = XSK_RING_CONS__DEFAULT_NUM_DESCS;
100100
cfg->frame_size = XSK_UMEM__DEFAULT_FRAME_SIZE;
101101
cfg->frame_headroom = XSK_UMEM__DEFAULT_FRAME_HEADROOM;
102+
cfg->flags = XSK_UMEM__DEFAULT_FLAGS;
102103
return;
103104
}
104105

105106
cfg->fill_size = usr_cfg->fill_size;
106107
cfg->comp_size = usr_cfg->comp_size;
107108
cfg->frame_size = usr_cfg->frame_size;
108109
cfg->frame_headroom = usr_cfg->frame_headroom;
110+
cfg->flags = usr_cfg->flags;
109111
}
110112

111113
static int xsk_set_xdp_socket_config(struct xsk_socket_config *cfg,
@@ -132,9 +134,10 @@ static int xsk_set_xdp_socket_config(struct xsk_socket_config *cfg,
132134
return 0;
133135
}
134136

135-
int xsk_umem__create(struct xsk_umem **umem_ptr, void *umem_area, __u64 size,
136-
struct xsk_ring_prod *fill, struct xsk_ring_cons *comp,
137-
const struct xsk_umem_config *usr_config)
137+
int xsk_umem__create_v0_0_4(struct xsk_umem **umem_ptr, void *umem_area,
138+
__u64 size, struct xsk_ring_prod *fill,
139+
struct xsk_ring_cons *comp,
140+
const struct xsk_umem_config *usr_config)
138141
{
139142
struct xdp_mmap_offsets off;
140143
struct xdp_umem_reg mr;
@@ -165,6 +168,7 @@ int xsk_umem__create(struct xsk_umem **umem_ptr, void *umem_area, __u64 size,
165168
mr.len = size;
166169
mr.chunk_size = umem->config.frame_size;
167170
mr.headroom = umem->config.frame_headroom;
171+
mr.flags = umem->config.flags;
168172

169173
err = setsockopt(umem->fd, SOL_XDP, XDP_UMEM_REG, &mr, sizeof(mr));
170174
if (err) {
@@ -238,6 +242,29 @@ int xsk_umem__create(struct xsk_umem **umem_ptr, void *umem_area, __u64 size,
238242
return err;
239243
}
240244

245+
struct xsk_umem_config_v1 {
246+
__u32 fill_size;
247+
__u32 comp_size;
248+
__u32 frame_size;
249+
__u32 frame_headroom;
250+
};
251+
252+
int xsk_umem__create_v0_0_2(struct xsk_umem **umem_ptr, void *umem_area,
253+
__u64 size, struct xsk_ring_prod *fill,
254+
struct xsk_ring_cons *comp,
255+
const struct xsk_umem_config *usr_config)
256+
{
257+
struct xsk_umem_config config;
258+
259+
memcpy(&config, usr_config, sizeof(struct xsk_umem_config_v1));
260+
config.flags = 0;
261+
262+
return xsk_umem__create_v0_0_4(umem_ptr, umem_area, size, fill, comp,
263+
&config);
264+
}
265+
asm(".symver xsk_umem__create_v0_0_2, xsk_umem__create@LIBBPF_0.0.2");
266+
asm(".symver xsk_umem__create_v0_0_4, xsk_umem__create@@LIBBPF_0.0.4");
267+
241268
static int xsk_load_xdp_prog(struct xsk_socket *xsk)
242269
{
243270
static const int log_buf_size = 16 * 1024;

tools/lib/bpf/xsk.h

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,21 @@ static inline void *xsk_umem__get_data(void *umem_area, __u64 addr)
168168
return &((char *)umem_area)[addr];
169169
}
170170

171+
static inline __u64 xsk_umem__extract_addr(__u64 addr)
172+
{
173+
return addr & XSK_UNALIGNED_BUF_ADDR_MASK;
174+
}
175+
176+
static inline __u64 xsk_umem__extract_offset(__u64 addr)
177+
{
178+
return addr >> XSK_UNALIGNED_BUF_OFFSET_SHIFT;
179+
}
180+
181+
static inline __u64 xsk_umem__add_offset_to_addr(__u64 addr)
182+
{
183+
return xsk_umem__extract_addr(addr) + xsk_umem__extract_offset(addr);
184+
}
185+
171186
LIBBPF_API int xsk_umem__fd(const struct xsk_umem *umem);
172187
LIBBPF_API int xsk_socket__fd(const struct xsk_socket *xsk);
173188

@@ -176,12 +191,14 @@ LIBBPF_API int xsk_socket__fd(const struct xsk_socket *xsk);
176191
#define XSK_UMEM__DEFAULT_FRAME_SHIFT 12 /* 4096 bytes */
177192
#define XSK_UMEM__DEFAULT_FRAME_SIZE (1 << XSK_UMEM__DEFAULT_FRAME_SHIFT)
178193
#define XSK_UMEM__DEFAULT_FRAME_HEADROOM 0
194+
#define XSK_UMEM__DEFAULT_FLAGS 0
179195

180196
struct xsk_umem_config {
181197
__u32 fill_size;
182198
__u32 comp_size;
183199
__u32 frame_size;
184200
__u32 frame_headroom;
201+
__u32 flags;
185202
};
186203

187204
/* Flags for the libbpf_flags field. */
@@ -201,6 +218,16 @@ LIBBPF_API int xsk_umem__create(struct xsk_umem **umem,
201218
struct xsk_ring_prod *fill,
202219
struct xsk_ring_cons *comp,
203220
const struct xsk_umem_config *config);
221+
LIBBPF_API int xsk_umem__create_v0_0_2(struct xsk_umem **umem,
222+
void *umem_area, __u64 size,
223+
struct xsk_ring_prod *fill,
224+
struct xsk_ring_cons *comp,
225+
const struct xsk_umem_config *config);
226+
LIBBPF_API int xsk_umem__create_v0_0_4(struct xsk_umem **umem,
227+
void *umem_area, __u64 size,
228+
struct xsk_ring_prod *fill,
229+
struct xsk_ring_cons *comp,
230+
const struct xsk_umem_config *config);
204231
LIBBPF_API int xsk_socket__create(struct xsk_socket **xsk,
205232
const char *ifname, __u32 queue_id,
206233
struct xsk_umem *umem,

0 commit comments

Comments
 (0)