diff --git a/tests/madvise/collect_batch.sh b/tests/madvise/collect_batch.sh index d637d26..876796f 100755 --- a/tests/madvise/collect_batch.sh +++ b/tests/madvise/collect_batch.sh @@ -25,7 +25,8 @@ while getopts "hd:p:" arg; do done # Configure IAA -./enable_kernel_iaa.sh 0 1 ${iaa_devices} 8 2 async +#./enable_kernel_iaa.sh 0 1 ${iaa_devices} 8 2 async +./enable_iaa.sh -d ${iaa_devices} -m async # Configure zswap and zram. ./enable_zswap.sh # swap disk can be used instead of zram. However, zram will avoid any disk access overheads diff --git a/tests/madvise/collect_bpftraces.sh b/tests/madvise/collect_bpftraces.sh index 2e86690..35ba65a 100755 --- a/tests/madvise/collect_bpftraces.sh +++ b/tests/madvise/collect_bpftraces.sh @@ -75,7 +75,19 @@ else fi echo ${DBATCH} > /proc/sys/vm/page-cluster || handle_error "Failed to set page-cluster" -sysctl vm.compress-batchsize=${CBATCH} || handle_error "Failed to set compress-batchsize" + +# Note: This is a temporary solution as we transition the parameter names. +PARAM_VALUE=$(sysctl -n vm.compress-batchsize 2>/dev/null) +EXIT_CODE=$? +if [ ${EXIT_CODE} -eq 0 ]; then + sysctl vm.compress-batchsize=${CBATCH} || handle_error "Failed to set compress-batchsize" +fi + +PARAM_VALUE=$(sysctl -n vm.reclaim-batchsize 2>/dev/null) +EXIT_CODE=$? +if [ ${EXIT_CODE} -eq 0 ]; then + sysctl vm.reclaim-batchsize=${CBATCH} || handle_error "Failed to set compress-batchsize" +fi # Clear transparent huge pages configuration echo 'never' > /sys/kernel/mm/transparent_hugepage/hugepages-2048kB/enabled || handle_error "Failed to clear hugepages-2048kB configuration" diff --git a/tests/madvise/collect_single_page.sh b/tests/madvise/collect_single_page.sh index 8a7619b..c02f0b7 100755 --- a/tests/madvise/collect_single_page.sh +++ b/tests/madvise/collect_single_page.sh @@ -29,7 +29,8 @@ echo "Number of IAA device: $iaa_devices" # Configure IAA devices if [ ${iaa_devices} -gt 0 ]; then - ./enable_kernel_iaa.sh 0 1 ${iaa_devices} 8 2 sync + #./enable_kernel_iaa.sh 0 1 ${iaa_devices} 8 2 sync + ./enable_iaa.sh -d ${iaa_devices} -m sync fi # Configure zswap and zram. @@ -53,7 +54,7 @@ fi comp_list=() # Create the compression algorihm list. Keep the alphabetical order for easy reporting if [ ${iaa_devices} -gt 0 ]; then - comp_list+=("deflate-iaa-canned" "deflate-iaa") + comp_list+=("deflate-iaa") fi comp_list+=("lz4") if [ ${QAT_ENABLED_IN_KERNEL} -gt 0 ]; then diff --git a/tests/madvise/enable_iaa.sh b/tests/madvise/enable_iaa.sh new file mode 100755 index 0000000..4293d47 --- /dev/null +++ b/tests/madvise/enable_iaa.sh @@ -0,0 +1,168 @@ +#!/usr/bin/env bash +#SPDX-License-Identifier: BSD-3-Clause +#Copyright (c) 2025, Intel Corporation +#Description: Configure IAA devices + +VERIFY_COMPRESS_PATH="/sys/bus/dsa/drivers/crypto/verify_compress" + +iax_dev_id="0cfe" +num_iaa=$(lspci -d:${iax_dev_id} | wc -l) +sockets=$(lscpu | grep Socket | awk '{print $2}') +echo "Found ${num_iaa} instances in ${sockets} sockets(s)" + +# The same number of devices will be configured in each socket, if there are more than one socket +# Normalize with respect to the number of sockets +device_num_per_socket=$(( num_iaa/sockets )) +num_iaa_per_socket=$(( num_iaa / sockets )) + +iaa_wqs=2 +verbose=0 +iaa_engines=8 +mode="dedicated" +wq_type="kernel" +iaa_crypto_mode="async" +verify_compress=0 + + +# Function to handle errors +handle_error() { + echo "Error: $1" + exit 1 +} + +# Process arguments + +while getopts "d:hm:q:vD" opt; do + case $opt in + d) + device_num_per_socket=$OPTARG + ;; + m) + iaa_crypto_mode=$OPTARG + ;; + q) + iaa_wqs=$OPTARG + ;; + D) + verbose=1 + ;; + v) + verify_compress=1 + ;; + h) + echo "Usage: $0 [-d ][-q ][-v]" + echo " -d - number of devices" + echo " -q - number of WQs per device" + echo " -v - verbose mode" + echo " -h - help" + exit + ;; + \?) + echo "Invalid option: -$OPTARG" >&2 + exit + ;; + esac +done + +LOG="configure_iaa.log" + +# Update wq_size based on number of wqs +wq_size=$(( 128 / iaa_wqs )) + +# Take care of the enumeration, if DSA is enabled. +dsa=`lspci | grep -c 0b25` +#set first,step counters to correctly enumerate iax devices based on whether running on guest or host with or without dsa +first=0 +step=1 +[[ $dsa -gt 0 && -d /sys/bus/dsa/devices/dsa0 ]] && first=1 && step=2 +echo "first index: ${first}, step: ${step}" + + +# +# Switch to software compressors and disable IAAs to have a clean start +# +COMPRESSOR=/sys/module/zswap/parameters/compressor +last_comp=`cat ${COMPRESSOR}` +echo lzo > ${COMPRESSOR} + +echo "Disable IAA devices before configuring" + +for ((i = ${first}; i < ${step} * ${num_iaa}; i += ${step})); do + for ((j = 0; j < ${iaa_wqs}; j += 1)); do + cmd="accel-config disable-wq iax${i}/wq${i}.${j} >& /dev/null" + [[ $verbose == 1 ]] && echo $cmd; eval $cmd + done + cmd="accel-config disable-device iax${i} >& /dev/null" + [[ $verbose == 1 ]] && echo $cmd; eval $cmd +done + +rmmod iaa_crypto +modprobe iaa_crypto + +# apply crypto parameters +echo $verify_compress > ${VERIFY_COMPRESS_PATH} || handle_error "did not change verify_compress" +# Note: This is a temporary solution for during the kernel transition. +if [ -f /sys/bus/dsa/drivers/crypto/g_comp_wqs_per_iaa ];then + echo 1 > /sys/bus/dsa/drivers/crypto/g_comp_wqs_per_iaa || handle_error "did not set g_comp_wqs_per_iaa" +elif [ -f /sys/bus/dsa/drivers/crypto/g_wqs_per_iaa ];then + echo 1 > /sys/bus/dsa/drivers/crypto/g_wqs_per_iaa || handle_error "did not set g_wqs_per_iaa" +fi +if [ -f /sys/bus/dsa/drivers/crypto/g_consec_descs_per_gwq ];then + echo 1 > /sys/bus/dsa/drivers/crypto/g_consec_descs_per_gwq || handle_error "did not set g_consec_descs_per_gwq" +fi +echo ${iaa_crypto_mode} > /sys/bus/dsa/drivers/crypto/sync_mode || handle_error "could not set sync_mode" + + + +echo "Configuring ${device_num_per_socket} device(s) out of $num_iaa_per_socket per socket" +if [ "${device_num_per_socket}" -le "${num_iaa_per_socket}" ]; then + echo "Configuring all devices" + start=${first} + end=$(( ${step} * ${device_num_per_socket} )) +else + echo "ERROR: Not enough devices" + exit +fi + + +# +# enable all iax devices and wqs +# +for (( socket = 0; socket < ${sockets}; socket += 1 )); do +for ((i = ${start}; i < ${end}; i += ${step})); do + + echo "Configuring iaa$i on socket ${socket}" + + for ((j = 0; j < ${iaa_engines}; j += 1)); do + cmd="accel-config config-engine iax${i}/engine${i}.${j} --group-id=0" + [[ $verbose == 1 ]] && echo $cmd; eval $cmd + done + + # Config WQs + for ((j = 0; j < ${iaa_wqs}; j += 1)); do + # Config WQ: group 0, priority=10, mode=shared, type = kernel name=kernel, driver_name=crypto + cmd="accel-config config-wq iax${i}/wq${i}.${j} -g 0 -s ${wq_size} -p 10 -m ${mode} -y ${wq_type} -n iaa_crypto${i}${j} -d crypto" + [[ $verbose == 1 ]] && echo $cmd; eval $cmd + done + + # Enable Device and WQs + cmd="accel-config enable-device iax${i}" + [[ $verbose == 1 ]] && echo $cmd; eval $cmd + + for ((j = 0; j < ${iaa_wqs}; j += 1)); do + cmd="accel-config enable-wq iax${i}/wq${i}.${j}" + [[ $verbose == 1 ]] && echo $cmd; eval $cmd + done + +done + start=$(( start + ${step} * ${num_iaa_per_socket} )) + end=$(( start + (${step} * ${device_num_per_socket}) )) +done + +# Restore the last compressor +echo "$last_comp" > ${COMPRESSOR} + +# Check if the configuration is correct +echo "Configured IAA devices:" +accel-config list | grep iax + diff --git a/tests/madvise/enable_kernel_iaa.sh b/tests/madvise/enable_kernel_iaa.sh index 5142e8e..7d60b81 100755 --- a/tests/madvise/enable_kernel_iaa.sh +++ b/tests/madvise/enable_kernel_iaa.sh @@ -71,8 +71,17 @@ echo $config_json # apply verify-compress echo $verify_compress > ${VERIFY_COMPRESS_PATH} || handle_error "did not change verify_compress" -echo 1 > /sys/bus/dsa/drivers/crypto/g_wqs_per_iaa || handle_error "did not set g_wqs_per_iaa" -echo 1 > /sys/bus/dsa/drivers/crypto/g_consec_descs_per_gwq || handle_error "did not set g_consec_descs_per_gwq" +# Note: This is a temporary solution for during the kernel transition. +if [ -f /sys/bus/dsa/drivers/crypto/g_comp_wqs_per_iaa ];then + echo 1 > /sys/bus/dsa/drivers/crypto/g_comp_wqs_per_iaa || handle_error "did not set g_comp_wqs_per_iaa" +elif [ -f /sys/bus/dsa/drivers/crypto/g_wqs_per_iaa ];then + echo 1 > /sys/bus/dsa/drivers/crypto/g_comp_wqs_per_iaa || handle_error "did not set g_wqs_per_iaa" +fi + +if [ -f /sys/bus/dsa/drivers/crypto/g_consec_descs_per_gwq ];then + echo 1 > /sys/bus/dsa/drivers/crypto/g_consec_descs_per_gwq || handle_error "did not set g_consec_descs_per_gwq" +fi + echo ${iaa_crypto_mode} > /sys/bus/dsa/drivers/crypto/sync_mode || handle_error "could not set sync_mode" #echo sync > /sys/bus/dsa/drivers/crypto/sync_mode || handle_error "could not set sync_mode" diff --git a/tests/madvise/madvise_test.c b/tests/madvise/madvise_test.c index 1801da3..e552d0e 100644 --- a/tests/madvise/madvise_test.c +++ b/tests/madvise/madvise_test.c @@ -33,7 +33,7 @@ long read_sysfs(char *path ){ FILE* fp = fopen(path, "r"); char buf[128]; if (!fp) { - perror("Couldn't open file"); + //perror("Couldn't open file"); return EXIT_FAILURE; } fgets(buf, sizeof(buf), fp); @@ -46,7 +46,7 @@ long read_sysfs_str(char *path , char *str, int size){ FILE* fp = fopen(path, "r"); if (!fp) { - perror("Couldn't open file"); + //perror("Couldn't open file"); return EXIT_FAILURE; } fgets(str, size, fp); @@ -123,6 +123,10 @@ int main(int argc, char **argv) // Replace the newline character with a null terminator compressor[newline_pos] = '\0'; int cbatch = read_sysfs("/proc/sys/vm/compress-batchsize"); + // NOTE: This is a temporary solution as we transition to the new kernel + if ( cbatch == EXIT_FAILURE ) { + cbatch = read_sysfs("/proc/sys/vm/reclaim-batchsize"); + } int dbatch = read_sysfs("/proc/sys/vm/page-cluster"); // Add compress and decompress batch setting sprintf(compressor, "%s-c%d-d%d", compressor, cbatch, dbatch);