diff --git a/BM/dma/dma_test.sh b/BM/dma/dma_test.sh new file mode 100755 index 0000000..8633a37 --- /dev/null +++ b/BM/dma/dma_test.sh @@ -0,0 +1,91 @@ +#!/bin/bash + +############################# Global variables ################################ +DMA_SYSFS_DIR="/sys/class/dma" +DMA_MODULE="dmatest" +lasttime=$(dmesg | tail -1 | cut -d']' -f1 | sed 's/.*\[\|\s//g') + +############################# Functions ####################################### + +usage() +{ + cat <<-EOF >&2 + usage: ./${0##*/} [-l TEST_LOOP] [-t TESTCASE_ID] [-p THREADS] [-i ITERATIONS] [-b BUFF_SIZE] [-c DMA_CH] + -l TEST_LOOP test loop + -t TESTCASE_ID test case id, which case to be run + -p THREADS how many threads use dma + -i ITERATIONS transfer for how many times + -b BUFF_SIZE DMA buffer size + -c DMA_CH which channel to be test + -h Help print this usage +EOF + exit 0 +} + +init_device() +{ + echo dsa0 > /sys/bus/dsa/drivers/idxd/unbind || true + modprobe -r idxd || true + modprobe idxd + echo 0 > /sys/bus/dsa/devices/dsa0/wq0.0/group_id + echo dedicated > /sys/bus/dsa/devices/dsa0/wq0.0/mode + echo 10 > /sys/bus/dsa/devices/dsa0/wq0.0/priority + echo 16 > /sys/bus/dsa/devices/dsa0/wq0.0/size + echo "kernel" > /sys/bus/dsa/devices/dsa0/wq0.0/type + echo "dma2chan0" > /sys/bus/dsa/devices/dsa0/wq0.0/name + echo "dmaengine" > /sys/bus/dsa/devices/dsa0/wq0.0/driver_name + echo 0 > /sys/bus/dsa/devices/dsa0/engine0.0/group_id + echo dsa0 > /sys/bus/dsa/drivers/idxd/bind + echo wq0.0 > /sys/bus/dsa/drivers/dmaengine/bind +} + +############################### CLI Params ################################### +while getopts :l:t:p:i:b:c:h arg; do + case $arg in + l) TEST_LOOP="$OPTARG";; + p) THREAD="$OPTARG";; + i) ITERATION="$OPTARG";; + b) BUFF_SIZE="$OPTARG";; + c) DMA_CH="$OPTARG";; + h) usage;; + :) echo "$0: Must supply an argument to -$OPTARG." + exit 1 + ;; + \?) echo "Invalid Option -$OPTARG ignored." + usage + exit 1 + ;; + esac +done + +########################### DYNAMICALLY-DEFINED Params ######################## +: ${TEST_LOOP:='1'} +: ${THREAD:='1'} +: ${ITERATION:='10000'} +: ${BUFF_SIZE:='4096'} + +init_device + +i=0 +while [ $i -lt $TEST_LOOP ]; do + modprobe -r dmatest || true + modprobe dmatest run=$THREAD iterations=$ITERATION wait=1 test_buf_size=$BUFF_SIZE channel="" timeout=2000 || { + echo "Failed to modprobe $DMA_MODULE" + exit 1 + } + + result=$(dmesg | sed "1,/$lasttime/d" | grep dmatest | grep -w "0 failures") + + i=$((i+1)) +done + +modprobe -r dmatest +echo dsa0 > /sys/bus/dsa/drivers/idxd/unbind + +[ -z "$result" ] && { + echo "DMA mem2mem copy failed, dmesg is:$(dmesg | sed "1,/$lasttime/d")" + exit 1 +} + +exit 0 + diff --git a/BM/dma/tests b/BM/dma/tests new file mode 100644 index 0000000..b08c0cb --- /dev/null +++ b/BM/dma/tests @@ -0,0 +1,9 @@ +# @name DMATEST +# @desc DMATEST uses dmatest.ko module to runs tests on all available dma channels +# @requires dmatest + +dma_test.sh -l 1 -p 1 -i 100 -b 32 -c "" +dma_test.sh -l 1 -p 1 -i 100 -b 4096 -c "" +dma_test.sh -l 10 -p 1 -i 1000 -b 32 -c "" +dma_test.sh -l 10 -p 1 -i 1000 -b 4096 -c "" +dma_test.sh -l 1 -p 1 -i 1000 -b 409600 -c ""