udpgso_bench.sh 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. #!/bin/bash
  2. # SPDX-License-Identifier: GPL-2.0
  3. #
  4. # Run a series of udpgso benchmarks
  5. readonly GREEN='\033[0;92m'
  6. readonly YELLOW='\033[0;33m'
  7. readonly RED='\033[0;31m'
  8. readonly NC='\033[0m' # No Color
  9. readonly TESTPORT=8000
  10. readonly KSFT_PASS=0
  11. readonly KSFT_FAIL=1
  12. readonly KSFT_SKIP=4
  13. num_pass=0
  14. num_err=0
  15. num_skip=0
  16. kselftest_test_exitcode() {
  17. local -r exitcode=$1
  18. if [[ ${exitcode} -eq ${KSFT_PASS} ]]; then
  19. num_pass=$(( $num_pass + 1 ))
  20. elif [[ ${exitcode} -eq ${KSFT_SKIP} ]]; then
  21. num_skip=$(( $num_skip + 1 ))
  22. else
  23. num_err=$(( $num_err + 1 ))
  24. fi
  25. }
  26. kselftest_exit() {
  27. echo -e "$(basename $0): PASS=${num_pass} SKIP=${num_skip} FAIL=${num_err}"
  28. if [[ $num_err -ne 0 ]]; then
  29. echo -e "$(basename $0): ${RED}FAIL${NC}"
  30. exit ${KSFT_FAIL}
  31. fi
  32. if [[ $num_skip -ne 0 ]]; then
  33. echo -e "$(basename $0): ${YELLOW}SKIP${NC}"
  34. exit ${KSFT_SKIP}
  35. fi
  36. echo -e "$(basename $0): ${GREEN}PASS${NC}"
  37. exit ${KSFT_PASS}
  38. }
  39. wake_children() {
  40. local -r jobs="$(jobs -p)"
  41. if [[ "${jobs}" != "" ]]; then
  42. kill -1 ${jobs} 2>/dev/null
  43. fi
  44. }
  45. trap wake_children EXIT
  46. run_one() {
  47. local -r args=$@
  48. local nr_socks=0
  49. local i=0
  50. local -r timeout=10
  51. ./udpgso_bench_rx -p "$TESTPORT" &
  52. ./udpgso_bench_rx -p "$TESTPORT" -t &
  53. # Wait for the above test program to get ready to receive connections.
  54. while [ "$i" -lt "$timeout" ]; do
  55. nr_socks="$(ss -lnHi | grep -c "\*:${TESTPORT}")"
  56. [ "$nr_socks" -eq 2 ] && break
  57. i=$((i + 1))
  58. sleep 1
  59. done
  60. if [ "$nr_socks" -ne 2 ]; then
  61. echo "timed out while waiting for udpgso_bench_rx"
  62. exit 1
  63. fi
  64. ./udpgso_bench_tx -p "$TESTPORT" ${args}
  65. }
  66. run_in_netns() {
  67. local -r args=$@
  68. ./in_netns.sh $0 __subprocess ${args}
  69. kselftest_test_exitcode $?
  70. }
  71. run_udp() {
  72. local -r args=$@
  73. echo "udp"
  74. run_in_netns ${args}
  75. echo "udp gso"
  76. run_in_netns ${args} -S 0
  77. echo "udp gso zerocopy"
  78. run_in_netns ${args} -S 0 -z
  79. echo "udp gso timestamp"
  80. run_in_netns ${args} -S 0 -T
  81. echo "udp gso zerocopy audit"
  82. run_in_netns ${args} -S 0 -z -a
  83. echo "udp gso timestamp audit"
  84. run_in_netns ${args} -S 0 -T -a
  85. echo "udp gso zerocopy timestamp audit"
  86. run_in_netns ${args} -S 0 -T -z -a
  87. }
  88. run_tcp() {
  89. local -r args=$@
  90. echo "tcp"
  91. run_in_netns ${args} -t
  92. echo "tcp zerocopy"
  93. run_in_netns ${args} -t -z
  94. # excluding for now because test fails intermittently
  95. # add -P option to include poll() to reduce possibility of lost messages
  96. #echo "tcp zerocopy audit"
  97. #run_in_netns ${args} -t -z -P -a
  98. }
  99. run_all() {
  100. local -r core_args="-l 3"
  101. local -r ipv4_args="${core_args} -4 -D 127.0.0.1"
  102. local -r ipv6_args="${core_args} -6 -D ::1"
  103. echo "ipv4"
  104. run_tcp "${ipv4_args}"
  105. run_udp "${ipv4_args}"
  106. echo "ipv6"
  107. run_tcp "${ipv6_args}"
  108. run_udp "${ipv6_args}"
  109. }
  110. if [[ $# -eq 0 ]]; then
  111. run_all
  112. kselftest_exit
  113. elif [[ $1 == "__subprocess" ]]; then
  114. shift
  115. run_one $@
  116. else
  117. run_in_netns $@
  118. fi