From patchwork Wed Nov 14 01:37:26 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yoshihiro YUNOMAE X-Patchwork-Id: 1737211 Return-Path: X-Original-To: patchwork-kvm@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork1.kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by patchwork1.kernel.org (Postfix) with ESMTP id DCD0A3FCAE for ; Wed, 14 Nov 2012 01:40:44 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932254Ab2KNBk2 (ORCPT ); Tue, 13 Nov 2012 20:40:28 -0500 Received: from mailxx.hitachi.co.jp ([133.145.228.50]:53278 "EHLO mailxx.hitachi.co.jp" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756123Ab2KNBk0 (ORCPT ); Tue, 13 Nov 2012 20:40:26 -0500 Received: from mail7.hitachi.co.jp by mailxx.hitachi.co.jp (8.9.3p3/3.7W-mailx) id KAA27820; Wed, 14 Nov 2012 10:40:25 +0900 Received: from mlsv3.hitachi.co.jp (unknown [133.144.234.166]) by mail7.hitachi.co.jp (Postfix) with ESMTP id 2E2B637ACA; Wed, 14 Nov 2012 10:38:15 +0900 (JST) Received: from mfilter06.hitachi.co.jp by mlsv3.hitachi.co.jp (8.13.1/8.13.1) id qAE1cFEJ016248; Wed, 14 Nov 2012 10:38:15 +0900 Received: from vshuts01.hitachi.co.jp (vshuts01.hitachi.co.jp [10.201.6.83]) by mfilter06.hitachi.co.jp (Switch-3.3.4/Switch-3.3.4) with ESMTP id qAE1cDXD006998; Wed, 14 Nov 2012 10:38:14 +0900 Received: from vshuts2.hitachi.co.jp (unknown [10.201.6.71]) by vshuts01.hitachi.co.jp (Postfix) with ESMTP id A11FD2F00A7; Wed, 14 Nov 2012 10:38:13 +0900 (JST) X-AuditID: b753bd60-94fe2ba000004744-48-50a2f60546b9 Received: from hsdlmain.sdl.hitachi.co.jp (unknown [133.144.14.194]) by vshuts2.hitachi.co.jp (Symantec Mail Security) with ESMTP id 5FF0F8B03A1; Wed, 14 Nov 2012 10:38:13 +0900 (JST) Received: from hsdlvgate2.sdl.hitachi.co.jp by hsdlmain.sdl.hitachi.co.jp (8.13.8/3.7W11021512) id qAE1cD9e005844; Wed, 14 Nov 2012 10:38:13 +0900 X-AuditID: b753bd60-94fe2ba000004744-48-50a2f60546b9 Received: from sdl99w.sdl.hitachi.co.jp (sdl99w.sdl.hitachi.co.jp [133.144.14.250]) by hsdlvgate2.sdl.hitachi.co.jp (Symantec Mail Security) with ESMTP id E4B7128F0AE; Wed, 14 Nov 2012 10:38:12 +0900 (JST) Received: from maild.sdl.hitachi.co.jp (sdl99d.sdl.hitachi.co.jp [133.144.14.199]) by sdl99w.sdl.hitachi.co.jp (Postfix) with ESMTP id AB99953C158; Wed, 14 Nov 2012 10:38:15 +0900 (JST) Received: from [192.168.16.191] (unknown [10.227.55.82]) by maild.sdl.hitachi.co.jp (Postfix) with ESMTP id 8ED6B495B7F; Wed, 14 Nov 2012 10:38:12 +0900 (JST) Subject: [RFC PATCH 2/2] tools: Add a tool for merging trace data of a guest and a host To: linux-kernel@vger.kernel.org From: Yoshihiro YUNOMAE Cc: "H. Peter Anvin" , kvm@vger.kernel.org, Joerg Roedel , David Sharp , Marcelo Tosatti , Steven Rostedt , Hidehiro Kawai , Ingo Molnar , Avi Kivity , yrl.pp-manager.tt@hitachi.com, Masami Hiramatsu , Thomas Gleixner Date: Wed, 14 Nov 2012 10:37:26 +0900 Message-ID: <20121114013716.5338.37763.stgit@yunodevel> In-Reply-To: <20121114013611.5338.15086.stgit@yunodevel> References: <20121114013611.5338.15086.stgit@yunodevel> User-Agent: StGit/0.16 MIME-Version: 1.0 X-Brightmail-Tracker: AAAAAA== Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org This tool merges trace data of a guest and a host in chronological order. Note that this tool is used only for a guest and a host. (not for multiple guests) - How to use 1. Get trace data of the host and guest via ssh, virtio-serial, or virtio-trace 2. Get TSC offset after applied patch "kvm/vmx: Print TSC_OFFSET information when TSC offset value is written to VMCS" $ dmesg | grep kvm [ 57.717180] kvm: ([PID]) write TSC offset [TSC offset], now clock [HOST TSC] 3. Use this tool $ ./trace-merge.pl h qemu-kvm-2687 [003] d...50550079203669: kvm_exit: [detail] h qemu-kvm-2687 [003] d...50550079206816: kvm_entry: [detail] g comm-3826 [000] d.h.50550079226331: sched_wakeup: [detail] h qemu-kvm-2687 [003] d...50550079240656: kvm_exit: [detail] h qemu-kvm-2687 [003] d...50550079243467: kvm_entry: [detail] h qemu-kvm-2687 [003] d...50550079256103: kvm_exit: [detail] h qemu-kvm-2687 [003] d...50550079268391: kvm_entry: [detail] g comm-3826 [000] d...50550079279266: sched_switch: [detail] h qemu-kvm-2687 [003] d...50550079280829: kvm_exit: [detail] h qemu-kvm-2687 [003] d...50550079286028: kvm_entry: [detail] | \----guest/host Signed-off-by: Yoshihiro YUNOMAE --- tools/scripts/trace-merge/trace-merge.pl | 109 ++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100755 tools/scripts/trace-merge/trace-merge.pl -- 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 diff --git a/tools/scripts/trace-merge/trace-merge.pl b/tools/scripts/trace-merge/trace-merge.pl new file mode 100755 index 0000000..e0b080c --- /dev/null +++ b/tools/scripts/trace-merge/trace-merge.pl @@ -0,0 +1,109 @@ +#!/usr/bin/perl +# +# Tool for merging and sorting trace data of a guest and host +# +# Created by Yoshihiro YUNOMAE +# +# - How to use +# ./trace-merge.pl +# +use strict; +use bigint; + +my %all_data_info = (); +my @merged_data = (); +my @sorted_data = (); + +&read_all_data(); +&merge_guest_host_data(); +&sort_data_by_tsc(); +&output_data(); + +sub read_all_data { + # TSC offset value is very big ull value. + # This value is actually negative, so we calculate the value here. + $all_data_info{"tsc_offset"} = &convert_tscoffset($ARGV[0]); + if ($all_data_info{"tsc_offset"} == 0) { + die "TSC should not be 0"; + } + + if (!open(HOST_DATA, $ARGV[1])) { + die "Cannot open host file: $!" + } + my @host_data = ; + close(HOST_DATA); + + if (!open(GUEST_DATA, $ARGV[2])) { + die "Cannot open guest file: $!" + } + my @guest_data = ; + close(GUEST_DATA); + + $all_data_info{"host_data"} = \@host_data; + $all_data_info{"guest_data"} = \@guest_data; +} + +sub merge_guest_host_data { + &guest_push_data(); + &host_push_data(); +} + +sub sort_data_by_tsc { + no strict 'refs'; + @sorted_data = sort {$a->{tsc} <=> $b->{tsc}} @merged_data; +} + +sub output_data { + foreach my $line (@sorted_data) { + print "$line->{name}$line->{comm}$line->{tsc}$line->{event}\n"; + } +} + +sub guest_push_data { + &make_data_list(1); +} + +sub host_push_data { + &make_data_list(0); +} + +# +# If this function is used for guest's data, +# subtract TSC offset from guest's TSC value. +# +# NOTE: guest's TSC is added TSC offset to actual TSC when the guest boots. +# +sub make_data_list { + my $is_guest = $_[0]; + my @data = (); + my $name = ""; + my $list = ""; + my $tsc_offset = 0; + + if ($is_guest eq 1) { + $name = "g"; + @data = @{$all_data_info{"guest_data"}}; + $tsc_offset = $all_data_info{"tsc_offset"}; + } else { + $name = "h"; + @data = @{$all_data_info{"host_data"}}; + } + + foreach my $line (@data) { + chomp($line); + + if ($line =~ /^(.+\[[0-9]+\].{5})([0-9]+)(:.+)/) { + $list = { + name => $name, + comm => $1, + tsc => $2 - $tsc_offset, + event => $3 + }; + push(@merged_data, $list); + } + } +} + +sub convert_tscoffset { + return $_[0] - (1 << 64); +}