diff options
| author | Maxim Mikityanskiy <maximmi@mellanox.com> | 2019-06-26 10:35:27 -0400 |
|---|---|---|
| committer | Daniel Borkmann <daniel@iogearbox.net> | 2019-06-27 16:53:26 -0400 |
| commit | 123e8da1d33042a83cedb530fb5efd64f32ce594 (patch) | |
| tree | 747874074537addeea7a217af8aaaeeaf512331e /samples | |
| parent | 2761ed4b6e192820760d5ba913834b2ba05fd08c (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.c | 44 |
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; | |||
| 68 | static int opt_poll; | 68 | static int opt_poll; |
| 69 | static int opt_interval = 1; | 69 | static int opt_interval = 1; |
| 70 | static u32 opt_xdp_bind_flags; | 70 | static u32 opt_xdp_bind_flags; |
| 71 | static int opt_xsk_frame_size = XSK_UMEM__DEFAULT_FRAME_SIZE; | ||
| 71 | static __u32 prog_id; | 72 | static __u32 prog_id; |
| 72 | 73 | ||
| 73 | struct xsk_umem_info { | 74 | struct xsk_umem_info { |
| @@ -276,6 +277,12 @@ static size_t gen_eth_frame(struct xsk_umem_info *umem, u64 addr) | |||
| 276 | static struct xsk_umem_info *xsk_configure_umem(void *buffer, u64 size) | 277 | static 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 | ||
| 437 | static void kick_tx(struct xsk_socket_info *xsk) | 452 | static 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); |
