summaryrefslogtreecommitdiffstats
path: root/samples
diff options
context:
space:
mode:
authorMaxim Mikityanskiy <maximmi@mellanox.com>2019-06-26 10:35:27 -0400
committerDaniel Borkmann <daniel@iogearbox.net>2019-06-27 16:53:26 -0400
commit123e8da1d33042a83cedb530fb5efd64f32ce594 (patch)
tree747874074537addeea7a217af8aaaeeaf512331e /samples
parent2761ed4b6e192820760d5ba913834b2ba05fd08c (diff)
xsk: Change the default frame size to 4096 and allow controlling it
The typical XDP memory scheme is one packet per page. Change the AF_XDP frame size in libbpf to 4096, which is the page size on x86, to allow libbpf to be used with the drivers with the packet-per-page scheme. Add a command line option -f to xdpsock to allow to specify a custom frame size. Signed-off-by: Maxim Mikityanskiy <maximmi@mellanox.com> Signed-off-by: Tariq Toukan <tariqt@mellanox.com> Acked-by: Saeed Mahameed <saeedm@mellanox.com> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Diffstat (limited to 'samples')
-rw-r--r--samples/bpf/xdpsock_user.c44
1 files changed, 28 insertions, 16 deletions
diff --git a/samples/bpf/xdpsock_user.c b/samples/bpf/xdpsock_user.c
index 0f5eb0d7f2df..93eaaf7239b2 100644
--- a/samples/bpf/xdpsock_user.c
+++ b/samples/bpf/xdpsock_user.c
@@ -68,6 +68,7 @@ static int opt_queue;
68static int opt_poll; 68static int opt_poll;
69static int opt_interval = 1; 69static int opt_interval = 1;
70static u32 opt_xdp_bind_flags; 70static u32 opt_xdp_bind_flags;
71static int opt_xsk_frame_size = XSK_UMEM__DEFAULT_FRAME_SIZE;
71static __u32 prog_id; 72static __u32 prog_id;
72 73
73struct xsk_umem_info { 74struct xsk_umem_info {
@@ -276,6 +277,12 @@ static size_t gen_eth_frame(struct xsk_umem_info *umem, u64 addr)
276static struct xsk_umem_info *xsk_configure_umem(void *buffer, u64 size) 277static struct xsk_umem_info *xsk_configure_umem(void *buffer, u64 size)
277{ 278{
278 struct xsk_umem_info *umem; 279 struct xsk_umem_info *umem;
280 struct xsk_umem_config cfg = {
281 .fill_size = XSK_RING_PROD__DEFAULT_NUM_DESCS,
282 .comp_size = XSK_RING_CONS__DEFAULT_NUM_DESCS,
283 .frame_size = opt_xsk_frame_size,
284 .frame_headroom = XSK_UMEM__DEFAULT_FRAME_HEADROOM,
285 };
279 int ret; 286 int ret;
280 287
281 umem = calloc(1, sizeof(*umem)); 288 umem = calloc(1, sizeof(*umem));
@@ -283,7 +290,7 @@ static struct xsk_umem_info *xsk_configure_umem(void *buffer, u64 size)
283 exit_with_error(errno); 290 exit_with_error(errno);
284 291
285 ret = xsk_umem__create(&umem->umem, buffer, size, &umem->fq, &umem->cq, 292 ret = xsk_umem__create(&umem->umem, buffer, size, &umem->fq, &umem->cq,
286 NULL); 293 &cfg);
287 if (ret) 294 if (ret)
288 exit_with_error(-ret); 295 exit_with_error(-ret);
289 296
@@ -323,11 +330,9 @@ static struct xsk_socket_info *xsk_configure_socket(struct xsk_umem_info *umem)
323 &idx); 330 &idx);
324 if (ret != XSK_RING_PROD__DEFAULT_NUM_DESCS) 331 if (ret != XSK_RING_PROD__DEFAULT_NUM_DESCS)
325 exit_with_error(-ret); 332 exit_with_error(-ret);
326 for (i = 0; 333 for (i = 0; i < XSK_RING_PROD__DEFAULT_NUM_DESCS; i++)
327 i < XSK_RING_PROD__DEFAULT_NUM_DESCS * 334 *xsk_ring_prod__fill_addr(&xsk->umem->fq, idx++) =
328 XSK_UMEM__DEFAULT_FRAME_SIZE; 335 i * opt_xsk_frame_size;
329 i += XSK_UMEM__DEFAULT_FRAME_SIZE)
330 *xsk_ring_prod__fill_addr(&xsk->umem->fq, idx++) = i;
331 xsk_ring_prod__submit(&xsk->umem->fq, 336 xsk_ring_prod__submit(&xsk->umem->fq,
332 XSK_RING_PROD__DEFAULT_NUM_DESCS); 337 XSK_RING_PROD__DEFAULT_NUM_DESCS);
333 338
@@ -346,6 +351,7 @@ static struct option long_options[] = {
346 {"interval", required_argument, 0, 'n'}, 351 {"interval", required_argument, 0, 'n'},
347 {"zero-copy", no_argument, 0, 'z'}, 352 {"zero-copy", no_argument, 0, 'z'},
348 {"copy", no_argument, 0, 'c'}, 353 {"copy", no_argument, 0, 'c'},
354 {"frame-size", required_argument, 0, 'f'},
349 {0, 0, 0, 0} 355 {0, 0, 0, 0}
350}; 356};
351 357
@@ -365,8 +371,9 @@ static void usage(const char *prog)
365 " -n, --interval=n Specify statistics update interval (default 1 sec).\n" 371 " -n, --interval=n Specify statistics update interval (default 1 sec).\n"
366 " -z, --zero-copy Force zero-copy mode.\n" 372 " -z, --zero-copy Force zero-copy mode.\n"
367 " -c, --copy Force copy mode.\n" 373 " -c, --copy Force copy mode.\n"
374 " -f, --frame-size=n Set the frame size (must be a power of two, default is %d).\n"
368 "\n"; 375 "\n";
369 fprintf(stderr, str, prog); 376 fprintf(stderr, str, prog, XSK_UMEM__DEFAULT_FRAME_SIZE);
370 exit(EXIT_FAILURE); 377 exit(EXIT_FAILURE);
371} 378}
372 379
@@ -377,7 +384,7 @@ static void parse_command_line(int argc, char **argv)
377 opterr = 0; 384 opterr = 0;
378 385
379 for (;;) { 386 for (;;) {
380 c = getopt_long(argc, argv, "Frtli:q:psSNn:cz", long_options, 387 c = getopt_long(argc, argv, "Frtli:q:psSNn:czf:", long_options,
381 &option_index); 388 &option_index);
382 if (c == -1) 389 if (c == -1)
383 break; 390 break;
@@ -420,6 +427,9 @@ static void parse_command_line(int argc, char **argv)
420 case 'F': 427 case 'F':
421 opt_xdp_flags &= ~XDP_FLAGS_UPDATE_IF_NOEXIST; 428 opt_xdp_flags &= ~XDP_FLAGS_UPDATE_IF_NOEXIST;
422 break; 429 break;
430 case 'f':
431 opt_xsk_frame_size = atoi(optarg);
432 break;
423 default: 433 default:
424 usage(basename(argv[0])); 434 usage(basename(argv[0]));
425 } 435 }
@@ -432,6 +442,11 @@ static void parse_command_line(int argc, char **argv)
432 usage(basename(argv[0])); 442 usage(basename(argv[0]));
433 } 443 }
434 444
445 if (opt_xsk_frame_size & (opt_xsk_frame_size - 1)) {
446 fprintf(stderr, "--frame-size=%d is not a power of two\n",
447 opt_xsk_frame_size);
448 usage(basename(argv[0]));
449 }
435} 450}
436 451
437static void kick_tx(struct xsk_socket_info *xsk) 452static void kick_tx(struct xsk_socket_info *xsk)
@@ -583,8 +598,7 @@ static void tx_only(struct xsk_socket_info *xsk)
583 598
584 for (i = 0; i < BATCH_SIZE; i++) { 599 for (i = 0; i < BATCH_SIZE; i++) {
585 xsk_ring_prod__tx_desc(&xsk->tx, idx + i)->addr 600 xsk_ring_prod__tx_desc(&xsk->tx, idx + i)->addr
586 = (frame_nb + i) << 601 = (frame_nb + i) * opt_xsk_frame_size;
587 XSK_UMEM__DEFAULT_FRAME_SHIFT;
588 xsk_ring_prod__tx_desc(&xsk->tx, idx + i)->len = 602 xsk_ring_prod__tx_desc(&xsk->tx, idx + i)->len =
589 sizeof(pkt_data) - 1; 603 sizeof(pkt_data) - 1;
590 } 604 }
@@ -661,21 +675,19 @@ int main(int argc, char **argv)
661 } 675 }
662 676
663 ret = posix_memalign(&bufs, getpagesize(), /* PAGE_SIZE aligned */ 677 ret = posix_memalign(&bufs, getpagesize(), /* PAGE_SIZE aligned */
664 NUM_FRAMES * XSK_UMEM__DEFAULT_FRAME_SIZE); 678 NUM_FRAMES * opt_xsk_frame_size);
665 if (ret) 679 if (ret)
666 exit_with_error(ret); 680 exit_with_error(ret);
667 681
668 /* Create sockets... */ 682 /* Create sockets... */
669 umem = xsk_configure_umem(bufs, 683 umem = xsk_configure_umem(bufs, NUM_FRAMES * opt_xsk_frame_size);
670 NUM_FRAMES * XSK_UMEM__DEFAULT_FRAME_SIZE);
671 xsks[num_socks++] = xsk_configure_socket(umem); 684 xsks[num_socks++] = xsk_configure_socket(umem);
672 685
673 if (opt_bench == BENCH_TXONLY) { 686 if (opt_bench == BENCH_TXONLY) {
674 int i; 687 int i;
675 688
676 for (i = 0; i < NUM_FRAMES * XSK_UMEM__DEFAULT_FRAME_SIZE; 689 for (i = 0; i < NUM_FRAMES; i++)
677 i += XSK_UMEM__DEFAULT_FRAME_SIZE) 690 (void)gen_eth_frame(umem, i * opt_xsk_frame_size);
678 (void)gen_eth_frame(umem, i);
679 } 691 }
680 692
681 signal(SIGINT, int_exit); 693 signal(SIGINT, int_exit);