github.com/kata-containers/tests@v0.0.0-20240307153542-772105b56064/integration/qat/qat_test.sh (about)

     1  #!/bin/bash
     2  #
     3  # Copyright (c) 2021 Intel Corporation
     4  #
     5  # SPDX-License-Identifier: Apache-2.0
     6  #
     7  # WARNING: This script only support IntelĀ® QAT c6xx devices
     8  #
     9  
    10  set -x
    11  set -o errexit
    12  set -o nounset
    13  set -o pipefail
    14  set -o errtrace
    15  
    16  dir_path=$(dirname "$0")
    17  source "${dir_path}/../../lib/common.bash"
    18  source "${dir_path}/../../.ci/lib.sh"
    19  source /etc/os-release || source /usr/lib/os-release
    20  arch=$("${dir_path}"/../../.ci/kata-arch.sh -d)
    21  CI_JOB="${CI_JOB:-}"
    22  
    23  QAT_DRIVER_VER=QAT.L.4.15.0-00011.tar.gz
    24  QAT_DRIVER_URL=https://downloadmirror.intel.com/649693/${QAT_DRIVER_VER}
    25  # List of QAT device IDs
    26  QAT_VENDOR_AND_ID_VF=
    27  QAT_DEVICE_ID=37c8
    28  QAT_VENDOR_ID=8086
    29  QAT_DEV_ADDR=
    30  SSL_IMAGE_TAG=openssl-qat-engine
    31  CTR_RUNTIME="${CTR_RUNTIME:-io.containerd.kata.v2}"
    32  
    33  if [ "${arch}" == "aarch64" ] || [ "${arch}" == "s390x" ] || [ "${arch}" == "ppc64le" ]; then
    34  	echo "Skip QAT test: $arch doesn't support QAT"
    35  	exit 0
    36  fi
    37  
    38  if [ "${ID}" != "ubuntu" ]; then
    39  	echo "Skip QAT test: ${ID} distro is not supported"
    40  	exit 0
    41  fi
    42  
    43  init() {
    44  	local qat_devices=$(lspci -d ${QAT_VENDOR_ID}:${QAT_DEVICE_ID})
    45  	[ -n "${qat_devices}" ] || die "This system doesn't have any QAT device"
    46  	sudo modprobe vfio
    47  	sudo modprobe vfio-pci
    48  }
    49  
    50  build_install_qat_image_and_kernel() {
    51  	local osbuilder_dir="${GOPATH}/src/github.com/kata-containers/kata-containers/tools/osbuilder/dockerfiles/QAT"
    52  	local kata_vmlinux_path="/opt/kata/share/kata-containers/vmlinux.container"
    53  	local config_file="/opt/kata/share/defaults/kata-containers/configuration.toml"
    54  	local kata_image_path="/opt/kata/share/kata-containers/kata-containers.img"
    55  
    56  	pushd "${osbuilder_dir}"
    57  	sudo rm -rf output && mkdir -p output
    58  	sudo docker rmi -f kataqat
    59  	sudo docker build --rm --label kataqat --tag kataqat:latest .
    60  	sudo docker run -i --rm --privileged \
    61  		 -e "QAT_DRIVER_VER=${QAT_DRIVER_VER}" -e "QAT_DRIVER_URL=${QAT_DRIVER_URL}" \
    62  		 -v /dev:/dev -v ${PWD}/output:/output -v ${GOPATH}:/home/qatbuilder/src/go kataqat
    63  
    64  	sudo rm -f ${kata_vmlinux_path} ${kata_image_path}
    65  
    66  	sudo cp -a output/vmlinux-* ${kata_vmlinux_path}
    67  	sudo cp -a output/kata-containers.img ${kata_image_path}
    68  
    69  	sudo sed -i -e 's/^kernel_params = "\(.*\)"/kernel_params = "\1 modules-load=usdm_drv,qat_c62xvf"/g' ${config_file}
    70  	popd
    71  }
    72  
    73  build_openssl_image() {
    74  	local openssl_tar="openssl-qat-engine.tar"
    75  	local docker_openssl_img="docker.io/library/${SSL_IMAGE_TAG}:latest"
    76  	pushd ${dir_path}
    77  	curl -LOk https://raw.githubusercontent.com/intel/intel-device-plugins-for-kubernetes/main/demo/openssl-qat-engine/Dockerfile
    78  	sudo docker build --rm -t ${SSL_IMAGE_TAG} .
    79  	sudo docker save -o ${openssl_tar} ${SSL_IMAGE_TAG}:latest
    80  	sudo ctr i rm ${docker_openssl_img} || true
    81  	sudo ctr images import ${openssl_tar}
    82  	sudo rm -f ${openssl_tar}
    83  	popd
    84  }
    85  
    86  bind_vfio_dev() {
    87  	QAT_DEV_ADDR="0000:$(lspci -n -d ${QAT_VENDOR_ID}:${QAT_DEVICE_ID} | cut -d' ' -f1 | head -1)"
    88  	echo 16 | sudo tee -a /sys/bus/pci/devices/${QAT_DEV_ADDR}/sriov_numvfs
    89  	local qat_pci_id_vf=$(cat /sys/bus/pci/devices/${QAT_DEV_ADDR}/virtfn0/uevent | grep PCI_ID)
    90  	QAT_VENDOR_AND_ID_VF=$(echo ${qat_pci_id_vf/PCI_ID=} | sed 's/:/ /')
    91  
    92  	echo ${QAT_VENDOR_AND_ID_VF} | sudo tee -a /sys/bus/pci/drivers/vfio-pci/new_id
    93  	for f in /sys/bus/pci/devices/${QAT_DEV_ADDR}/virtfn*;	do
    94  		local qat_pci_bus_vf=$(basename $(readlink $f))
    95  		echo ${qat_pci_bus_vf} | sudo tee -a /sys/bus/pci/drivers/c6xxvf/unbind
    96  		echo ${qat_pci_bus_vf} | sudo tee -a /sys/bus/pci/drivers/vfio-pci/bind
    97  	done
    98  }
    99  
   100  unbind_pci_device() {
   101  	for f in /sys/bus/pci/devices/${QAT_DEV_ADDR}/virtfn*;  do
   102  		local qat_pci_bus_vf=$(basename $(readlink $f))
   103  		echo ${qat_pci_bus_vf} | sudo tee -a /sys/bus/pci/drivers/vfio-pci/unbind
   104  		echo ${qat_pci_bus_vf} | sudo tee -a /sys/bus/pci/drivers/c6xxvf/bind
   105  	done
   106  	echo ${QAT_VENDOR_AND_ID_VF} | sudo tee -a /sys/bus/pci/drivers/vfio-pci/remove_id
   107  }
   108  
   109  cleanup() {
   110  	[ -z "${QAT_DEV_ADDR}" ] || unbind_pci_device
   111  	clean_env_ctr
   112  }
   113  
   114  run_test() {
   115  	local docker_ssl_img="docker.io/library/openssl-qat-engine:latest"
   116  	local vfio_dev=$(ls /dev/vfio/ | head -1)
   117  	local qat_conf_dir="${GOPATH}/src/github.com/kata-containers/kata-containers/tools/osbuilder/dockerfiles/QAT/output/configs"
   118  	local config_file="/opt/kata/share/defaults/kata-containers/configuration.toml"
   119  
   120  	sudo sed -i -e 's/^kernel_params =.*/kernel_params = "modules-load=usdm_drv,qat_c62xvf"/g' ${config_file}
   121  
   122  	sudo ctr run --runtime ${CTR_RUNTIME} --privileged -d --rm --device=/dev/vfio/${vfio_dev} \
   123  		 --mount type=bind,src=/dev,dst=/dev,options=rbind:rw \
   124  		 --mount type=bind,src=${qat_conf_dir}/c6xxvf_dev0.conf,dst=/etc/c6xxvf_dev0.conf,options=rbind:rw \
   125  		 ${docker_ssl_img} qat sh -c "tail -f /dev/null"
   126  
   127  	sudo ctr t exec --exec-id 2 qat cat /proc/modules | grep intel_qat
   128  	sudo ctr t exec --exec-id 2 qat adf_ctl restart 2>/dev/null || true
   129  	sudo ctr t exec --exec-id 2 qat adf_ctl status | grep "qat_dev0" | grep "c6xxvf" | grep "state: up"
   130  	local ssl_output=$(sudo ctr t exec --exec-id 2 qat openssl engine -c -t qat-hw)
   131  	echo "${ssl_output}" | grep "qat-hw"
   132  	echo "${ssl_output}" | grep "\[ available \]"
   133  	sudo sed -i -e 's/^kernel_params =.*/kernel_params = ""/g' ${config_file}
   134  }
   135  
   136  main() {
   137  	[[ $CI_JOB != "BAREMETAL-QAT" ]] || trap cleanup EXIT QUIT KILL
   138  	[[ $CI_JOB != "BAREMETAL-QAT" ]] || init
   139  	build_install_qat_image_and_kernel
   140  	build_openssl_image
   141  	[[ $CI_JOB != "BAREMETAL-QAT" ]] || bind_vfio_dev
   142  	[[ $CI_JOB != "BAREMETAL-QAT" ]] || run_test
   143  }
   144  
   145  main