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