* [PATCH 0/6] kvm_stat tracepoint support
@ 2010-08-31 13:25 Avi Kivity
2010-08-31 13:25 ` [PATCH 0/6] *** SUBJECT HERE *** Avi Kivity
` (6 more replies)
0 siblings, 7 replies; 14+ messages in thread
From: Avi Kivity @ 2010-08-31 13:25 UTC (permalink / raw)
To: Marcelo Tosatti, kvm
This patchset allows kvm_stat to display the information exposed by kvm
tracepoints.
Avi Kivity (6):
kvm_stat: refactor to separate stats provider from difference engine
kvm_stat: implement tracepoint stats provider
kvm_stat: provide detailed kvm_exit:exit_reason display
kvm_stat: sort tui output according to highest occurence
kvm_stat: increase label width
kvm_stat: be slower
kvm/kvm_stat | 297 +++++++++++++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 285 insertions(+), 12 deletions(-)
^ permalink raw reply [flat|nested] 14+ messages in thread* [PATCH 0/6] *** SUBJECT HERE *** 2010-08-31 13:25 [PATCH 0/6] kvm_stat tracepoint support Avi Kivity @ 2010-08-31 13:25 ` Avi Kivity 2010-08-31 13:30 ` Avi Kivity 2010-08-31 13:25 ` [PATCH 1/6] kvm_stat: refactor to separate stats provider from difference engine Avi Kivity ` (5 subsequent siblings) 6 siblings, 1 reply; 14+ messages in thread From: Avi Kivity @ 2010-08-31 13:25 UTC (permalink / raw) To: Marcelo Tosatti, kvm *** BLURB HERE *** Avi Kivity (6): kvm_stat: refactor to separate stats provider from difference engine kvm_stat: implement tracepoint stats provider kvm_stat: provide detailed kvm_exit:exit_reason display kvm_stat: sort tui output according to highest occurence kvm_stat: increase label width kvm_stat: be slower kvm/kvm_stat | 297 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 285 insertions(+), 12 deletions(-) ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 0/6] *** SUBJECT HERE *** 2010-08-31 13:25 ` [PATCH 0/6] *** SUBJECT HERE *** Avi Kivity @ 2010-08-31 13:30 ` Avi Kivity 2010-08-31 14:43 ` Gerd Hoffmann 0 siblings, 1 reply; 14+ messages in thread From: Avi Kivity @ 2010-08-31 13:30 UTC (permalink / raw) To: Marcelo Tosatti, kvm On 08/31/2010 04:25 PM, Avi Kivity wrote: > *** BLURB HERE *** > That was supposed to be: [PATCH 0/6] kvm_stat tracepoint support This patchset allows kvm_stat to display the information exposed by kvm tracepoints. -- error compiling committee.c: too many arguments to function ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 0/6] *** SUBJECT HERE *** 2010-08-31 13:30 ` Avi Kivity @ 2010-08-31 14:43 ` Gerd Hoffmann 2010-08-31 16:10 ` Avi Kivity 0 siblings, 1 reply; 14+ messages in thread From: Gerd Hoffmann @ 2010-08-31 14:43 UTC (permalink / raw) To: Avi Kivity; +Cc: Marcelo Tosatti, kvm On 08/31/10 15:30, Avi Kivity wrote: > On 08/31/2010 04:25 PM, Avi Kivity wrote: >> *** BLURB HERE *** >> > > That was supposed to be: > > [PATCH 0/6] kvm_stat tracepoint support > > This patchset allows kvm_stat to display the information exposed by kvm > tracepoints. That was there too. You better should pass '00*.patch' instead of '00*' to git send-email so it doesn't mail out the editor backup file ;) cheers, Gerd ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 0/6] *** SUBJECT HERE *** 2010-08-31 14:43 ` Gerd Hoffmann @ 2010-08-31 16:10 ` Avi Kivity 2010-08-31 16:13 ` Anthony Liguori 0 siblings, 1 reply; 14+ messages in thread From: Avi Kivity @ 2010-08-31 16:10 UTC (permalink / raw) To: Gerd Hoffmann; +Cc: Marcelo Tosatti, kvm On 08/31/2010 05:43 PM, Gerd Hoffmann wrote: > > You better should pass '00*.patch' instead of '00*' to git send-email > so it doesn't mail out the editor backup file ;) > That's what I usually do - guess I slipped this time. ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 0/6] *** SUBJECT HERE *** 2010-08-31 16:10 ` Avi Kivity @ 2010-08-31 16:13 ` Anthony Liguori 2010-08-31 16:24 ` Avi Kivity 2010-09-01 7:32 ` Gerd Hoffmann 0 siblings, 2 replies; 14+ messages in thread From: Anthony Liguori @ 2010-08-31 16:13 UTC (permalink / raw) To: Avi Kivity; +Cc: Gerd Hoffmann, Marcelo Tosatti, kvm On 08/31/2010 11:10 AM, Avi Kivity wrote: > On 08/31/2010 05:43 PM, Gerd Hoffmann wrote: >> >> You better should pass '00*.patch' instead of '00*' to git >> send-email so it doesn't mail out the editor backup file ;) >> > > That's what I usually do - guess I slipped this time. Just as an aside, does anyone have a good way to maintain the 00 patches in series with repeated submissions? I tried to store it in git as an empty commit but most of the git tooling doesn't work well with that. Regards, Anthony Liguori > -- > To unsubscribe from this list: send the line "unsubscribe kvm" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 0/6] *** SUBJECT HERE *** 2010-08-31 16:13 ` Anthony Liguori @ 2010-08-31 16:24 ` Avi Kivity 2010-09-01 7:32 ` Gerd Hoffmann 1 sibling, 0 replies; 14+ messages in thread From: Avi Kivity @ 2010-08-31 16:24 UTC (permalink / raw) To: Anthony Liguori; +Cc: Gerd Hoffmann, Marcelo Tosatti, kvm On 08/31/2010 07:13 PM, Anthony Liguori wrote: > > Just as an aside, does anyone have a good way to maintain the 00 > patches in series with repeated submissions? > > I tried to store it in git as an empty commit but most of the git > tooling doesn't work well with that. I keep each posting in a -v1/ etc directory and copy-paste from that. -- error compiling committee.c: too many arguments to function ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 0/6] *** SUBJECT HERE *** 2010-08-31 16:13 ` Anthony Liguori 2010-08-31 16:24 ` Avi Kivity @ 2010-09-01 7:32 ` Gerd Hoffmann 1 sibling, 0 replies; 14+ messages in thread From: Gerd Hoffmann @ 2010-09-01 7:32 UTC (permalink / raw) To: Anthony Liguori; +Cc: Avi Kivity, Marcelo Tosatti, kvm On 08/31/10 18:13, Anthony Liguori wrote: > Just as an aside, does anyone have a good way to maintain the 00 patches > in series with repeated submissions? /me uses cut+paste from email folder or list archive. I suspect you are looking for something better though ... cheers, Gerd ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 1/6] kvm_stat: refactor to separate stats provider from difference engine 2010-08-31 13:25 [PATCH 0/6] kvm_stat tracepoint support Avi Kivity 2010-08-31 13:25 ` [PATCH 0/6] *** SUBJECT HERE *** Avi Kivity @ 2010-08-31 13:25 ` Avi Kivity 2010-08-31 13:25 ` [PATCH 2/6] kvm_stat: implement tracepoint stats provider Avi Kivity ` (4 subsequent siblings) 6 siblings, 0 replies; 14+ messages in thread From: Avi Kivity @ 2010-08-31 13:25 UTC (permalink / raw) To: Marcelo Tosatti, kvm Signed-off-by: Avi Kivity <avi@redhat.com> --- kvm/kvm_stat | 33 ++++++++++++++++++++++++--------- 1 files changed, 24 insertions(+), 9 deletions(-) diff --git a/kvm/kvm_stat b/kvm/kvm_stat index 21aff5b..75424fc 100755 --- a/kvm/kvm_stat +++ b/kvm/kvm_stat @@ -3,21 +3,36 @@ 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]) + class Stats: - def __init__(self, fields = None): + def __init__(self, provider, fields = None): def wanted(key): import re if not fields: return True return re.match(fields, key) != None - self.base = '/sys/kernel/debug/kvm' - self.values = {} - for key in os.listdir(self.base): - if wanted(key): - self.values[key] = None + self.provider = provider + self.values = dict([(key, None) + for key in provider.fields() + if wanted(key)]) + self.provider.select(self.values.keys()) def get(self): - for key, oldval in self.values.iteritems(): - newval = int(file(self.base + '/' + key).read()) + new = self.provider.read() + for key in self.provider.fields(): + oldval = self.values[key] + newval = new[key] newdelta = None if oldval is not None: newdelta = newval - oldval[0] @@ -118,7 +133,7 @@ options.add_option('-f', '--fields', ) (options, args) = options.parse_args(sys.argv) -stats = Stats(fields = options.fields) +stats = Stats(provider = DebugfsProvider(), fields = options.fields) if options.log: log(stats) -- 1.7.1 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 2/6] kvm_stat: implement tracepoint stats provider 2010-08-31 13:25 [PATCH 0/6] kvm_stat tracepoint support Avi Kivity 2010-08-31 13:25 ` [PATCH 0/6] *** SUBJECT HERE *** Avi Kivity 2010-08-31 13:25 ` [PATCH 1/6] kvm_stat: refactor to separate stats provider from difference engine Avi Kivity @ 2010-08-31 13:25 ` Avi Kivity 2010-08-31 13:25 ` [PATCH 3/6] kvm_stat: provide detailed kvm_exit:exit_reason display Avi Kivity ` (3 subsequent siblings) 6 siblings, 0 replies; 14+ messages in thread From: Avi Kivity @ 2010-08-31 13:25 UTC (permalink / raw) To: Marcelo Tosatti, kvm Signed-off-by: Avi Kivity <avi@redhat.com> --- kvm/kvm_stat | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 100 insertions(+), 1 deletions(-) diff --git a/kvm/kvm_stat b/kvm/kvm_stat index 75424fc..9b0392b 100755 --- a/kvm/kvm_stat +++ b/kvm/kvm_stat @@ -16,6 +16,100 @@ class DebugfsProvider(object): return int(file(self.base + '/' + key).read()) return dict([(key, val(key)) for key in self._fields]) +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(298, 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 + + +class TracepointProvider(object): + def __init__(self): + self.base = '/sys/kernel/debug/tracing/events/kvm/' + fields = [f + for f in os.listdir(self.base) + if os.path.isdir(self.base + '/' + f)] + self.select(fields) + def fields(self): + return self._fields + def select(self, _fields): + self._fields = _fields + self.cpus = [0, 1] + fds = [] + self.group_leaders = [] + for cpu in self.cpus: + group_leader = -1 + for f in _fields: + attr = perf_event_attr() + attr.type = PERF_TYPE_TRACEPOINT + attr.size = ctypes.sizeof(attr) + id = int(file(self.base + f + '/id').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 + fd = _perf_event_open(attr, -1, cpu, group_leader, 0) + if fd == -1: + raise Exception('perf_event_open failed') + if group_leader == -1: + group_leader = fd + fds.append(fd) + self.group_leaders.append(group_leader) + self.fds = fds + self.files = [os.fdopen(group_leader) + for group_leader in self.group_leaders] + def read(self): + ret = dict([(f, 0) for f in self._fields]) + bytes = 8 * (1 + len(self._fields)) + fmt = 'xxxxxxxx' + 'q' * len(self._fields) + for file in self.files: + a = struct.unpack(fmt, file.read(bytes)) + for field, val in zip(self._fields, a): + ret[field] += val + return ret + class Stats: def __init__(self, provider, fields = None): def wanted(key): @@ -133,7 +227,12 @@ options.add_option('-f', '--fields', ) (options, args) = options.parse_args(sys.argv) -stats = Stats(provider = DebugfsProvider(), fields = options.fields) +try: + provider = TracepointProvider() +except: + provider = DebugfsProvider() + +stats = Stats(provider, fields = options.fields) if options.log: log(stats) -- 1.7.1 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 3/6] kvm_stat: provide detailed kvm_exit:exit_reason display 2010-08-31 13:25 [PATCH 0/6] kvm_stat tracepoint support Avi Kivity ` (2 preceding siblings ...) 2010-08-31 13:25 ` [PATCH 2/6] kvm_stat: implement tracepoint stats provider Avi Kivity @ 2010-08-31 13:25 ` Avi Kivity 2010-08-31 13:25 ` [PATCH 4/6] kvm_stat: sort tui output according to highest occurence Avi Kivity ` (2 subsequent siblings) 6 siblings, 0 replies; 14+ messages in thread From: Avi Kivity @ 2010-08-31 13:25 UTC (permalink / raw) To: Marcelo Tosatti, kvm In addition to displaying kvm_exit as an aggregate counter, use perf_event's filter capability to count individual exit reasons. Signed-off-by: Avi Kivity <avi@redhat.com> --- kvm/kvm_stat | 156 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 155 insertions(+), 1 deletions(-) diff --git a/kvm/kvm_stat b/kvm/kvm_stat index 9b0392b..677683a 100755 --- a/kvm/kvm_stat +++ b/kvm/kvm_stat @@ -16,6 +16,143 @@ class DebugfsProvider(object): 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', +} + +vendor_exit_reasons = { + 'vmx': vmx_exit_reasons, + 'svm': svm_exit_reasons, +} + +exit_reasons = None + +for line in file('/proc/cpuinfo').readlines(): + if line.startswith('flags'): + for flag in line.split(): + if flag in vendor_exit_reasons: + exit_reasons = vendor_exit_reasons[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') @@ -62,6 +199,7 @@ PERF_FORMAT_TOTAL_TIME_RUNNING = 1 << 1 PERF_FORMAT_ID = 1 << 2 PERF_FORMAT_GROUP = 1 << 3 +import re class TracepointProvider(object): def __init__(self): @@ -69,6 +207,13 @@ class TracepointProvider(object): fields = [f for f in os.listdir(self.base) if os.path.isdir(self.base + '/' + 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.select(fields) def fields(self): return self._fields @@ -80,10 +225,14 @@ class TracepointProvider(object): for cpu in self.cpus: group_leader = -1 for f in _fields: + fbase, sub = f, None + m = re.match(r'(.*)\((.*)\)', f) + if m: + fbase, sub = m.groups() attr = perf_event_attr() attr.type = PERF_TYPE_TRACEPOINT attr.size = ctypes.sizeof(attr) - id = int(file(self.base + f + '/id').read()) + id = int(file(self.base + fbase + '/id').read()) attr.config = id attr.sample_type = (PERF_SAMPLE_RAW | PERF_SAMPLE_TIME @@ -93,6 +242,11 @@ class TracepointProvider(object): fd = _perf_event_open(attr, -1, cpu, group_leader, 0) if fd == -1: raise Exception('perf_event_open failed') + if sub: + import fcntl + filter = '%s==%d\0' % (filters[fbase][0], + filters[fbase][1][sub]) + fcntl.ioctl(fd, 0x40082406, filter) if group_leader == -1: group_leader = fd fds.append(fd) -- 1.7.1 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 4/6] kvm_stat: sort tui output according to highest occurence 2010-08-31 13:25 [PATCH 0/6] kvm_stat tracepoint support Avi Kivity ` (3 preceding siblings ...) 2010-08-31 13:25 ` [PATCH 3/6] kvm_stat: provide detailed kvm_exit:exit_reason display Avi Kivity @ 2010-08-31 13:25 ` Avi Kivity 2010-08-31 13:25 ` [PATCH 5/6] kvm_stat: increase label width Avi Kivity 2010-08-31 13:25 ` [PATCH 6/6] kvm_stat: be slower Avi Kivity 6 siblings, 0 replies; 14+ messages in thread From: Avi Kivity @ 2010-08-31 13:25 UTC (permalink / raw) To: Marcelo Tosatti, kvm With plenty of counters and wide, short screens it's hard to see what's on the top. So sort the output. Signed-off-by: Avi Kivity <avi@redhat.com> --- kvm/kvm_stat | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletions(-) diff --git a/kvm/kvm_stat b/kvm/kvm_stat index 677683a..c55bf88 100755 --- a/kvm/kvm_stat +++ b/kvm/kvm_stat @@ -306,7 +306,12 @@ def tui(screen, stats): screen.addstr(0, 0, 'kvm statistics') row = 2 s = stats.get() - for key in sorted(s.keys()): + def sortkey(x): + if s[x][1]: + return -s[x][1] + else: + return x + for key in sorted(s.keys(), key = sortkey): if row >= screen.getmaxyx()[0]: break values = s[key] -- 1.7.1 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 5/6] kvm_stat: increase label width 2010-08-31 13:25 [PATCH 0/6] kvm_stat tracepoint support Avi Kivity ` (4 preceding siblings ...) 2010-08-31 13:25 ` [PATCH 4/6] kvm_stat: sort tui output according to highest occurence Avi Kivity @ 2010-08-31 13:25 ` Avi Kivity 2010-08-31 13:25 ` [PATCH 6/6] kvm_stat: be slower Avi Kivity 6 siblings, 0 replies; 14+ messages in thread From: Avi Kivity @ 2010-08-31 13:25 UTC (permalink / raw) To: Marcelo Tosatti, kvm With kvm_exit drill down, labels are pretty large. Signed-off-by: Avi Kivity <avi@redhat.com> --- kvm/kvm_stat | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/kvm/kvm_stat b/kvm/kvm_stat index c55bf88..b7bc846 100755 --- a/kvm/kvm_stat +++ b/kvm/kvm_stat @@ -295,7 +295,7 @@ if not os.access('/sys/kernel/debug/kvm', os.F_OK): print "and ensure the kvm modules are loaded" sys.exit(1) -label_width = 20 +label_width = 40 number_width = 10 def tui(screen, stats): -- 1.7.1 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 6/6] kvm_stat: be slower 2010-08-31 13:25 [PATCH 0/6] kvm_stat tracepoint support Avi Kivity ` (5 preceding siblings ...) 2010-08-31 13:25 ` [PATCH 5/6] kvm_stat: increase label width Avi Kivity @ 2010-08-31 13:25 ` Avi Kivity 6 siblings, 0 replies; 14+ messages in thread From: Avi Kivity @ 2010-08-31 13:25 UTC (permalink / raw) To: Marcelo Tosatti, kvm More information is displayed, so more time is need to process the information. Signed-off-by: Avi Kivity <avi@redhat.com> --- kvm/kvm_stat | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/kvm/kvm_stat b/kvm/kvm_stat index b7bc846..e68ca4e 100755 --- a/kvm/kvm_stat +++ b/kvm/kvm_stat @@ -327,7 +327,7 @@ def tui(screen, stats): while True: refresh() - curses.halfdelay(10) + curses.halfdelay(30) try: c = screen.getkey() if c == 'q': -- 1.7.1 ^ permalink raw reply related [flat|nested] 14+ messages in thread
end of thread, other threads:[~2010-09-01 7:32 UTC | newest] Thread overview: 14+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2010-08-31 13:25 [PATCH 0/6] kvm_stat tracepoint support Avi Kivity 2010-08-31 13:25 ` [PATCH 0/6] *** SUBJECT HERE *** Avi Kivity 2010-08-31 13:30 ` Avi Kivity 2010-08-31 14:43 ` Gerd Hoffmann 2010-08-31 16:10 ` Avi Kivity 2010-08-31 16:13 ` Anthony Liguori 2010-08-31 16:24 ` Avi Kivity 2010-09-01 7:32 ` Gerd Hoffmann 2010-08-31 13:25 ` [PATCH 1/6] kvm_stat: refactor to separate stats provider from difference engine Avi Kivity 2010-08-31 13:25 ` [PATCH 2/6] kvm_stat: implement tracepoint stats provider Avi Kivity 2010-08-31 13:25 ` [PATCH 3/6] kvm_stat: provide detailed kvm_exit:exit_reason display Avi Kivity 2010-08-31 13:25 ` [PATCH 4/6] kvm_stat: sort tui output according to highest occurence Avi Kivity 2010-08-31 13:25 ` [PATCH 5/6] kvm_stat: increase label width Avi Kivity 2010-08-31 13:25 ` [PATCH 6/6] kvm_stat: be slower Avi Kivity
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox