Files
suricata/qa/live/dpdk/dpdk-testsuite.sh
T
Lukas Sismis 214e47bea1 dpdk: move to native queue-sized mempools
As a legacy from Suricata 7, mempool size was kept even internally
as a global size. Since in Suricata 8, mempool allocation moved to
per queue model, it makes sense to calculate the correct size right
when loading the configuration.

The previous implementation misscalculated in some scenarios the size
of the mempool which prevented Suricata starting successfully.
This happened, e.g. when there were 32k RX descriptors and 64 TX descs.
The resulting mempool was incorrectly deduced as 32767 (2^n-1), which
didn't even hold all RX descriptors. Instead, it should result to 65535.

Ticket: 8370
2026-04-16 05:58:17 +00:00

214 lines
7.9 KiB
Bash
Executable File

#!/bin/bash
#
# DPDK run test suite.
#
#
# Usage:
# dpdk-testsuite.sh
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
CHECKLOG="${SCRIPT_DIR}/dpdk-checklog.sh"
IDS_YAML="${SCRIPT_DIR}/suricata-null-ids.yaml"
BOND_YAML="${SCRIPT_DIR}/suricata-null-bond.yaml"
PASS=0
FAIL=0
run_test() {
local description="$1"; shift
echo ""
echo "=== TEST: ${description} ==="
local t0=$SECONDS
if bash "$CHECKLOG" "$@"; then
echo " (${description}: $((SECONDS - t0))s)"
PASS=$((PASS + 1))
else
echo " (${description}: $((SECONDS - t0))s)"
FAIL=$((FAIL + 1))
echo "^^^ FAILED: ${description}"
fi
}
# IDS (single interface: net_null0, 16 rx/tx descriptors)
run_test "IDS: auto mempool, auto cache (1 thread)" \
--interface-cfg-set net_null0.threads=1 \
--interface-cfg-set net_null0.mempool-size=auto \
--interface-cfg-set net_null0.mempool-cache-size=auto \
--suricata-log-check-grep "1 packet mempools of size 63, cache size 21" \
--expect-start \
"$IDS_YAML"
run_test "IDS: auto mempool, auto cache (2 threads)" \
--interface-cfg-set net_null0.threads=2 \
--interface-cfg-set net_null0.mempool-size=auto \
--interface-cfg-set net_null0.mempool-cache-size=auto \
--suricata-log-check-grep "2 packet mempools of size 63, cache size 21" \
--expect-start \
"$IDS_YAML"
run_test "IDS: auto mempool, static cache=1 (1 thread)" \
--interface-cfg-set net_null0.threads=1 \
--interface-cfg-set net_null0.mempool-size=auto \
--interface-cfg-set net_null0.mempool-cache-size=1 \
--suricata-log-check-grep "1 packet mempools of size 63, cache size 1" \
--expect-start \
"$IDS_YAML"
run_test "IDS: auto mempool, static cache=1 (2 threads)" \
--interface-cfg-set net_null0.threads=2 \
--interface-cfg-set net_null0.mempool-size=auto \
--interface-cfg-set net_null0.mempool-cache-size=1 \
--suricata-log-check-grep "2 packet mempools of size 63, cache size 1" \
--expect-start \
"$IDS_YAML"
run_test "IDS: auto mempool, oversized cache=1024 (fail)" \
--interface-cfg-set net_null0.threads=1 \
--interface-cfg-set net_null0.mempool-size=auto \
--interface-cfg-set net_null0.mempool-cache-size=1024 \
--suricata-log-check-grep "mempool cache size requires a positive number" \
--expect-fail \
"$IDS_YAML"
run_test "IDS: static mempool=1023, auto cache (1 thread)" \
--interface-cfg-set net_null0.threads=1 \
--interface-cfg-set net_null0.mempool-size=1023 \
--interface-cfg-set net_null0.mempool-cache-size=auto \
--suricata-log-check-grep "1 packet mempools of size 1023, cache size 341" \
--expect-start \
"$IDS_YAML"
# 2^n - 1 mempool size recommendation
run_test "IDS: static mempool=1024, auto cache (1 thread)" \
--interface-cfg-set net_null0.threads=1 \
--interface-cfg-set net_null0.mempool-size=1024 \
--interface-cfg-set net_null0.mempool-cache-size=auto \
--suricata-log-check-grep "1 packet mempools of size 1023, cache size 341" \
--expect-start \
"$IDS_YAML"
run_test "IDS: static mempool=1023, auto cache (2 threads)" \
--interface-cfg-set net_null0.threads=2 \
--interface-cfg-set net_null0.mempool-size=1023 \
--interface-cfg-set net_null0.mempool-cache-size=auto \
--suricata-log-check-grep "2 packet mempools of size 511, cache size 73" \
--expect-start \
"$IDS_YAML"
run_test "IDS: mempool too small (fail)" \
--interface-cfg-set net_null0.threads=1 \
--interface-cfg-set net_null0.mempool-size=15 \
--suricata-log-check-grep "mempool size is likely too small" \
--expect-fail \
"$IDS_YAML"
run_test "IDS: mempool too small for queues (fail)" \
--interface-cfg-set net_null0.threads=2 \
--interface-cfg-set net_null0.mempool-size=1 \
--suricata-log-check-grep "mempool size is likely too small" \
--expect-fail \
"$IDS_YAML"
# power-of-two boundary: 32 is exactly nb_rx_desc + nb_tx_desc, must not undercount
run_test "IDS: static mempool=32, power-of-two boundary (fail)" \
--interface-cfg-set net_null0.threads=1 \
--interface-cfg-set net_null0.mempool-size=32 \
--suricata-log-check-grep "mempool size is likely too small" \
--expect-fail \
"$IDS_YAML"
run_test "IDS: static mempool=64, power-of-two boundary (1 thread)" \
--interface-cfg-set net_null0.threads=1 \
--interface-cfg-set net_null0.mempool-size=64 \
--interface-cfg-set net_null0.mempool-cache-size=auto \
--suricata-log-check-grep "1 packet mempools of size 63, cache size 21" \
--expect-start \
"$IDS_YAML"
run_test "IDS: auto descriptors, auto mempool (OOM expected with nohuge)" \
--interface-cfg-set net_null0.threads=1 \
--interface-cfg-set net_null0.mempool-size=auto \
--interface-cfg-set net_null0.mempool-cache-size=auto \
--interface-cfg-set net_null0.rx-descriptors=auto \
--interface-cfg-set net_null0.tx-descriptors=auto \
--suricata-log-check-grep "1 packet mempools of size 65535, cache size 257" \
--suricata-log-check-grep "rte_pktmbuf_pool_create failed" \
--expect-fail \
"$IDS_YAML"
# Bond (net_bonding0, 2 members, 16 rx/tx descriptors)
run_test "Bond: auto mempool, auto cache (1 thread)" \
--interface-cfg-set net_bonding0.threads=1 \
--interface-cfg-set net_bonding0.mempool-size=auto \
--interface-cfg-set net_bonding0.mempool-cache-size=auto \
--suricata-log-check-grep "1 packet mempools of size 127, cache size 1" \
--expect-start \
"$BOND_YAML"
run_test "Bond: auto mempool, auto cache (2 threads)" \
--interface-cfg-set net_bonding0.threads=2 \
--interface-cfg-set net_bonding0.mempool-size=auto \
--interface-cfg-set net_bonding0.mempool-cache-size=auto \
--suricata-log-check-grep "2 packet mempools of size 127, cache size 1" \
--expect-start \
"$BOND_YAML"
run_test "Bond: auto mempool, static cache=7 (1 thread)" \
--interface-cfg-set net_bonding0.threads=1 \
--interface-cfg-set net_bonding0.mempool-size=auto \
--interface-cfg-set net_bonding0.mempool-cache-size=7 \
--suricata-log-check-grep "1 packet mempools of size 127, cache size 7" \
--expect-start \
"$BOND_YAML"
run_test "Bond: auto mempool, static cache=7 (2 threads)" \
--interface-cfg-set net_bonding0.threads=2 \
--interface-cfg-set net_bonding0.mempool-size=auto \
--interface-cfg-set net_bonding0.mempool-cache-size=7 \
--suricata-log-check-grep "2 packet mempools of size 127, cache size 7" \
--expect-start \
"$BOND_YAML"
run_test "Bond: auto mempool, oversized cache=1024 (fail)" \
--interface-cfg-set net_bonding0.threads=1 \
--interface-cfg-set net_bonding0.mempool-size=auto \
--interface-cfg-set net_bonding0.mempool-cache-size=1024 \
--suricata-log-check-grep "mempool cache size requires a positive number" \
--expect-fail \
"$BOND_YAML"
run_test "Bond: static mempool=1023, auto cache (1 thread)" \
--interface-cfg-set net_bonding0.threads=1 \
--interface-cfg-set net_bonding0.mempool-size=1023 \
--interface-cfg-set net_bonding0.mempool-cache-size=auto \
--suricata-log-check-grep "1 packet mempools of size 1023, cache size 341" \
--expect-start \
"$BOND_YAML"
run_test "Bond: static mempool=1023, auto cache (2 threads)" \
--interface-cfg-set net_bonding0.threads=2 \
--interface-cfg-set net_bonding0.mempool-size=1023 \
--interface-cfg-set net_bonding0.mempool-cache-size=auto \
--suricata-log-check-grep "2 packet mempools of size 511, cache size 73" \
--expect-start \
"$BOND_YAML"
run_test "Bond: mempool too small (fail)" \
--interface-cfg-set net_bonding0.threads=1 \
--interface-cfg-set net_bonding0.mempool-size=15 \
--suricata-log-check-grep "mempool size is likely too small" \
--expect-fail \
"$BOND_YAML"
# Summary
echo ""
echo "=========================================="
echo " DPDK test suite: ${PASS} passed, ${FAIL} failed"
echo "=========================================="
exit $FAIL