shell script for testing managed interrupts status adjustments. Targets: managed_irq_affinity_adjust(), irq_restore_affinity_of_irq(), managed_irq_isolate() Managed interrupts can be created in various ways. One of them: qemu-img create -f qcow2 test.qcow2 100M virtme-ng -v --cpus 4 --rw --user root \ --qemu-opts '\-drive id=d1,if=none,file=test.qcow2 \ \-device nvme,id=i1,drive=d1,serial=1,bootindex=2' Signed-off-by: Costa Shulyupin <costa.shul@xxxxxxxxxx> --- Changes in v2: - use shell script only v1: - https://lore.kernel.org/lkml/20240516190437.3545310-8-costa.shul@xxxxxxxxxx/ --- tests/managed_irq.sh | 116 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100755 tests/managed_irq.sh diff --git a/tests/managed_irq.sh b/tests/managed_irq.sh new file mode 100755 index 000000000000..14bc2f4b13c5 --- /dev/null +++ b/tests/managed_irq.sh @@ -0,0 +1,116 @@ +#!/bin/zsh + +# shell script for testing IRQ status adjustment. +# Targets: managed_irq_affinity_adjust(), +# irq_restore_affinity_of_irq(), managed_irq_isolate() + +# cpu# to isolate +# +isolate=1 + +managed_affined=$( + cd /sys/kernel/debug/irq/irqs/; + grep -l -e "affinity: $isolate$" /dev/null $(grep -l IRQD_AFFINITY_MANAGED *) | + head -n1 +) +test_irq=${managed_affined%% *} + +[ -z $test_irq ] && { echo No managed IRQs found;exit 1} + +rm -rf 0.irqs +cp -R /sys/kernel/debug/irq/irqs 0.irqs + +cd /sys/fs/cgroup/ +echo +cpuset > cgroup.subtree_control +mkdir -p test +echo isolated > test/cpuset.cpus.partition + +effective_affinity=/proc/irq/$test_irq/effective_affinity +test_irq_debug=/sys/kernel/debug/irq/irqs/$test_irq + +errors=0 + +check() +{ + local _status=$? + if [[ $_status == 0 ]] + then + echo PASS + else + let errors+=1 + echo FAIL: + cat $test_irq_debug + fi + return $_status +} + +check_activated() +{ + echo "Check normal irq affinity" + test 0 -ne $((0x$(cat $effective_affinity) & 1 << $isolate)) + check + grep -q IRQD_ACTIVATED $test_irq_debug + check + grep -q IRQD_IRQ_STARTED $test_irq_debug + check + ! grep -q IRQD_IRQ_DISABLED $test_irq_debug + check + ! grep -q IRQD_IRQ_MASKED $test_irq_debug + check + ! grep -q IRQD_MANAGED_SHUTDOWN $test_irq_debug + check +} + +check_shutdown() +{ + echo "Check that irq affinity doesn't contain isolated cpu." + test 0 -eq $((0x$(cat $effective_affinity) & 1 << $isolate)) + check + ! grep -q IRQD_ACTIVATED $test_irq_debug + check + ! grep -q IRQD_IRQ_STARTED $test_irq_debug + check + grep -q IRQD_IRQ_DISABLED $test_irq_debug + check + grep -q IRQD_IRQ_MASKED $test_irq_debug + check + grep -q IRQD_MANAGED_SHUTDOWN $test_irq_debug + check +} + +echo "Isolating CPU #$isolate" +echo $isolate > test/cpuset.cpus + +check_shutdown + +echo Reset cpuset +echo "" > test/cpuset.cpus + +check_activated + +echo "Isolating CPU #$isolate again" +echo $isolate > test/cpuset.cpus + +check_shutdown() + +echo "Isolating CPU #3 and restore CPU #$isolate" +echo 3 > test/cpuset.cpus + +check_activated + +echo Reset cpuset +echo "" > test/cpuset.cpus + +rmdir test +cd - + +rm -rf final.irqs +cp -R /sys/kernel/debug/irq/irqs final.irqs + +if ! diff -r --ignore-matching-lines=Vector: 0.irqs final.irqs; then + echo diff failed; + let errors+=1 +fi + +echo errors=$errors +(return $errors) -- 2.47.0