1import ./make-test-python.nix (
2 {
3 pkgs,
4 ...
5 }:
6 let
7 qemu-img = pkgs.lib.getExe' pkgs.vmTools.qemu "qemu-img";
8 empty = pkgs.runCommand "empty.qcow2" { } ''
9 ${qemu-img} create -f qcow2 "$out" 32M
10 '';
11 in
12 {
13 name = "iosched";
14 meta.maintainers = with pkgs.lib.maintainers; [ mvs ];
15
16 nodes.machine = {
17 virtualisation.qemu.options = [
18 "-drive"
19 "id=sda,if=none,format=qcow2,readonly=on,file=${empty}"
20 "-drive"
21 "id=sdb,if=none,format=qcow2,readonly=on,file=${empty}"
22 "-drive"
23 "id=nvme0n1,if=none,format=qcow2,readonly=on,file=${empty}"
24 "-drive"
25 "id=mmcblk0,if=none,format=qcow2,file=./mmcblk0.qcow2"
26 "-device"
27 "virtio-scsi-pci,id=scsi0"
28 "-device"
29 "sdhci-pci"
30 "-device"
31 "scsi-hd,rotation_rate=1,bus=scsi0.0,drive=sda"
32 "-device"
33 "scsi-hd,rotation_rate=7200,bus=scsi0.0,drive=sdb"
34 "-device"
35 "sd-card,drive=mmcblk0"
36 "-device"
37 "nvme,serial=deadbeef,drive=nvme0n1"
38 ];
39
40 hardware.block = {
41 defaultScheduler = "none";
42 defaultSchedulerRotational = "mq-deadline";
43 scheduler = {
44 "nvme[0-9]*" = "kyber";
45 "mmcblk[0-9]*" = "bfq";
46 };
47 };
48 };
49
50 testScript = ''
51 import subprocess
52
53 def check_scheduler(dev, scheduler):
54 machine.succeed("grep -F -q '[{}]' /sys/block/{}/queue/scheduler".format(scheduler, dev))
55
56 subprocess.check_call([
57 "${qemu-img}", "create", "-f", "qcow2", "vm-state-machine/mmcblk0.qcow2", "32M"
58 ])
59
60 machine.start()
61 machine.succeed("udevadm verify --no-style")
62 check_scheduler("sda", "none")
63 check_scheduler("sdb", "mq-deadline")
64 check_scheduler("nvme0n1", "kyber")
65 check_scheduler("mmcblk0", "bfq")
66
67 machine.succeed("tmp=\"$(mktemp)\"; losetup /dev/loop0 \"$tmp\"")
68 check_scheduler("loop0", "none")
69 '';
70 }
71)