From mboxrd@z Thu Jan 1 00:00:00 1970 From: don Subject: Re: [PATCH v7 3/3] KVM: perf: kvm events analysis tool Date: Sun, 02 Sep 2012 21:51:14 +0800 Message-ID: <50436452.2010405@linux.vnet.ibm.com> References: <1346061106-5364-1-git-send-email-haodong@linux.vnet.ibm.com> <1346061106-5364-4-git-send-email-haodong@linux.vnet.ibm.com> <20120827155331.GA18224@turtle.usersys.redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: QUOTED-PRINTABLE Cc: avi@redhat.com, acme@infradead.org, mtosatti@redhat.com, mingo@elte.hu, xiaoguangrong@linux.vnet.ibm.com, linux-kernel@vger.kernel.org, kvm@vger.kernel.org, dsahern@gmail.com To: Andrew Jones Return-path: In-Reply-To: <20120827155331.GA18224@turtle.usersys.redhat.com> Sender: linux-kernel-owner@vger.kernel.org List-Id: kvm.vger.kernel.org =E4=BA=8E 2012=E5=B9=B408=E6=9C=8827=E6=97=A5 23:53, Andrew Jones =E5=86= =99=E9=81=93: > On Mon, Aug 27, 2012 at 05:51:46PM +0800, Dong Hao wrote: > > > >> +struct event_stats { >> + u64 count; >> + u64 time; >> + >> + /* used to calculate stddev. */ >> + double mean; >> + double M2; >> +}; > How about moving the stats functions from builtin-stat.c to e.g. > util/stats.c, and then reusing them? Then this struct (which I would > rename to kvm_event_stats) would look like this > > struct kvm_event_stats { > u64 time; > struct stats stats; > }; > > of course the get_event_ accessor generators would need tweaking > > > >> +static void update_event_stats(struct event_stats *stats, u64 time_= diff) >> +{ >> + double delta; >> + >> + stats->count++; >> + stats->time +=3D time_diff; >> + >> + delta =3D time_diff - stats->mean; >> + stats->mean +=3D delta / stats->count; >> + stats->M2 +=3D delta*(time_diff - stats->mean); >> +} > Reusing stats would allow this to become just > > static void update_event_stats(struct kvm_event_stats *stats, u64 tim= e_diff) > { > update_stats(&kvm_stats->stats, time_diff); > kvm_stats->time +=3D time_diff; > } > >> + >> +static double event_stats_stddev(int vcpu_id, struct kvm_event *eve= nt) >> +{ >> + struct event_stats *stats =3D &event->total; >> + double variance, variance_mean, stddev; >> + >> + if (vcpu_id !=3D -1) >> + stats =3D &event->vcpu[vcpu_id]; >> + >> + BUG_ON(!stats->count); >> + >> + variance =3D stats->M2 / (stats->count - 1); >> + variance_mean =3D variance / stats->count; >> + stddev =3D sqrt(variance_mean); >> + >> + return stddev * 100 / stats->mean; > This function's name implies it returns the stddev, but it returns th= e > relative stddev instead. Maybe rename it? This would be simplified > with code reuse too to basically just > > return stddev_stats(&kvm_stats->stats) * 100 / kvm_stats->stats.mean; > > Drew > Sorry for my late response, Andrew and thank you very much for your=20 comments. We will try to realize it in our next version. Thanks, Dong