Hello community, here is the log from the commit of package kvm for openSUSE:Factory checked in at 2013-06-15 08:24:58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/kvm (Old) and /work/SRC/openSUSE:Factory/.kvm.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "kvm" Changes: -------- --- /work/SRC/openSUSE:Factory/kvm/kvm.changes 2013-04-26 13:25:46.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.kvm.new/kvm.changes 2013-06-15 08:25:00.000000000 +0200 @@ -1,0 +2,12 @@ +Mon Jun 3 22:10:00 UTC 2013 - brog...@suse.com + +- Adapt kvm package to wrapper the qemu package's system binary, + maintaining a /usr/bin/qemu-kvm executable which still defaults + to kvm acceleration. + - update to v1.5.0 (see: http://wiki.qemu.org/ChangeLog/1.5) + - dropped all patches + - default guest memory is now 128M + - default nic is now e1000 +- Windows virtio drivers moved to a separate package + +------------------------------------------------------------------- Old: ---- S390-0003-Make-char-muxer-more-robust-wrt-small-FIFOs.patch S390-qemu-early-printk.patch bcc-0.16.17-2.i486.rpm ipxe-717279a.tar.bz2 ipxe-avoid-bad-array-reference.patch ipxe-rom-settings.patch kvm-glibc217.patch kvm-qemu-avoid-deprecated-gnutls-types.patch kvm-qemu-avoid-redunant-declaration-error.patch kvm-qemu-default-memsize.patch kvm-qemu-enable-kvm-acceleration.patch kvm-qemu-madvise-DONTFORK-for-tight-memory-migration.patch kvm-qemu-make-rtl8139-default-nic.patch kvm-qemu-preXX-console.patch kvm-qemu-preXX-dictzip1.patch kvm-qemu-preXX-dictzip2.patch kvm-qemu-preXX-dictzip3.patch kvm-qemu-preXX-report-default-mac-used.patch kvm-qemu-preXX-serial-retry-revert.patch kvm-qemu-provide-__u64-for-broken-sys-capability-h.patch kvm-studio-slirp-nooutgoing.patch kvm-studio-vnc.patch kvm-supported.txt qemu-1.3.1.tar.bz2 qemu-datadir.diff seabios-261e870.tar.bz2 seabios-reformat-lst-in-case-it-is-generated-by-new-iasl.patch seabios-sanitize-version.patch sgabios.tar.bz2 vgabios-0.6c.tar.bz2 vgabios-bcc-paths.patch win-virtio-drivers-src.tar.bz2 win-virtio-drivers.iso New: ---- kvm_stat ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ kvm.spec ++++++ --- /var/tmp/diff_new_pack.Wj2AJS/_old 2013-06-15 08:25:02.000000000 +0200 +++ /var/tmp/diff_new_pack.Wj2AJS/_new 2013-06-15 08:25:02.000000000 +0200 @@ -14,413 +14,71 @@ # Please submit bugfixes or comments via http://bugs.opensuse.org/ # -# icecream 0 -%bcond_without spice - -%define package_true_version 1.3.1 -%define package_base_version 1.3.1 -%define bios_id seabios-261e870 -# (this is post v1.7.1 upstream seabios code) -%define pxe_rom_id ipxe-717279a -# (this is post v1.0.0 upstream ipxe code) -%define vgabios_id vgabios-0.6c -# sgabios comes from: http://sgabios.googlecode.com/svn/trunk, Rev 8 -%define sgabios_id sgabios - -# note that this list doesn't include the ipxe roms since they get handled -# individually and not as a group -%define firmware_files {bios.bin sgabios.bin vgabios.bin vgabios-cirrus.bin vgabios-stdvga.bin vgabios-vmware.bin vgabios-qxl.bin optionrom/linuxboot.bin optionrom/multiboot.bin optionrom/kvmvapic.bin} - -ExclusiveArch: %ix86 x86_64 s390x - -%ifarch %ix86 x86_64 -# choice of building all from source or using provided binary x86 blobs -%define build_fw_from_source 1 +%if %( echo `rpm -q --queryformat %%{version} udev` ) > 190 +%define _udevrulesdir /usr/lib/udev/rules.d %else -%define build_fw_from_source 0 +%define _udevrulesdir /lib/udev/rules.d %endif -%define using_buildservice 0%{?opensuse_bs} +ExclusiveArch: %ix86 x86_64 s390x Name: kvm -BuildRequires: SDL-devel -BuildRequires: alsa -BuildRequires: alsa-devel -BuildRequires: glib2-devel -%if 0%{?suse_version} > 1210 -BuildRequires: libgnutls-devel -BuildRequires: pkgconfig(udev) -%define _udevrulesdir %(pkg-config --variable=udevdir udev)/rules.d -%else -BuildRequires: gnutls-devel -%endif -BuildRequires: libaio-devel -BuildRequires: libattr-devel -BuildRequires: libcap-devel -BuildRequires: libcap-ng-devel -BuildRequires: libcurl-devel -BuildRequires: libjpeg-devel -BuildRequires: libpng-devel -BuildRequires: libpulse-devel -BuildRequires: ncurses-devel -BuildRequires: pciutils-devel -BuildRequires: perl -BuildRequires: python -BuildRequires: texinfo -BuildRequires: xfsprogs-devel -%if 0%{?suse_version} >= 1130 -BuildRequires: brlapi-devel -%endif -%ifarch %ix86 x86_64 -%if %{build_fw_from_source} -# needed for building vgabios: -BuildRequires: bin86 -%ifarch x86_64 -#needed by bcc compiler which is needed for building vgabios: -BuildRequires: glibc-32bit -%endif -%endif -%if 0%{?suse_version} > 1110 -BuildRequires: acpica -%else -BuildRequires: pmtools -%endif -%endif -BuildRequires: libvdeplug3-devel -%if %{with spice} -# Spice support requires pixman > 0.17, which does not included in older suse versions -%if 0%{?suse_version} >= 1130 -BuildRequires: libspice-server-devel -BuildRequires: spice-protocol-devel -%endif -%endif -%if 0%{?suse_version} >= 1220 -BuildRequires: usbredir-devel >= 0.3.4 -%endif -BuildRequires: pwdutils -Requires: pwdutils -Requires: python-curses -%if 0%{?suse_version} < 1110 -Requires: kvm-kmp -%endif -Recommends: qemu-tools -Recommends: virt-utils -Summary: Kernel-based Virtual Machine -License: BSD-3-Clause and GPL-2.0 and GPL-2.0+ and LGPL-2.1+ and MIT -Group: System/Kernel Url: http://www.linux-kvm.org -Version: %{package_true_version} +Summary: Kernel-based Virtual Machine +License: GPL-2.0+ +Group: System/Emulators/PC +Version: 1.5.0 Release: 0 -Source0: qemu-%{package_true_version}.tar.bz2 +BuildRequires: qemu +BuildRequires: udev +Requires: qemu +Recommends: virt-utils Source1: 80-kvm.rules Source2: qemu-ifup -Source3: kvm-supported.txt -Source4: win-virtio-drivers.iso -Source5: win-virtio-drivers-src.tar.bz2 -Source6: %{bios_id}.tar.bz2 -Source7: %{pxe_rom_id}.tar.bz2 -Source8: bcc-0.16.17-2.i486.rpm -Source9: %{vgabios_id}.tar.bz2 -Source10: %{sgabios_id}.tar.bz2 - -# ipxe patches -Patch01: ipxe-rom-settings.patch -Patch02: ipxe-avoid-bad-array-reference.patch - -# seabios patches -Patch20: seabios-sanitize-version.patch -Patch21: seabios-reformat-lst-in-case-it-is-generated-by-new-iasl.patch - -# vgabios patches -Patch40: vgabios-bcc-paths.patch - -# common and X86 patches -# qemu-kvm patches -Patch60: qemu-datadir.diff -Patch61: kvm-qemu-default-memsize.patch -Patch62: kvm-qemu-madvise-DONTFORK-for-tight-memory-migration.patch -Patch63: kvm-qemu-avoid-deprecated-gnutls-types.patch -Patch64: kvm-qemu-provide-__u64-for-broken-sys-capability-h.patch -Patch65: kvm-glibc217.patch -Patch66: kvm-qemu-avoid-redunant-declaration-error.patch -Patch67: kvm-qemu-enable-kvm-acceleration.patch -Patch68: kvm-qemu-make-rtl8139-default-nic.patch - -# Post-release upstream patches -Patch100: kvm-qemu-preXX-dictzip1.patch -Patch101: kvm-qemu-preXX-dictzip2.patch -Patch102: kvm-qemu-preXX-dictzip3.patch -Patch103: kvm-qemu-preXX-report-default-mac-used.patch -Patch104: kvm-qemu-preXX-console.patch -Patch105: kvm-qemu-preXX-serial-retry-revert.patch - -Patch200: kvm-studio-slirp-nooutgoing.patch -Patch201: kvm-studio-vnc.patch - -# for S390 -Patch700: S390-qemu-early-printk.patch -Patch701: S390-0003-Make-char-muxer-more-robust-wrt-small-FIFOs.patch - -# For upstream patches: +Source3: kvm_stat BuildRoot: %{_tmppath}/%{name}-%{version}-build -Requires(pre): /usr/sbin/groupadd -%{!?_udevrulesdir: %global _udevrulesdir /lib/udev/rules.d} + %description KVM (Kernel-based Virtual Machine) is virtualization software for -Linux. It is based on the hardware virtualization extensions provided -by Intel VT and AMD-V technologies. KVM kernel modules provide a -control interface at /dev/kvm which the qemu-kvm user-space program -uses to provide a hybrid emulated and actual hardware environment -sufficent to run various PC operating systems (guests) in unmodified -form, including Linux, Windows, and Mac OS X. - -Since qemu-kvm is derived from the qemu processor emulator sources it -also is able to run guests using processor emulation mode, but with the -expected performance impact. Conversely, hardware virtualization -features outside the processor such as iommu and sr-iov are used by KVM -allowing for improved performance. - -The seabios, vgabios and ipxe open source projects are also pulled from -to provide the firmware components included. - -To increase performance over emulated hardware devices virtio drivers -are supported, and in the case of Windows, included. - -KVM is compatible with various VM management solutions, including -libvirt, virt-manager and vm-install. - - -Authors: --------- - Avi Kivity <a...@qumranet.com> - Yaniv Kamay <ya...@qumranet.com> - Dor Laor <dor.l...@qumranet.com> +Linux. It was originally developed to leverage the hardware virtualization +extensions provided by Intel VT and AMD-V technologies. Since then, a few +other platforms have also included support for KVM virtualization. + +Since the qemu package now supports kvm, this package includes only left-overs +from the former kvm package that for various reasons do not make sense to be +placed in the qemu package. %prep -%if %{build_fw_from_source} -mkdir bcc-bits -cd bcc-bits/ -rpm2cpio %{SOURCE8} | cpio -id ./usr/bin/bcc ./usr/lib/bcc/bcc-cc1 -%setup -q -T -D -n %{pxe_rom_id} -b 7 -# ipxe patches -%patch01 -p1 -%patch02 -p1 -%endif -%setup -q -n qemu-%{package_true_version} -a 6 -a 9 -a 10 -%if %{build_fw_from_source} -#ensure that we only end up with the ones we built -for i in %firmware_files -do - rm -f pc-bios/$i -done -# seabios patches -%patch20 -p1 -%patch21 -p1 - -# vgabios patches -%patch40 -p1 -%endif - -# convert qemu into qemu-kvm patches -# qemu-kvm patches -%patch60 -p1 -%patch61 -p1 -%patch62 -p1 -%patch63 -p1 -%patch64 -p1 -%patch65 -p1 -%patch66 -p1 -%patch67 -p1 -%patch68 -p1 - -# Post-release patches -%patch100 -p1 -%patch101 -p1 -%patch102 -p1 -%patch103 -p1 -%patch104 -p1 -%patch105 -p1 - -# Studio addons -%patch200 -p1 -%patch201 -p1 - -# S390 support -%patch700 -p1 -%patch701 -p1 - -cp %{SOURCE3} . %build -# change from devel version to actual version -echo "%{package_base_version}" > VERSION -echo "kvm-%{version}-%{release}" > KVM_VERSION -./configure \ - --prefix=%{_prefix} \ - --sysconfdir=%{_sysconfdir} \ - --libexecdir=%{_libexecdir} \ - --with-confsuffix=/qemu-kvm \ - --with-pkgversion="kvm-%{version}-%{release}" \ - --extra-cflags="%{optflags}" \ - --disable-debug-tcg \ - --disable-sparse \ - --disable-strip \ - --enable-werror \ - --enable-sdl \ -%if 0%{?suse_version} >= 1100 - --audio-drv-list="pa alsa sdl oss" \ -%else - --audio-drv-list="alsa sdl oss" \ -%endif - --audio-card-list="ac97 adlib cs4231a gus sb16 hda" \ -%ifarch s390x - --target-list="s390x-softmmu" \ -%else - --target-list="x86_64-softmmu" \ -%endif - --disable-xen \ - --enable-vnc-tls \ - --disable-vnc-sasl \ - --enable-vnc-jpeg \ - --enable-vnc-png \ - --enable-curses \ - --enable-curl \ - --disable-fdt \ - --disable-bluez \ - --enable-kvm \ - --disable-user \ - --enable-vde \ - --enable-virtfs \ - --enable-cap-ng \ -%if %{build_fw_from_source} - --disable-blobs \ -%endif - --enable-docs \ -%if 0%{?suse_version} == 1120 - --disable-linux-aio \ -%else - --enable-linux-aio \ -%endif -%if 0%{?suse_version} >= 1130 - --enable-brlapi \ -%if %{with spice} - --enable-spice -%endif -%else - --disable-brlapi \ - --disable-spice -%endif - -sed -i 's/CFLAGS =/CFLAGS +=/' roms/vgabios/Makefile -# userspace: -make %{?_smp_mflags} - -# Firmware -%ifarch %ix86 x86_64 -%if %{build_fw_from_source} -echo "%{bios_id}" > roms/seabios/.version -make -C roms/seabios %{?_smp_mflags} -cp roms/seabios/out/bios.bin pc-bios/bios.bin - -make -C roms/sgabios -cp roms/sgabios/sgabios.bin pc-bios/sgabios.bin - -make -C roms/vgabios %{?_smp_mflags} -cp roms/vgabios/VGABIOS-lgpl-latest.bin pc-bios/vgabios.bin -cp roms/vgabios/VGABIOS-lgpl-latest.cirrus.bin pc-bios/vgabios-cirrus.bin -cp roms/vgabios/VGABIOS-lgpl-latest.stdvga.bin pc-bios/vgabios-stdvga.bin -cp roms/vgabios/VGABIOS-lgpl-latest.vmware.bin pc-bios/vgabios-vmware.bin -cp roms/vgabios/VGABIOS-lgpl-latest.qxl.bin pc-bios/vgabios-qxl.bin -cd ../%{pxe_rom_id}/src -# work around bogus aliasing warning in 32 bit v4.3 gcc compiler -%if 0%{?suse_version} == 1110 -%ifarch %ix86 -make NO_WERROR=1 bin/byteswap_test.o %{?_smp_mflags} -%endif -%endif -make bin/blib.a %{?_smp_mflags} -make bin/8086100e.rom %{?_smp_mflags} -make bin/10222000.rom %{?_smp_mflags} -make bin/10500940.rom %{?_smp_mflags} -make bin/10ec8139.rom %{?_smp_mflags} -make bin/80861209.rom %{?_smp_mflags} -make bin/1af41000.rom %{?_smp_mflags} -%endif -%endif %install -make install DESTDIR=%{buildroot} %{?_smp_mflags} -mkdir -p %{buildroot}%{_docdir}/kvm -cp qemu-doc.html qemu-kvm.html -cp qemu-tech.html qemu-kvm-tech.html -cp QMP/qmp-commands.txt qmp-commands.txt -install -m 755 scripts/kvm/kvm_stat %{buildroot}%{_bindir}/ -%if %{build_fw_from_source} -for i in %firmware_files -do - install -m 644 pc-bios/$i %{buildroot}%{_datadir}/qemu-kvm/ -done -install_rom() { - install -m 644 $1.rom %{buildroot}%{_datadir}/qemu-kvm/$2.rom -} -cd ../%{pxe_rom_id}/src/bin/ -install_rom 8086100e pxe-e1000 -install_rom 10222000 pxe-pcnet -install_rom 10500940 pxe-ne2k_pci -install_rom 10ec8139 pxe-rtl8139 -install_rom 80861209 pxe-eepro100 -install_rom 1af41000 pxe-virtio -%endif -cd %{buildroot} -rm .%_bindir/{qemu-img,qemu-io,qemu-ga,qemu-nbd,virtfs-proxy-helper} -rm -r .{%_libexecdir/qemu-bridge-helper,%_datadir/doc/qemu} -%if !%{build_fw_from_source} -rm .%_datadir/qemu-kvm/{openbios-sparc32,openbios-sparc64,ppc_rom.bin,openbios-ppc,bamboo.dtb,petalogix-ml605.dtb,petalogix-s3adsp1800.dtb} -%endif -%ifarch s390x -rm .%_datadir/qemu-kvm/bios.bin -mv %{buildroot}%{_sysconfdir}/qemu-kvm/target-x86_64.conf \ - %{buildroot}%{_sysconfdir}/qemu-kvm/target-s390x.conf +mkdir -p %{buildroot}%{_bindir} +cat > %{buildroot}%{_bindir}/qemu-kvm << 'EOF' +#!/bin/sh +%ifarch %s390x +exec /usr/bin/qemu-system-s390x -machine accel=kvm "$@" +%else +exec /usr/bin/qemu-system-x86_64 -machine accel=kvm "$@" %endif -rm -r .%_mandir/man1/qemu-img.1 -rm -r .%_mandir/man1/virtfs-proxy-helper.1 -rm -r .%_mandir/man8/qemu-nbd.8 -mv .%_bindir/{qemu-system*,qemu-kvm} -mv .%_mandir/man1/{qemu.1,qemu-kvm.1} -chmod 644 .%_mandir/man1/* +EOF +chmod 755 %{buildroot}%{_bindir}/qemu-kvm install -D -m 644 %{SOURCE1} %{buildroot}%{_udevrulesdir}/80-kvm.rules -install -D -m 755 %{SOURCE2} %{buildroot}/usr/share/qemu-kvm/qemu-ifup -install -D -m 644 %{SOURCE4} %{buildroot}/usr/share/qemu-kvm/win-virtio-drivers.iso +install -D -m 755 %{SOURCE2} %{buildroot}/usr/share/qemu/qemu-ifup +install -D -m 755 %{SOURCE3} %{buildroot}%{_bindir}/kvm_stat %clean cd ../ -rm -rf bcc-bits -rm -rf %{pxe_rom_id} rm -rf $RPM_BUILD_ROOT -%pre -%{_bindir}/getent group kvm >/dev/null || %{_sbindir}/groupadd -r kvm 2>/dev/null -%{_bindir}/getent group qemu >/dev/null || %{_sbindir}/groupadd -r qemu 2>/dev/null -%{_bindir}/getent passwd qemu >/dev/null || \ - %{_sbindir}/useradd -r -g qemu -G kvm -d / -s /sbin/nologin \ - -c "qemu user" qemu - %files %defattr(-,root,root) -%doc COPYING COPYING.LIB Changelog README qemu-kvm.html qemu-kvm-tech.html kvm-supported.txt qmp-commands.txt -%attr(755,root,kvm) %{_bindir}/qemu-kvm -%attr(755,root,kvm) %{_bindir}/kvm_stat -%{_datadir}/qemu-kvm -%dir %attr(0755,root,kvm) %{_sysconfdir}/qemu-kvm/ -%ifarch s390x -%config %attr(644,root,kvm) %{_sysconfdir}/qemu-kvm/target-s390x.conf -%else -%config %attr(644,root,kvm) %{_sysconfdir}/qemu-kvm/target-x86_64.conf -%endif +%_bindir/qemu-kvm +%_bindir/kvm_stat +%_datadir/qemu/qemu-ifup %{_udevrulesdir}/80-kvm.rules -%_mandir/man1/qemu-kvm.1.gz %changelog ++++++ kvm_stat ++++++ #!/usr/bin/python # # top-like utility for displaying kvm statistics # # Copyright 2006-2008 Qumranet Technologies # Copyright 2008-2011 Red Hat, Inc. # # Authors: # Avi Kivity <a...@redhat.com> # # This work is licensed under the terms of the GNU GPL, version 2. See # the COPYING file in the top-level directory. import curses import sys, os, time, optparse class DebugfsProvider(object): def __init__(self): self.base = '/sys/kernel/debug/kvm' self._fields = os.listdir(self.base) def fields(self): return self._fields def select(self, fields): self._fields = fields def read(self): def val(key): return int(file(self.base + '/' + key).read()) return dict([(key, val(key)) for key in self._fields]) vmx_exit_reasons = { 0: 'EXCEPTION_NMI', 1: 'EXTERNAL_INTERRUPT', 2: 'TRIPLE_FAULT', 7: 'PENDING_INTERRUPT', 8: 'NMI_WINDOW', 9: 'TASK_SWITCH', 10: 'CPUID', 12: 'HLT', 14: 'INVLPG', 15: 'RDPMC', 16: 'RDTSC', 18: 'VMCALL', 19: 'VMCLEAR', 20: 'VMLAUNCH', 21: 'VMPTRLD', 22: 'VMPTRST', 23: 'VMREAD', 24: 'VMRESUME', 25: 'VMWRITE', 26: 'VMOFF', 27: 'VMON', 28: 'CR_ACCESS', 29: 'DR_ACCESS', 30: 'IO_INSTRUCTION', 31: 'MSR_READ', 32: 'MSR_WRITE', 33: 'INVALID_STATE', 36: 'MWAIT_INSTRUCTION', 39: 'MONITOR_INSTRUCTION', 40: 'PAUSE_INSTRUCTION', 41: 'MCE_DURING_VMENTRY', 43: 'TPR_BELOW_THRESHOLD', 44: 'APIC_ACCESS', 48: 'EPT_VIOLATION', 49: 'EPT_MISCONFIG', 54: 'WBINVD', 55: 'XSETBV', } svm_exit_reasons = { 0x000: 'READ_CR0', 0x003: 'READ_CR3', 0x004: 'READ_CR4', 0x008: 'READ_CR8', 0x010: 'WRITE_CR0', 0x013: 'WRITE_CR3', 0x014: 'WRITE_CR4', 0x018: 'WRITE_CR8', 0x020: 'READ_DR0', 0x021: 'READ_DR1', 0x022: 'READ_DR2', 0x023: 'READ_DR3', 0x024: 'READ_DR4', 0x025: 'READ_DR5', 0x026: 'READ_DR6', 0x027: 'READ_DR7', 0x030: 'WRITE_DR0', 0x031: 'WRITE_DR1', 0x032: 'WRITE_DR2', 0x033: 'WRITE_DR3', 0x034: 'WRITE_DR4', 0x035: 'WRITE_DR5', 0x036: 'WRITE_DR6', 0x037: 'WRITE_DR7', 0x040: 'EXCP_BASE', 0x060: 'INTR', 0x061: 'NMI', 0x062: 'SMI', 0x063: 'INIT', 0x064: 'VINTR', 0x065: 'CR0_SEL_WRITE', 0x066: 'IDTR_READ', 0x067: 'GDTR_READ', 0x068: 'LDTR_READ', 0x069: 'TR_READ', 0x06a: 'IDTR_WRITE', 0x06b: 'GDTR_WRITE', 0x06c: 'LDTR_WRITE', 0x06d: 'TR_WRITE', 0x06e: 'RDTSC', 0x06f: 'RDPMC', 0x070: 'PUSHF', 0x071: 'POPF', 0x072: 'CPUID', 0x073: 'RSM', 0x074: 'IRET', 0x075: 'SWINT', 0x076: 'INVD', 0x077: 'PAUSE', 0x078: 'HLT', 0x079: 'INVLPG', 0x07a: 'INVLPGA', 0x07b: 'IOIO', 0x07c: 'MSR', 0x07d: 'TASK_SWITCH', 0x07e: 'FERR_FREEZE', 0x07f: 'SHUTDOWN', 0x080: 'VMRUN', 0x081: 'VMMCALL', 0x082: 'VMLOAD', 0x083: 'VMSAVE', 0x084: 'STGI', 0x085: 'CLGI', 0x086: 'SKINIT', 0x087: 'RDTSCP', 0x088: 'ICEBP', 0x089: 'WBINVD', 0x08a: 'MONITOR', 0x08b: 'MWAIT', 0x08c: 'MWAIT_COND', 0x400: 'NPF', } s390_exit_reasons = { 0x000: 'UNKNOWN', 0x001: 'EXCEPTION', 0x002: 'IO', 0x003: 'HYPERCALL', 0x004: 'DEBUG', 0x005: 'HLT', 0x006: 'MMIO', 0x007: 'IRQ_WINDOW_OPEN', 0x008: 'SHUTDOWN', 0x009: 'FAIL_ENTRY', 0x010: 'INTR', 0x011: 'SET_TPR', 0x012: 'TPR_ACCESS', 0x013: 'S390_SIEIC', 0x014: 'S390_RESET', 0x015: 'DCR', 0x016: 'NMI', 0x017: 'INTERNAL_ERROR', 0x018: 'OSI', 0x019: 'PAPR_HCALL', } vendor_exit_reasons = { 'vmx': vmx_exit_reasons, 'svm': svm_exit_reasons, 'IBM/S390': s390_exit_reasons, } syscall_numbers = { 'IBM/S390': 331, } sc_perf_evt_open = 298 exit_reasons = None for line in file('/proc/cpuinfo').readlines(): if line.startswith('flags') or line.startswith('vendor_id'): for flag in line.split(): if flag in vendor_exit_reasons: exit_reasons = vendor_exit_reasons[flag] if flag in syscall_numbers: sc_perf_evt_open = syscall_numbers[flag] filters = { 'kvm_exit': ('exit_reason', exit_reasons) } def invert(d): return dict((x[1], x[0]) for x in d.iteritems()) for f in filters: filters[f] = (filters[f][0], invert(filters[f][1])) import ctypes, struct, array libc = ctypes.CDLL('libc.so.6') syscall = libc.syscall class perf_event_attr(ctypes.Structure): _fields_ = [('type', ctypes.c_uint32), ('size', ctypes.c_uint32), ('config', ctypes.c_uint64), ('sample_freq', ctypes.c_uint64), ('sample_type', ctypes.c_uint64), ('read_format', ctypes.c_uint64), ('flags', ctypes.c_uint64), ('wakeup_events', ctypes.c_uint32), ('bp_type', ctypes.c_uint32), ('bp_addr', ctypes.c_uint64), ('bp_len', ctypes.c_uint64), ] def _perf_event_open(attr, pid, cpu, group_fd, flags): return syscall(sc_perf_evt_open, ctypes.pointer(attr), ctypes.c_int(pid), ctypes.c_int(cpu), ctypes.c_int(group_fd), ctypes.c_long(flags)) PERF_TYPE_HARDWARE = 0 PERF_TYPE_SOFTWARE = 1 PERF_TYPE_TRACEPOINT = 2 PERF_TYPE_HW_CACHE = 3 PERF_TYPE_RAW = 4 PERF_TYPE_BREAKPOINT = 5 PERF_SAMPLE_IP = 1 << 0 PERF_SAMPLE_TID = 1 << 1 PERF_SAMPLE_TIME = 1 << 2 PERF_SAMPLE_ADDR = 1 << 3 PERF_SAMPLE_READ = 1 << 4 PERF_SAMPLE_CALLCHAIN = 1 << 5 PERF_SAMPLE_ID = 1 << 6 PERF_SAMPLE_CPU = 1 << 7 PERF_SAMPLE_PERIOD = 1 << 8 PERF_SAMPLE_STREAM_ID = 1 << 9 PERF_SAMPLE_RAW = 1 << 10 PERF_FORMAT_TOTAL_TIME_ENABLED = 1 << 0 PERF_FORMAT_TOTAL_TIME_RUNNING = 1 << 1 PERF_FORMAT_ID = 1 << 2 PERF_FORMAT_GROUP = 1 << 3 import re sys_tracing = '/sys/kernel/debug/tracing' class Group(object): def __init__(self, cpu): self.events = [] self.group_leader = None self.cpu = cpu def add_event(self, name, event_set, tracepoint, filter = None): self.events.append(Event(group = self, name = name, event_set = event_set, tracepoint = tracepoint, filter = filter)) if len(self.events) == 1: self.file = os.fdopen(self.events[0].fd) def read(self): bytes = 8 * (1 + len(self.events)) fmt = 'xxxxxxxx' + 'q' * len(self.events) return dict(zip([event.name for event in self.events], struct.unpack(fmt, self.file.read(bytes)))) class Event(object): def __init__(self, group, name, event_set, tracepoint, filter = None): self.name = name attr = perf_event_attr() attr.type = PERF_TYPE_TRACEPOINT attr.size = ctypes.sizeof(attr) id_path = os.path.join(sys_tracing, 'events', event_set, tracepoint, 'id') id = int(file(id_path).read()) attr.config = id attr.sample_type = (PERF_SAMPLE_RAW | PERF_SAMPLE_TIME | PERF_SAMPLE_CPU) attr.sample_period = 1 attr.read_format = PERF_FORMAT_GROUP group_leader = -1 if group.events: group_leader = group.events[0].fd fd = _perf_event_open(attr, -1, group.cpu, group_leader, 0) if fd == -1: raise Exception('perf_event_open failed') if filter: import fcntl fcntl.ioctl(fd, 0x40082406, filter) self.fd = fd def enable(self): import fcntl fcntl.ioctl(self.fd, 0x00002400, 0) def disable(self): import fcntl fcntl.ioctl(self.fd, 0x00002401, 0) class TracepointProvider(object): def __init__(self): path = os.path.join(sys_tracing, 'events', 'kvm') fields = [f for f in os.listdir(path) if os.path.isdir(os.path.join(path, f))] extra = [] for f in fields: if f in filters: subfield, values = filters[f] for name, number in values.iteritems(): extra.append(f + '(' + name + ')') fields += extra self._setup(fields) self.select(fields) def fields(self): return self._fields def _setup(self, _fields): self._fields = _fields cpure = r'cpu([0-9]+)' self.cpus = [int(re.match(cpure, x).group(1)) for x in os.listdir('/sys/devices/system/cpu') if re.match(cpure, x)] import resource nfiles = len(self.cpus) * 1000 resource.setrlimit(resource.RLIMIT_NOFILE, (nfiles, nfiles)) events = [] self.group_leaders = [] for cpu in self.cpus: group = Group(cpu) for name in _fields: tracepoint = name filter = None m = re.match(r'(.*)\((.*)\)', name) if m: tracepoint, sub = m.groups() filter = '%s==%d\0' % (filters[tracepoint][0], filters[tracepoint][1][sub]) event = group.add_event(name, event_set = 'kvm', tracepoint = tracepoint, filter = filter) self.group_leaders.append(group) def select(self, fields): for group in self.group_leaders: for event in group.events: if event.name in fields: event.enable() else: event.disable() def read(self): from collections import defaultdict ret = defaultdict(int) for group in self.group_leaders: for name, val in group.read().iteritems(): ret[name] += val return ret class Stats: def __init__(self, provider, fields = None): self.provider = provider self.fields_filter = fields self._update() def _update(self): def wanted(key): import re if not self.fields_filter: return True return re.match(self.fields_filter, key) is not None self.values = dict([(key, None) for key in provider.fields() if wanted(key)]) self.provider.select(self.values.keys()) def set_fields_filter(self, fields_filter): self.fields_filter = fields_filter self._update() def get(self): new = self.provider.read() for key in self.provider.fields(): oldval = self.values.get(key, (0, 0)) newval = new[key] newdelta = None if oldval is not None: newdelta = newval - oldval[0] self.values[key] = (newval, newdelta) return self.values if not os.access('/sys/kernel/debug', os.F_OK): print 'Please enable CONFIG_DEBUG_FS in your kernel' sys.exit(1) if not os.access('/sys/kernel/debug/kvm', os.F_OK): print "Please mount debugfs ('mount -t debugfs debugfs /sys/kernel/debug')" print "and ensure the kvm modules are loaded" sys.exit(1) label_width = 40 number_width = 10 def tui(screen, stats): curses.use_default_colors() curses.noecho() drilldown = False fields_filter = stats.fields_filter def update_drilldown(): if not fields_filter: if drilldown: stats.set_fields_filter(None) else: stats.set_fields_filter(r'^[^\(]*$') update_drilldown() def refresh(sleeptime): screen.erase() screen.addstr(0, 0, 'kvm statistics') row = 2 s = stats.get() def sortkey(x): if s[x][1]: return (-s[x][1], -s[x][0]) else: return (0, -s[x][0]) for key in sorted(s.keys(), key = sortkey): if row >= screen.getmaxyx()[0]: break values = s[key] if not values[0] and not values[1]: break col = 1 screen.addstr(row, col, key) col += label_width screen.addstr(row, col, '%10d' % (values[0],)) col += number_width if values[1] is not None: screen.addstr(row, col, '%8d' % (values[1] / sleeptime,)) row += 1 screen.refresh() sleeptime = 0.25 while True: refresh(sleeptime) curses.halfdelay(int(sleeptime * 10)) sleeptime = 3 try: c = screen.getkey() if c == 'x': drilldown = not drilldown update_drilldown() if c == 'q': break except KeyboardInterrupt: break except curses.error: continue def batch(stats): s = stats.get() time.sleep(1) s = stats.get() for key in sorted(s.keys()): values = s[key] print '%-22s%10d%10d' % (key, values[0], values[1]) def log(stats): keys = sorted(stats.get().iterkeys()) def banner(): for k in keys: print '%10s' % k[0:9], print def statline(): s = stats.get() for k in keys: print ' %9d' % s[k][1], print line = 0 banner_repeat = 20 while True: time.sleep(1) if line % banner_repeat == 0: banner() statline() line += 1 options = optparse.OptionParser() options.add_option('-1', '--once', '--batch', action = 'store_true', default = False, dest = 'once', help = 'run in batch mode for one second', ) options.add_option('-l', '--log', action = 'store_true', default = False, dest = 'log', help = 'run in logging mode (like vmstat)', ) options.add_option('-f', '--fields', action = 'store', default = None, dest = 'fields', help = 'fields to display (regex)', ) (options, args) = options.parse_args(sys.argv) try: provider = TracepointProvider() except: provider = DebugfsProvider() stats = Stats(provider, fields = options.fields) if options.log: log(stats) elif not options.once: import curses.wrapper curses.wrapper(tui, stats) else: batch(stats) -- To unsubscribe, e-mail: opensuse-commit+unsubscr...@opensuse.org For additional commands, e-mail: opensuse-commit+h...@opensuse.org