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

Reply via email to