From: Nico Boehr <nrb@linux.ibm.com>
To: kvm@vger.kernel.org, linux-s390@vger.kernel.org
Cc: frankja@linux.ibm.com, imbrenda@linux.ibm.com, thuth@redhat.com
Subject: [kvm-unit-tests PATCH v1 1/3] runtime: add support for panic tests
Date: Thu, 30 Jun 2022 13:30:57 +0200 [thread overview]
Message-ID: <20220630113059.229221-2-nrb@linux.ibm.com> (raw)
In-Reply-To: <20220630113059.229221-1-nrb@linux.ibm.com>
QEMU suports a guest state "guest-panicked" which indicates something in
the guest went wrong, for example on s390x, when an external interrupt
loop was triggered.
Since the guest does not continue to run when it is in the
guest-panicked state, it is currently impossible to write panicking
tests in kvm-unit-tests. Support from the runtime is needed to check
that the guest enters the guest-panicked state.
Similar to migration tests, add a new group panic. Tests in this
group must enter the guest-panicked state to succeed.
The runtime will spawn a QEMU instance, connect to the QMP and listen
for events. To parse the QMP protocol, jq[1] is used. Same as with
netcat in the migration tests, panic tests won't run if jq is not
installed.
The guest is created in the stopped state and only continued when
connection to the QMP was successful. This ensures no events are missed
between QEMU start and the connect to the QMP.
[1] https://stedolan.github.io/jq/
Signed-off-by: Nico Boehr <nrb@linux.ibm.com>
---
s390x/run | 2 +-
scripts/arch-run.bash | 47 +++++++++++++++++++++++++++++++++++++++++++
scripts/runtime.bash | 3 +++
3 files changed, 51 insertions(+), 1 deletion(-)
diff --git a/s390x/run b/s390x/run
index 24138f6803be..f1111dbdbe62 100755
--- a/s390x/run
+++ b/s390x/run
@@ -30,7 +30,7 @@ M+=",accel=$ACCEL"
command="$qemu -nodefaults -nographic $M"
command+=" -chardev stdio,id=con0 -device sclpconsole,chardev=con0"
command+=" -kernel"
-command="$(migration_cmd) $(timeout_cmd) $command"
+command="$(panic_cmd) $(migration_cmd) $(timeout_cmd) $command"
# We return the exit code via stdout, not via the QEMU return code
run_qemu_status $command "$@"
diff --git a/scripts/arch-run.bash b/scripts/arch-run.bash
index 0dfaf017db0a..5663a1ddb09e 100644
--- a/scripts/arch-run.bash
+++ b/scripts/arch-run.bash
@@ -104,6 +104,12 @@ qmp ()
echo '{ "execute": "qmp_capabilities" }{ "execute":' "$2" '}' | ncat -U $1
}
+qmp_events ()
+{
+ while ! test -S "$1"; do sleep 0.1; done
+ echo '{ "execute": "qmp_capabilities" }{ "execute": "cont" }' | ncat --no-shutdown -U $1 | jq -c 'select(has("event"))'
+}
+
run_migration ()
{
if ! command -v ncat >/dev/null 2>&1; then
@@ -164,6 +170,40 @@ run_migration ()
return $ret
}
+run_panic ()
+{
+ if ! command -v ncat >/dev/null 2>&1; then
+ echo "${FUNCNAME[0]} needs ncat (netcat)" >&2
+ return 77
+ fi
+
+ if ! command -v jq >/dev/null 2>&1; then
+ echo "${FUNCNAME[0]} needs jq" >&2
+ return 77
+ fi
+
+ qmp=$(mktemp -u -t panic-qmp.XXXXXXXXXX)
+
+ trap 'kill 0; exit 2' INT TERM
+ trap 'rm -f ${qmp}' RETURN EXIT
+
+ # start VM stopped so we don't miss any events
+ eval "$@" -chardev socket,id=mon1,path=${qmp},server=on,wait=off \
+ -mon chardev=mon1,mode=control -S &
+
+ panic_event_count=$(qmp_events ${qmp} | jq -c 'select(.event == "GUEST_PANICKED")' | wc -l)
+ if [ $panic_event_count -lt 1 ]; then
+ echo "FAIL: guest did not panic"
+ ret=3
+ else
+ # some QEMU versions report multiple panic events
+ echo "PASS: guest panicked"
+ ret=1
+ fi
+
+ return $ret
+}
+
migration_cmd ()
{
if [ "$MIGRATION" = "yes" ]; then
@@ -171,6 +211,13 @@ migration_cmd ()
fi
}
+panic_cmd ()
+{
+ if [ "$PANIC" = "yes" ]; then
+ echo "run_panic"
+ fi
+}
+
search_qemu_binary ()
{
local save_path=$PATH
diff --git a/scripts/runtime.bash b/scripts/runtime.bash
index 7d0180bf14bd..8072f3bb536a 100644
--- a/scripts/runtime.bash
+++ b/scripts/runtime.bash
@@ -145,6 +145,9 @@ function run()
if find_word "migration" "$groups"; then
cmdline="MIGRATION=yes $cmdline"
fi
+ if find_word "panic" "$groups"; then
+ cmdline="PANIC=yes $cmdline"
+ fi
if [ "$verbose" = "yes" ]; then
echo $cmdline
fi
--
2.36.1
next prev parent reply other threads:[~2022-06-30 11:31 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-06-30 11:30 [kvm-unit-tests PATCH v1 0/3] Add panic test support Nico Boehr
2022-06-30 11:30 ` Nico Boehr [this message]
2022-06-30 17:49 ` [kvm-unit-tests PATCH v1 1/3] runtime: add support for panic tests Thomas Huth
2022-07-01 7:02 ` Nico Boehr
2022-06-30 11:30 ` [kvm-unit-tests PATCH v1 2/3] s390x: add extint loop test Nico Boehr
2022-06-30 17:55 ` Thomas Huth
2022-07-04 8:32 ` Janosch Frank
2022-06-30 11:30 ` [kvm-unit-tests PATCH v1 3/3] s390x: add pgm spec interrupt " Nico Boehr
2022-06-30 14:38 ` Janis Schoetterl-Glausch
2022-06-30 17:11 ` Thomas Huth
2022-07-01 10:49 ` Janis Schoetterl-Glausch
2022-07-01 8:10 ` Nico Boehr
2022-06-30 17:25 ` Thomas Huth
2022-07-01 8:17 ` Nico Boehr
2022-07-04 9:06 ` Janosch Frank
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220630113059.229221-2-nrb@linux.ibm.com \
--to=nrb@linux.ibm.com \
--cc=frankja@linux.ibm.com \
--cc=imbrenda@linux.ibm.com \
--cc=kvm@vger.kernel.org \
--cc=linux-s390@vger.kernel.org \
--cc=thuth@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox