mirror of https://github.com/xemu-project/xemu.git
kvm_stat: Print errno when syscall to perf_event_open() fails
kvm_stat uses syscall() to call perf_event_open(). If this function call fails, the returned value is -1, which doesn't tell the details of such failure (i.e. ENOSYS or EINVAL). This patch retrieves errno and prints it when syscall() fails. The error message will look like "Exception: perf_event_open failed, errno = 38". Signed-off-by: Wei Huang <wei@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
2c9d535a2e
commit
874b1cfad5
|
@ -13,6 +13,7 @@
|
||||||
|
|
||||||
import curses
|
import curses
|
||||||
import sys, os, time, optparse, ctypes
|
import sys, os, time, optparse, ctypes
|
||||||
|
from ctypes import *
|
||||||
|
|
||||||
class DebugfsProvider(object):
|
class DebugfsProvider(object):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
@ -247,6 +248,9 @@ import struct, array
|
||||||
|
|
||||||
libc = ctypes.CDLL('libc.so.6')
|
libc = ctypes.CDLL('libc.so.6')
|
||||||
syscall = libc.syscall
|
syscall = libc.syscall
|
||||||
|
get_errno = libc.__errno_location
|
||||||
|
get_errno.restype = POINTER(c_int)
|
||||||
|
|
||||||
class perf_event_attr(ctypes.Structure):
|
class perf_event_attr(ctypes.Structure):
|
||||||
_fields_ = [('type', ctypes.c_uint32),
|
_fields_ = [('type', ctypes.c_uint32),
|
||||||
('size', ctypes.c_uint32),
|
('size', ctypes.c_uint32),
|
||||||
|
@ -330,7 +334,8 @@ class Event(object):
|
||||||
group_leader = group.events[0].fd
|
group_leader = group.events[0].fd
|
||||||
fd = _perf_event_open(attr, -1, group.cpu, group_leader, 0)
|
fd = _perf_event_open(attr, -1, group.cpu, group_leader, 0)
|
||||||
if fd == -1:
|
if fd == -1:
|
||||||
raise Exception('perf_event_open failed')
|
err = get_errno()[0]
|
||||||
|
raise Exception('perf_event_open failed, errno = ' + err.__str__())
|
||||||
if filter:
|
if filter:
|
||||||
import fcntl
|
import fcntl
|
||||||
fcntl.ioctl(fd, ioctl_numbers['SET_FILTER'], filter)
|
fcntl.ioctl(fd, ioctl_numbers['SET_FILTER'], filter)
|
||||||
|
|
Loading…
Reference in New Issue