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 sys, os, time, optparse, ctypes | ||||
| from ctypes import * | ||||
| 
 | ||||
| class DebugfsProvider(object): | ||||
|     def __init__(self): | ||||
| @ -247,6 +248,9 @@ import struct, array | ||||
| 
 | ||||
| libc = ctypes.CDLL('libc.so.6') | ||||
| syscall = libc.syscall | ||||
| get_errno = libc.__errno_location | ||||
| get_errno.restype = POINTER(c_int) | ||||
| 
 | ||||
| class perf_event_attr(ctypes.Structure): | ||||
|     _fields_ = [('type', ctypes.c_uint32), | ||||
|                 ('size', ctypes.c_uint32), | ||||
| @ -330,7 +334,8 @@ class Event(object): | ||||
|             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') | ||||
|             err = get_errno()[0] | ||||
|             raise Exception('perf_event_open failed, errno = ' + err.__str__()) | ||||
|         if filter: | ||||
|             import fcntl | ||||
|             fcntl.ioctl(fd, ioctl_numbers['SET_FILTER'], filter) | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Wei Huang
						Wei Huang