Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

selftests/xsk: Introduce default Rx pkt stream

In order to prepare xdpxceiver for physical device testing, let us
introduce default Rx pkt stream. Reason for doing it is that physical
device testing will use a UMEM with a doubled size where half of it will
be used by Tx and other half by Rx. This means that pkt addresses will
differ for Tx and Rx streams. Rx thread will initialize the
xsk_umem_info::base_addr that is added here so that pkt_set(), when
working on Rx UMEM will add this offset and second half of UMEM space
will be used. Note that currently base_addr is 0 on both sides. Future
commit will do the mentioned initialization.

Previously, veth based testing worked on separate UMEMs, so single
default stream was fine.

Signed-off-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Magnus Karlsson <magnus.karlsson@intel.com>
Link: https://lore.kernel.org/bpf/20220901114813.16275-3-maciej.fijalkowski@intel.com

authored by

Maciej Fijalkowski and committed by
Daniel Borkmann
1adef064 0d68e6fe

+56 -32
+53 -31
tools/testing/selftests/bpf/xskxceiver.c
··· 433 433 ifobj->use_poll = false; 434 434 ifobj->use_fill_ring = true; 435 435 ifobj->release_rx = true; 436 - ifobj->pkt_stream = test->pkt_stream_default; 437 436 ifobj->validation_func = NULL; 438 437 439 438 if (i == 0) { 440 439 ifobj->rx_on = false; 441 440 ifobj->tx_on = true; 441 + ifobj->pkt_stream = test->tx_pkt_stream_default; 442 442 } else { 443 443 ifobj->rx_on = true; 444 444 ifobj->tx_on = false; 445 + ifobj->pkt_stream = test->rx_pkt_stream_default; 445 446 } 446 447 447 448 memset(ifobj->umem, 0, sizeof(*ifobj->umem)); ··· 466 465 static void test_spec_init(struct test_spec *test, struct ifobject *ifobj_tx, 467 466 struct ifobject *ifobj_rx, enum test_mode mode) 468 467 { 469 - struct pkt_stream *pkt_stream; 468 + struct pkt_stream *tx_pkt_stream; 469 + struct pkt_stream *rx_pkt_stream; 470 470 u32 i; 471 471 472 - pkt_stream = test->pkt_stream_default; 472 + tx_pkt_stream = test->tx_pkt_stream_default; 473 + rx_pkt_stream = test->rx_pkt_stream_default; 473 474 memset(test, 0, sizeof(*test)); 474 - test->pkt_stream_default = pkt_stream; 475 + test->tx_pkt_stream_default = tx_pkt_stream; 476 + test->rx_pkt_stream_default = rx_pkt_stream; 475 477 476 478 for (i = 0; i < MAX_INTERFACES; i++) { 477 479 struct ifobject *ifobj = i ? ifobj_rx : ifobj_tx; ··· 535 531 static void pkt_stream_restore_default(struct test_spec *test) 536 532 { 537 533 struct pkt_stream *tx_pkt_stream = test->ifobj_tx->pkt_stream; 534 + struct pkt_stream *rx_pkt_stream = test->ifobj_rx->pkt_stream; 538 535 539 - if (tx_pkt_stream != test->pkt_stream_default) { 536 + if (tx_pkt_stream != test->tx_pkt_stream_default) { 540 537 pkt_stream_delete(test->ifobj_tx->pkt_stream); 541 - test->ifobj_tx->pkt_stream = test->pkt_stream_default; 538 + test->ifobj_tx->pkt_stream = test->tx_pkt_stream_default; 542 539 } 543 540 544 - if (test->ifobj_rx->pkt_stream != test->pkt_stream_default && 545 - test->ifobj_rx->pkt_stream != tx_pkt_stream) 541 + if (rx_pkt_stream != test->rx_pkt_stream_default) { 546 542 pkt_stream_delete(test->ifobj_rx->pkt_stream); 547 - test->ifobj_rx->pkt_stream = test->pkt_stream_default; 543 + test->ifobj_rx->pkt_stream = test->rx_pkt_stream_default; 544 + } 548 545 } 549 546 550 547 static struct pkt_stream *__pkt_stream_alloc(u32 nb_pkts) ··· 568 563 569 564 static void pkt_set(struct xsk_umem_info *umem, struct pkt *pkt, u64 addr, u32 len) 570 565 { 571 - pkt->addr = addr; 566 + pkt->addr = addr + umem->base_addr; 572 567 pkt->len = len; 573 568 if (len > umem->frame_size - XDP_PACKET_HEADROOM - MIN_PKT_SIZE * 2 - umem->frame_headroom) 574 569 pkt->valid = false; ··· 607 602 608 603 pkt_stream = pkt_stream_generate(test->ifobj_tx->umem, nb_pkts, pkt_len); 609 604 test->ifobj_tx->pkt_stream = pkt_stream; 605 + pkt_stream = pkt_stream_generate(test->ifobj_rx->umem, nb_pkts, pkt_len); 610 606 test->ifobj_rx->pkt_stream = pkt_stream; 607 + } 608 + 609 + static void __pkt_stream_replace_half(struct ifobject *ifobj, u32 pkt_len, 610 + int offset) 611 + { 612 + struct xsk_umem_info *umem = ifobj->umem; 613 + struct pkt_stream *pkt_stream; 614 + u32 i; 615 + 616 + pkt_stream = pkt_stream_clone(umem, ifobj->pkt_stream); 617 + for (i = 1; i < ifobj->pkt_stream->nb_pkts; i += 2) 618 + pkt_set(umem, &pkt_stream->pkts[i], 619 + (i % umem->num_frames) * umem->frame_size + offset, pkt_len); 620 + 621 + ifobj->pkt_stream = pkt_stream; 611 622 } 612 623 613 624 static void pkt_stream_replace_half(struct test_spec *test, u32 pkt_len, int offset) 614 625 { 615 - struct xsk_umem_info *umem = test->ifobj_tx->umem; 616 - struct pkt_stream *pkt_stream; 617 - u32 i; 618 - 619 - pkt_stream = pkt_stream_clone(umem, test->pkt_stream_default); 620 - for (i = 1; i < test->pkt_stream_default->nb_pkts; i += 2) 621 - pkt_set(umem, &pkt_stream->pkts[i], 622 - (i % umem->num_frames) * umem->frame_size + offset, pkt_len); 623 - 624 - test->ifobj_tx->pkt_stream = pkt_stream; 625 - test->ifobj_rx->pkt_stream = pkt_stream; 626 + __pkt_stream_replace_half(test->ifobj_tx, pkt_len, offset); 627 + __pkt_stream_replace_half(test->ifobj_rx, pkt_len, offset); 626 628 } 627 629 628 630 static void pkt_stream_receive_half(struct test_spec *test) ··· 671 659 return pkt; 672 660 } 673 661 674 - static void pkt_stream_generate_custom(struct test_spec *test, struct pkt *pkts, u32 nb_pkts) 662 + static void __pkt_stream_generate_custom(struct ifobject *ifobj, 663 + struct pkt *pkts, u32 nb_pkts) 675 664 { 676 665 struct pkt_stream *pkt_stream; 677 666 u32 i; ··· 681 668 if (!pkt_stream) 682 669 exit_with_error(ENOMEM); 683 670 684 - test->ifobj_tx->pkt_stream = pkt_stream; 685 - test->ifobj_rx->pkt_stream = pkt_stream; 686 - 687 671 for (i = 0; i < nb_pkts; i++) { 688 - pkt_stream->pkts[i].addr = pkts[i].addr; 672 + pkt_stream->pkts[i].addr = pkts[i].addr + ifobj->umem->base_addr; 689 673 pkt_stream->pkts[i].len = pkts[i].len; 690 674 pkt_stream->pkts[i].payload = i; 691 675 pkt_stream->pkts[i].valid = pkts[i].valid; 692 676 } 677 + 678 + ifobj->pkt_stream = pkt_stream; 679 + } 680 + 681 + static void pkt_stream_generate_custom(struct test_spec *test, struct pkt *pkts, u32 nb_pkts) 682 + { 683 + __pkt_stream_generate_custom(test->ifobj_tx, pkts, nb_pkts); 684 + __pkt_stream_generate_custom(test->ifobj_rx, pkts, nb_pkts); 693 685 } 694 686 695 687 static void pkt_dump(void *pkt, u32 len) ··· 1763 1745 1764 1746 int main(int argc, char **argv) 1765 1747 { 1766 - struct pkt_stream *pkt_stream_default; 1748 + struct pkt_stream *rx_pkt_stream_default; 1749 + struct pkt_stream *tx_pkt_stream_default; 1767 1750 struct ifobject *ifobj_tx, *ifobj_rx; 1768 1751 int modes = TEST_MODE_SKB + 1; 1769 1752 u32 i, j, failed_tests = 0; ··· 1798 1779 modes++; 1799 1780 1800 1781 test_spec_init(&test, ifobj_tx, ifobj_rx, 0); 1801 - pkt_stream_default = pkt_stream_generate(ifobj_tx->umem, DEFAULT_PKT_CNT, PKT_SIZE); 1802 - if (!pkt_stream_default) 1782 + tx_pkt_stream_default = pkt_stream_generate(ifobj_tx->umem, DEFAULT_PKT_CNT, PKT_SIZE); 1783 + rx_pkt_stream_default = pkt_stream_generate(ifobj_rx->umem, DEFAULT_PKT_CNT, PKT_SIZE); 1784 + if (!tx_pkt_stream_default || !rx_pkt_stream_default) 1803 1785 exit_with_error(ENOMEM); 1804 - test.pkt_stream_default = pkt_stream_default; 1786 + test.tx_pkt_stream_default = tx_pkt_stream_default; 1787 + test.rx_pkt_stream_default = rx_pkt_stream_default; 1805 1788 1806 1789 ksft_set_plan(modes * TEST_TYPE_MAX); 1807 1790 ··· 1817 1796 failed_tests++; 1818 1797 } 1819 1798 1820 - pkt_stream_delete(pkt_stream_default); 1799 + pkt_stream_delete(tx_pkt_stream_default); 1800 + pkt_stream_delete(rx_pkt_stream_default); 1821 1801 ifobject_delete(ifobj_tx); 1822 1802 ifobject_delete(ifobj_rx); 1823 1803
+3 -1
tools/testing/selftests/bpf/xskxceiver.h
··· 99 99 u32 frame_headroom; 100 100 void *buffer; 101 101 u32 frame_size; 102 + u32 base_addr; 102 103 bool unaligned_mode; 103 104 }; 104 105 ··· 160 159 struct test_spec { 161 160 struct ifobject *ifobj_tx; 162 161 struct ifobject *ifobj_rx; 163 - struct pkt_stream *pkt_stream_default; 162 + struct pkt_stream *tx_pkt_stream_default; 163 + struct pkt_stream *rx_pkt_stream_default; 164 164 u16 total_steps; 165 165 u16 current_step; 166 166 u16 nb_sockets;