From mboxrd@z Thu Jan 1 00:00:00 1970 From: Marcelo Tosatti Subject: Re: [PATCH] kvm_stat: always display non tracepoint based stats Date: Wed, 21 May 2014 09:27:44 -0300 Message-ID: <20140521122744.GB31090@amt.cnet> References: <1400669091-28394-1-git-send-email-pbonzini@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: kvm@vger.kernel.org To: Paolo Bonzini Return-path: Received: from mx1.redhat.com ([209.132.183.28]:2291 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752478AbaEUM2g (ORCPT ); Wed, 21 May 2014 08:28:36 -0400 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s4LCSYtC014056 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Wed, 21 May 2014 08:28:34 -0400 Content-Disposition: inline In-Reply-To: <1400669091-28394-1-git-send-email-pbonzini@redhat.com> Sender: kvm-owner@vger.kernel.org List-ID: On Wed, May 21, 2014 at 12:44:51PM +0200, Paolo Bonzini wrote: > The old stats contain information not available in the tracepoints. > > Inspired by a patch from Marcelo Tosatti. I avoided that because there is overlapping information. Now you report kvm_exit count twice, for example. > > Signed-off-by: Paolo Bonzini > --- > scripts/kvm/kvm_stat | 37 ++++++++++++++++++++----------------- > 1 file changed, 20 insertions(+), 17 deletions(-) > > diff --git a/scripts/kvm/kvm_stat b/scripts/kvm/kvm_stat > index 762544b..b97542f 100755 > --- a/scripts/kvm/kvm_stat > +++ b/scripts/kvm/kvm_stat > @@ -352,8 +352,8 @@ class TracepointProvider(object): > return ret > > class Stats: > - def __init__(self, provider, fields = None): > - self.provider = provider > + def __init__(self, providers, fields = None): > + self.providers = providers > self.fields_filter = fields > self._update() > def _update(self): > @@ -362,22 +362,25 @@ class Stats: > 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()) > + self.values = dict() > + for d in providers: > + provider_fields = [key for key in d.fields() if wanted(key)] > + for key in provider_fields: > + self.values[key] = None > + d.select(provider_fields) > 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) > + for d in providers: > + new = d.read() > + for key in d.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): > @@ -496,11 +499,11 @@ options.add_option('-f', '--fields', > (options, args) = options.parse_args(sys.argv) > > try: > - provider = TracepointProvider() > + providers = [TracepointProvider(), DebugfsProvider()] > except: > - provider = DebugfsProvider() > + providers = [DebugfsProvider()] > > -stats = Stats(provider, fields = options.fields) > +stats = Stats(providers, fields = options.fields) > > if options.log: > log(stats) > -- > 1.8.3.1