[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <CAP-5=fWrbHu75NZcYn7NETDb057uZA6NGpOFADMWNgHRyxfCsA@mail.gmail.com>
Date: Fri, 28 Nov 2025 01:06:22 -0800
From: Ian Rogers <irogers@...gle.com>
To: Namhyung Kim <namhyung@...nel.org>
Cc: Peter Zijlstra <peterz@...radead.org>, Ingo Molnar <mingo@...hat.com>,
Arnaldo Carvalho de Melo <acme@...nel.org>, Alexander Shishkin <alexander.shishkin@...ux.intel.com>,
Jiri Olsa <jolsa@...nel.org>, Adrian Hunter <adrian.hunter@...el.com>,
James Clark <james.clark@...aro.org>, Collin Funk <collin.funk1@...il.com>,
Dmitry Vyukov <dvyukov@...gle.com>, Andi Kleen <ak@...ux.intel.com>,
Thomas Falcon <thomas.falcon@...el.com>, Leo Yan <leo.yan@....com>,
Yicong Yang <yangyicong@...ilicon.com>, Greg Kroah-Hartman <gregkh@...uxfoundation.org>,
"Masami Hiramatsu (Google)" <mhiramat@...nel.org>, Stephen Brennan <stephen.s.brennan@...cle.com>,
Haibo Xu <haibo1.xu@...el.com>, linux-kernel@...r.kernel.org,
linux-perf-users@...r.kernel.org
Subject: Re: [PATCH v1 17/17] perf test kvm: Add some basic perf kvm test coverage
On Thu, Nov 27, 2025 at 12:55 PM Namhyung Kim <namhyung@...nel.org> wrote:
>
> On Thu, Nov 27, 2025 at 03:53:13AM -0800, Ian Rogers wrote:
> > On Tue, Nov 25, 2025 at 11:21 PM Namhyung Kim <namhyung@...nel.org> wrote:
> > >
> > > On Sat, Nov 22, 2025 at 12:19:29AM -0800, Ian Rogers wrote:
> > > > Setup qemu with KVM then run kvm stat and some host
> > > > recording/reporting/build-id tests.
> > > >
> > > > Signed-off-by: Ian Rogers <irogers@...gle.com>
> > > > ---
> > > > tools/perf/tests/shell/kvm.sh | 154 ++++++++++++++++++++++++++++++++++
> > > > 1 file changed, 154 insertions(+)
> > > > create mode 100755 tools/perf/tests/shell/kvm.sh
> > > >
> > > > diff --git a/tools/perf/tests/shell/kvm.sh b/tools/perf/tests/shell/kvm.sh
> > > > new file mode 100755
> > > > index 000000000000..2fafde1a29cc
> > > > --- /dev/null
> > > > +++ b/tools/perf/tests/shell/kvm.sh
> > > > @@ -0,0 +1,154 @@
> > > > +#!/bin/bash
> > > > +# perf kvm tests
> > > > +# SPDX-License-Identifier: GPL-2.0
> > > > +
> > > > +set -e
> > > > +
> > > > +err=0
> > > > +perfdata=$(mktemp /tmp/__perf_kvm_test.perf.data.XXXXX)
> > > > +qemu_pid_file=$(mktemp /tmp/__perf_kvm_test.qemu.pid.XXXXX)
> > > > +
> > > > +cleanup() {
> > > > + rm -f "${perfdata}"
> > > > + if [ -f "${qemu_pid_file}" ]; then
> > > > + if [ -s "${qemu_pid_file}" ]; then
> > > > + qemu_pid=$(cat "${qemu_pid_file}")
> > > > + if [ -n "${qemu_pid}" ]; then
> > > > + kill "${qemu_pid}" 2>/dev/null || true
> > > > + fi
> > > > + fi
> > > > + rm -f "${qemu_pid_file}"
> > > > + fi
> > > > + trap - EXIT TERM INT
> > > > +}
> > > > +
> > > > +trap_cleanup() {
> > > > + echo "Unexpected signal in ${FUNCNAME[1]}"
> > > > + cleanup
> > > > + exit 1
> > > > +}
> > > > +trap trap_cleanup EXIT TERM INT
> > > > +
> > > > +skip() {
> > > > + echo "Skip: $1"
> > > > + cleanup
> > > > + exit 2
> > > > +}
> > > > +
> > > > +test_kvm_stat() {
> > > > + echo "Testing perf kvm stat"
> > > > +
> > > > + echo "Recording kvm events for pid ${qemu_pid}..."
> > > > + if ! perf kvm stat record -p "${qemu_pid}" -o "${perfdata}" sleep 1; then
> > > > + echo "Failed to record kvm events"
> > > > + err=1
> > > > + return
> > > > + fi
> > > > +
> > > > + echo "Reporting kvm events..."
> > > > + if ! perf kvm -i "${perfdata}" stat report 2>&1 | grep -q "VM-EXIT"; then
> > > > + echo "Failed to find VM-EXIT in report"
> > > > + perf kvm -i "${perfdata}" stat report 2>&1
> > > > + err=1
> > > > + return
> > > > + fi
> > > > +
> > > > + echo "perf kvm stat test [Success]"
> > > > +}
> > > > +
> > > > +test_kvm_record_report() {
> > > > + echo "Testing perf kvm record/report"
> > > > +
> > > > + echo "Recording kvm profile for pid ${qemu_pid}..."
> > > > + # Use --host to avoid needing guest symbols/mounts for this simple test
> > > > + # We just want to verify the command runs and produces data
> > > > + # We run in background and kill it because 'perf kvm record' appends options
> > > > + # after the command, which breaks 'sleep' (e.g. it gets '-e cycles').
> > > > + perf kvm --host record -p "${qemu_pid}" -o "${perfdata}" &
> > > > + rec_pid=$!
> > > > + sleep 1
> > > > + kill -INT "${rec_pid}"
> > > > + wait "${rec_pid}" || true
> > > > +
> > > > + echo "Reporting kvm profile..."
> > > > + # Check for some standard output from report
> > > > + if ! perf kvm -i "${perfdata}" report --stdio 2>&1 | grep -q "Event count"; then
> > > > + echo "Failed to report kvm profile"
> > > > + perf kvm -i "${perfdata}" report --stdio 2>&1
> > > > + err=1
> > > > + return
> > > > + fi
> > > > +
> > > > + echo "perf kvm record/report test [Success]"
> > > > +}
> > > > +
> > > > +test_kvm_buildid_list() {
> > > > + echo "Testing perf kvm buildid-list"
> > > > +
> > > > + # We reuse the perf.data from the previous record test
> > > > + if ! perf kvm --host -i "${perfdata}" buildid-list 2>&1 | grep -q "."; then
> > > > + echo "Failed to list buildids"
> > > > + perf kvm --host -i "${perfdata}" buildid-list 2>&1
> > > > + err=1
> > > > + return
> > > > + fi
> > > > +
> > > > + echo "perf kvm buildid-list test [Success]"
> > > > +}
> > > > +
> > > > +setup_qemu() {
> > > > + # Find qemu
> > > > + if [ "$(uname -m)" = "x86_64" ]; then
> > > > + qemu="qemu-system-x86_64"
> > > > + elif [ "$(uname -m)" = "aarch64" ]; then
> > > > + qemu="qemu-system-aarch64"
> > > > + elif [ "$(uname -m)" = "s390x" ]; then
> > > > + qemu="qemu-system-s390x"
> > > > + elif [ "$(uname -m)" = "ppc64le" ]; then
> > > > + qemu="qemu-system-ppc64"
> > > > + else
> > > > + qemu="qemu-system-$(uname -m)"
> > > > + fi
> > > > +
> > > > + if ! which -s "$qemu"; then
> > > > + skip "$qemu not found"
> > > > + fi
> > > > +
> > > > + if [ ! -r /dev/kvm ] || [ ! -w /dev/kvm ]; then
> > > > + skip "/dev/kvm not accessible"
> > > > + fi
> > > > +
> > > > + if ! perf kvm stat record -a sleep 0.01 >/dev/null 2>&1; then
> > > > + skip "No permission to record kvm events"
> > > > + fi
> > > > +
> > > > + echo "Starting $qemu..."
> > > > + # Start qemu in background, detached, with pidfile
> > > > + # We use -display none -daemonize and a monitor to keep it alive/controllable if needed
> > > > + # We don't need a real kernel, just KVM active.
> > > > + if ! $qemu -enable-kvm -display none -daemonize -pidfile "${qemu_pid_file}" -monitor none; then
> > >
> > > What is running in the guest?
> >
> > Nothing. As no kernel or storage image were provided the guest should
> > be waiting at the bios similar to if you booted a PC with no storage
> > in it. I just wanted something quick and dirty to give the basic perf
> > kvm command a simple work out for the sake of testing coverage.
>
> Ok, it'd be fine as long as perf can get some samples in the guest.
I hope we always get a sample in the guest, but I don't think it is a
given as qemu is running in the background, etc. Even without guest
samples the code is getting coverage in the perf tool we don't get by
other means, for example, finding the broken BUG_ON.
Thanks,
Ian
> Thanks,
> Namhyung
>
Powered by blists - more mailing lists