lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<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

Powered by Openwall GNU/*/Linux Powered by OpenVZ