hairpin.sh 1.7 KB

123456789101112131415161718192021222324
  1. #!/usr/bin/env bash
  2. # Set the mlx5 hairpin queue size (the forwarding buffer of the opposite-node paths) on the four
  3. # fabric functions, one at a time, and wait for each to come back. Functions already at the value
  4. # are skipped. hairpin_queue_size is a driverinit parameter: it resets at boot, and applying it
  5. # re-initialises the function (~4 s), which drops every RDMA connection on it. Never run it with a
  6. # new value while the engine is up. usage: hairpin.sh [PACKETS] (default 8192; driver default 1024)
  7. set -euo pipefail
  8. V=${1:-8192}
  9. for x in 0000:01:00.0:enp1s0f0np0:rocep1s0f0 0000:01:00.1:enp1s0f1np1:rocep1s0f1 \
  10. 0002:01:00.0:enP2p1s0f0np0:roceP2p1s0f0 0002:01:00.1:enP2p1s0f1np1:roceP2p1s0f1; do
  11. B=pci/${x%%:en*}; r=${x#*:*:*:}; N=${r%%:*}; D=${r##*:}
  12. cur=$(devlink dev param show "$B" name hairpin_queue_size | sed -n 's/.*cmode driverinit value \([0-9]*\).*/\1/p')
  13. if [[ "$cur" == "$V" ]]; then echo " $(hostname) $N: hairpin_queue_size already $V"; continue; fi
  14. devlink dev param set "$B" name hairpin_queue_size value "$V" cmode driverinit
  15. devlink dev reload "$B" action driver_reinit >/dev/null
  16. for i in $(seq 1 30); do
  17. [[ "$(cat /sys/class/net/$N/operstate 2>/dev/null)" == up ]] && ip -4 addr show "$N" | grep -q inet \
  18. && [[ "$(cat /sys/class/net/$N/mtu)" == 9000 ]] && grep -q "4: ACTIVE" "/sys/class/infiniband/$D/ports/1/state" 2>/dev/null \
  19. && [[ "$(cat /sys/class/infiniband/$D/ports/1/gids/3)" != 0000:0000:0000:0000:0000:0000:0000:0000 ]] && break
  20. sleep 2
  21. done
  22. [[ $i -lt 30 ]] || { echo " $(hostname) $N: did not come back after re-init" >&2; exit 2; }
  23. echo " $(hostname) $N: hairpin_queue_size $cur -> $V, back after $((i * 2)) s"
  24. done