--- /dev/null
+name: 'Create guest image'
+description: 'Create VM guest image on Ubuntu runner'
+
+inputs:
+ distro:
+ description: 'Linux distribution to use for guest image'
+ required: false
+ default: 'debian-12'
+ extra_pkgs:
+ description: 'Extra packages to install for guest image'
+ required: false
+ default:
+
+runs:
+ using: "composite"
+ steps:
+ - name: Install libguestfs
+ run: sudo apt-get -qq install libguestfs-tools
+ shell: bash
+ - name: Setup steps for virt-builder
+ run: |
+ sudo chmod a+r /boot/vmlinuz*
+ sudo chmod 0666 /dev/kvm
+ ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa
+ shell: bash
+ - name: Create Debian image
+ run: |
+ virt-builder ${{ inputs.distro }} \
+ --quiet \
+ --hostname fio-tester \
+ --ssh-inject root \
+ --run-command "ssh-keygen -A" \
+ --run-command "sed -i 's/ens2/enp0s2/g' /etc/network/interfaces" \
+ --append-line '/etc/environment:PYTHONUNBUFFERED=1' \
+ --append-line '/etc/environment:GITHUB_SERVER_URL=${{ github.server_url }}' \
+ --append-line '/etc/environment:GITHUB_REPOSITORY=${{ github.repository }}' \
+ --append-line '/etc/environment:GITHUB_REF=${{ github.ref }}' \
+ --append-line '/etc/environment:GITHUB_SHA=${{ github.sha }}' \
+ --append-line '/etc/environment:GITHUB_JOB=${{ github.job }}' \
+ --append-line '/etc/environment:EXTRA_PKGS=${{ inputs.extra_pkgs }}' \
+ --append-line '/etc/environment:CI_TARGET_BUILD=${{ env.CI_TARGET_BUILD }}' \
+ --append-line '/etc/environment:CI_TARGET_OS=${{ env.CI_TARGET_OS }}'
+
+ shell: bash
+
--- /dev/null
+name: 'Start QEMU VM'
+description: 'Start QEMU virtual machine'
+
+inputs:
+ qemu: # QEMU binary to use
+ required: false
+ default: "qemu-system-x86_64"
+ image: # VM image file
+ required: true
+ ssh_fwd_port: # forward this host port to the guest's SSH port
+ required: false
+ default: 2022
+ options: # Custom QEMU invocation options no \n at the end!
+ required: false
+ ram: # how much RAM to allocate to VM
+ required: false
+ default: "12G"
+ host_key: # If true add guest host key to known_hosts
+ required: false
+ default: "false"
+
+runs:
+ using: "composite"
+ steps:
+ - name: install wait-for-it
+ shell: bash
+ run: sudo apt-get -qq install wait-for-it
+ - name: Start VM in background
+ shell: bash
+ run: |
+ ${{ inputs.qemu }} \
+ -cpu host \
+ -drive file=${{ inputs.image }},format=raw,if=virtio \
+ -enable-kvm \
+ -smp $(nproc) \
+ -nographic \
+ -m ${{ inputs.ram }} \
+ -display none \
+ -machine q35,accel=kvm \
+ -nic user,model=virtio-net-pci,hostfwd=tcp::${{ inputs.ssh_fwd_port }}-:22 \
+ ${{ inputs.options }} \
+ &
+ - name: Wait for VM to boot
+ shell: bash
+ run: |
+ wait-for-it localhost:${{ inputs.ssh_fwd_port }} -t 15
+ sleep 3
+ - name: Add guest host key to known_hosts
+ shell: bash
+ run: |
+ if echo ${{ inputs.host_key }} | grep -c "true"
+ then
+ ssh root@localhost -p ${{ inputs.ssh_fwd_port }} -o StrictHostKeyChecking=no echo
+ fi
--- /dev/null
+name: CI
+
+on:
+ schedule:
+ - cron: "50 3 * * *" # daily at 4:50 UTC (00:50 EST)
+
+jobs:
+ qemu-guest:
+ runs-on: ubuntu-22.04
+
+ strategy:
+ fail-fast: false
+ matrix:
+ include:
+ - config: basic io_uring_cmd tests
+ device: >-
+ -device nvme,id=nvme0,serial=deadbeef
+ -drive id=nvm-0,file=nvme0.img,format=raw,if=none,discard=unmap,media=disk
+ -device nvme-ns,id=nvm-0,drive=nvm-0,bus=nvme0,nsid=1
+ test_cmd: "python3 t/run-fio-tests.py --nvmecdev /dev/ng0n1 --run-only 1014 1015"
+ extra_pkgs: "nvme-cli"
+ - config: 16-bit Guard PI tests (long)
+ device: >-
+ -device nvme,id=nvme0,serial=deadbeef
+ -drive id=nvm-0,file=nvme0.img,format=raw,if=none,discard=unmap,media=disk
+ -device nvme-ns,id=nvm-0,drive=nvm-0,bus=nvme0,nsid=1
+ test_cmd: "python3 t/nvmept_pi.py --fio ./fio --dut /dev/ng0n1"
+ extra_pkgs: "nvme-cli"
+ - config: 4K+16 w/64-bit Guard PI
+ device: >- # 4K+16 w/64-bit Guard PI
+ -device nvme,id=nvme1,serial=deadbeee
+ -drive id=nvm-1,file=nvme0.img,format=raw,if=none,discard=unmap,media=disk
+ -device nvme-ns,id=nvm-1,drive=nvm-1,bus=nvme1,nsid=1,pif=2,ms=16,mset=1,pi=1,pil=0,logical_block_size=4096,physical_block_size=4096
+ test_cmd: "python3 t/nvmept_pi.py --fio ./fio --dut /dev/ng0n1 --lbaf 6"
+ extra_pkgs: "nvme-cli"
+ - config: 4K+64 w/64-bit Guard PI
+ device: >-
+ -device nvme,id=nvme2,serial=deadeeef
+ -drive id=nvm-2,file=nvme0.img,format=raw,if=none,discard=unmap,media=disk
+ -device nvme-ns,id=nvm-2,drive=nvm-2,bus=nvme2,nsid=1,pif=2,ms=64,mset=1,pi=1,pil=0,logical_block_size=4096,physical_block_size=4096
+ test_cmd: "python3 t/nvmept_pi.py --fio ./fio --dut /dev/ng0n1 --lbaf 7"
+ extra_pkgs: "nvme-cli"
+ - config: FDP
+ device: >-
+ -device nvme-subsys,id=nvme-subsys0,fdp=on,fdp.runs=128K,fdp.nrg=8,fdp.nruh=64
+ -device nvme,id=nvme0,serial=deadbeef,subsys=nvme-subsys0
+ -drive id=nvm-1,file=nvme0.img,format=raw,if=none,discard=unmap,media=disk
+ -device nvme-ns,id=nvm-1,drive=nvm-1,bus=nvme0,nsid=1,logical_block_size=4096,physical_block_size=4096,fdp.ruhs=0-63
+ test_cmd: "nvme fdp status /dev/ng0n1 && python3 t/nvmept_fdp.py --fio ./fio --dut /dev/ng0n1"
+ extra_pkgs: "nvme-cli"
+ - config: ZBD
+ device:
+ test_cmd: "./t/zbd/run-tests-against-nullb"
+ extra_pkgs: sg3-utils
+
+ env:
+ DISTRO: debian-12
+ SSHCMD: ssh root@localhost -p 2022
+ CI_TARGET_BUILD: linux
+ CI_TARGET_OS: debian
+
+ steps:
+ - name: Check out repository
+ uses: actions/checkout@v4
+
+ - name: Create guest VM image
+ uses: ./.github/actions/create-guest-image
+ with:
+ distro: ${{ env.DISTRO }}
+ extra_pkgs: ${{ matrix.extra_pkgs }}
+
+ - name: Build and install QEMU
+ uses: ./.github/actions/build-qemu
+
+ - name: Create backing file for NVMe device
+ run: truncate -s 1G nvme0.img
+
+ - name: Start VM
+ uses: ./.github/actions/start-vm
+ with:
+ image: ${{ env.DISTRO }}.img
+ host_key: true
+ options: ${{ matrix.device }}
+
+ - name: Clone fio on guest
+ run: |
+ $SSHCMD "apt-get update && apt-get install -qq git"
+ $SSHCMD "git clone https://github.com/taiki-e/checkout-action --branch v1.3.0"
+ $SSHCMD "mkdir fio && cd fio && ../checkout-action/main.sh && git log -1"
+
+ - name: Install dependencies on guest
+ run: $SSHCMD "cd fio && ./ci/actions-install.sh"
+
+ - name: Build fio on guest
+ run: $SSHCMD "cd fio && ./ci/actions-build.sh"
+
+ - name: Show nvme device configuration
+ if: ${{ contains( matrix.extra_pkgs, 'nvme-cli' ) }}
+ run: |
+ $SSHCMD "nvme id-ns /dev/ng0n1 -H"
+ $SSHCMD "nvme nvm-id-ns /dev/ng0n1 -v"
+
+ - name: Run test
+ run: $SSHCMD "cd fio && ${{ matrix.test_cmd }}"