[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH] xentrace: add a tool to break down the result of vmexit
From: Yang Zhang <yang.z.zhang@xxxxxxxxx> The tool is able to provide a summary of vmexit. Currently, it only supports to summay one VCPU result at a time. For example: xentrace -D -T 10 -e 0x8f000 trace.dat cat trace.dat | xentrace_format formats > trace.log 1. If the guest only has one vcpu, then you can run: cat trace.log | perl analyze.pl 2. If the guest has more than one vcpus, you should pin the VCPU before dump trace result. Then use the follow command to get the result separately. cat trace.log | grep CPUn | perl analyze.pl Here is an example of output: Start record TSC: 3450116314185050 End record TSC: 3450118790633050 TSC Offset: 2476448000 (1.03s) VMExit TSC: 1787465188 TSC Ratio: 0.72 VMExit Count: 57802 Type Total TSC TSC Ratio Total Count Count Ratio Avg TSC NMI or Exception 10167 0.00 2 0.00 5083 External Interrupt 2371685 0.00 156 0.00 15203 Halt 1578760226 0.88 1003 0.02 1574038 RDTSC 137125388 0.08 51150 0.88 2680 I/O Instruction 4386099 0.00 28 0.00 156646 WRMSR 53299084 0.03 4247 0.07 12549 Virtualized EOI 4557005 0.00 1180 0.02 3861 EPT violation 6955534 0.00 36 0.00 193209 PF_XEN: counts:0 TSC:0 TSC ratio of NMI/Exception=0.00 PAGE_FAULT_CODE details: CODE TSC Count TSC ratio Average TSC Guest fault details: Total TSC counts Average TSC No device details: Total TSC counts Average TSC Interrupt details: vector counts count ratio TSC TSC ratio Average TSC IO details: IO read: port counts IO write: port counts Signed-off-by: Yang Zhang <yang.z.zhang@xxxxxxxxx> --- tools/xentrace/analyze.pl | 527 +++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 527 insertions(+), 0 deletions(-) create mode 100755 tools/xentrace/analyze.pl diff --git a/tools/xentrace/analyze.pl b/tools/xentrace/analyze.pl new file mode 100755 index 0000000..e2c6d3c --- /dev/null +++ b/tools/xentrace/analyze.pl @@ -0,0 +1,527 @@ +#!/usr/bin/perl + +# Copyright Xingchang Jiang <xingchang.jiang@xxxxxxxxx>. GPL. +# Perform IA-32 xentrace raw data analysis +# Many thanks to Yang Xiaowei's review <xiaowei.yang@xxxxxxxxx> +# Refined by Yang Zhang <yang.z.zhang@xxxxxxxxx> + +my @VM_ENTYR; +my @VM_SUB; +my @XEN_ERROR; +my @GUEST_ERROR; +my @left; +my @VECTOR; + +my $cpuid; +my $tsc; +my $diff; +my $flag; +my $starttsc; +my $endtsc; +my $tscdiff; +my $totaltsc; +my $total_count; +my $generate_table; +my $sub_table; +my $exit_flag; +my $startcpuid; +my $endcpuid; +my $typeid; +my $errorcode; +my $vector; +my $subtypeid; +my $useless; +my $start; +my $end; +my $startlag; + +my $freq = 2393918000; + +$VM_ENTRY[0] = ["NMI or Exception"]; +$VM_ENTRY[1] = ["External Interrupt"]; +$VM_ENTRY[2] = ["Triple fault"]; +$VM_ENTRY[3] = ["Init signal"]; +$VM_ENTRY[4] = ["Startup IPI"]; +$VM_ENTRY[5] = ["I/O SMI"]; +$VM_ENTRY[6] = ["Other SMI"]; +$VM_ENTRY[7] = ["Interrupt window"]; +$VM_ENTRY[8] = ["nmi window"]; +$VM_ENTRY[9] = ["Task Switch"]; +$VM_ENTRY[10] = ["CPUID"]; +$VM_ENTRY[11] = ["getsec"]; +$VM_ENTRY[12] = ["Halt"]; +$VM_ENTRY[13] = ["INVD"]; +$VM_ENTRY[14] = ["INVLPG"]; +$VM_ENTRY[15] = ["RDPMC"]; +$VM_ENTRY[16] = ["RDTSC"]; +$VM_ENTRY[17] = ["RSM"]; +$VM_ENTRY[18] = ["VMCALL"]; +$VM_ENTRY[19] = ["VMCLEAR"]; +$VM_ENTRY[20] = ["VMLAUNCH"]; +$VM_ENTRY[21] = ["VMPTRLD"]; +$VM_ENTRY[22] = ["VMPTRST"]; +$VM_ENTRY[23] = ["VMREAD"]; +$VM_ENTRY[24] = ["VMRESUME"]; +$VM_ENTRY[25] = ["VMWRITE"]; +$VM_ENTRY[26] = ["VMXOFF"]; +$VM_ENTRY[27] = ["VMXON"]; +$VM_ENTRY[28] = ["CR access"]; +$VM_ENTRY[29] = ["MOV DR"]; +$VM_ENTRY[30] = ["I/O Instruction"]; +$VM_ENTRY[31] = ["RDMSR"]; +$VM_ENTRY[32] = ["WRMSR"]; +$VM_ENTRY[33] = ["VM-entry failure due to invalid guest state"]; +$VM_ENTRY[34] = ["VM-entry failure due to MSR loading"]; +$VM_ENTRY[35] = ["UNKNOWN 35"]; +$VM_ENTRY[36] = ["MWAIT"]; +$VM_ENTRY[37] = ["monitor trap"]; +$VM_ENTRY[38] = ["UNKNOWN 38"]; +$VM_ENTRY[39] = ["MONITOR"]; +$VM_ENTRY[40] = ["PAUSE"]; +$VM_ENTRY[41] = ["VM-entry failure due to machine check"]; +$VM_ENTRY[42] = ["UNKNOWN 42"]; +$VM_ENTRY[43] = ["TPR below threshold"]; +$VM_ENTRY[44] = ["APIC ACCESS"]; +$VM_ENTRY[45] = ["Virtualized EOI"]; +$VM_ENTRY[46] = ["Access GDTR/IDTR"]; +$VM_ENTRY[47] = ["Access LDTR/TR"]; +$VM_ENTRY[48] = ["EPT violation"]; +$VM_ENTRY[49] = ["EPT misconfiguration"]; +$VM_ENTRY[50] = ["invept"]; +$VM_ENTRY[51] = ["rdtscp"]; +$VM_ENTRY[52] = ["vmx-preemption timer expired"]; +$VM_ENTRY[53] = ["invvpid"]; +$VM_ENTRY[54] = ["wbinvd"]; +$VM_ENTRY[55] = ["xsetbv"]; +$VM_ENTRY[56] = ["APIC write"]; +$VM_ENTRY[57] = ["rdrand"]; +$VM_ENTRY[58] = ["invpcid"]; +$VM_ENTRY[59] = ["vmfunc"]; + + +$VM_SUB[0] = ["PF_XEN"]; +$VM_SUB[1] = ["PF_INJECT"]; +$VM_SUB[2] = ["INJ_EXC"]; +$VM_SUB[3] = ["INJ_VIRQ"]; +$VM_SUB[4] = ["REINJ_VIRQ"]; +$VM_SUB[5] = ["IO_READ"]; +$VM_SUB[6] = ["IO_WRITE"]; +$VM_SUB[7] = ["CR_READ"]; +$VM_SUB[8] = ["CR_WRITE"]; +$VM_SUB[9] = ["DR_READ"]; +$VM_SUB[10] = ["DR_WRITE"]; +$VM_SUB[11] = ["MSR_READ"]; +$VM_SUB[12] = ["MSR_WRITE"]; +$VM_SUB[13] = ["CPUID"]; +$VM_SUB[14] = ["INTR"]; +$VM_SUB[15] = ["NMI"]; +$VM_SUB[16] = ["SMI"]; +$VM_SUB[17] = ["VMMCALL"]; +$VM_SUB[18] = ["HLT"]; +$VM_SUB[19] = ["INVLPG"]; +$VM_SUB[20] = ["NODEVICE"]; +$VM_SUB[21] = ["GUEST_FAULT"]; + +my $SHADOW_FAULT_count = 0; +my $SHADOW_FAULT_totaltime = 0; +#Error code of PAGE_FAULT +# +#THE FAULT WAS CAUSED BY A NOT-PRESENT PAGE. +#THE ACCESS CAUSING THE FAULT WAS A READ. +#THE ACCESS CAUSING THE FAULT ORIGINATED WHEN THE +#PROCESSOR WAS EXECUTING IN SUPERVISOR MODE. +my $PAGE_FAULT_ERROR_CODE0_count = 0; +my $PAGE_FAULT_ERROR_CODE0_totaltime = 0; +#THE FAULT WAS CAUSED BY A PAGE-LEVEL PROTECTION VIOLATION. +#THE ACCESS CAUSING THE FAULT WAS A READ. +#THE ACCESS CAUSING THE FAULT ORIGINATED WHEN THE +#PROCESSOR WAS EXECUTING IN SUPERVISOR MODE. +my $PAGE_FAULT_ERROR_CODE1_count = 0; +my $PAGE_FAULT_ERROR_CODE1_totaltime = 0; +#THE FAULT WAS CAUSED BY A NOT-PRESENT PAGE. +#THE ACCESS CAUSING THE FAULT WAS A WRITE. +#THE ACCESS CAUSING THE FAULT ORIGINATED WHEN THE +#PROCESSOR WAS EXECUTING IN SUPERVISOR MODE. +my $PAGE_FAULT_ERROR_CODE2_count = 0; +my $PAGE_FAULT_ERROR_CODE2_totaltime = 0; +#THE FAULT WAS CAUSED BY A PAGE-LEVEL PROTECTION VIOLATION. +#THE ACCESS CAUSING THE FAULT WAS A WRITE. +#THE ACCESS CAUSING THE FAULT ORIGINATED WHEN THE +#PROCESSOR WAS EXECUTING IN USER MODE. +my $PAGE_FAULT_ERROR_CODE3_count = 0; +my $PAGE_FAULT_ERROR_CODE3_totaltime = 0; +#THE FAULT WAS CAUSED BY A NOT-PRESENT PAGE. +#THE ACCESS CAUSING THE FAULT WAS A READ. +#THE ACCESS CAUSING THE FAULT ORIGINATED WHEN THE +#PROCESSOR WAS EXECUTING IN USER MODE. +my $PAGE_FAULT_ERROR_CODE4_count = 0; +my $PAGE_FAULT_ERROR_CODE4_totaltime = 0; +#THE FAULT WAS CAUSED BY A PAGE-LEVEL PROTECTION VIOLATION. +#THE ACCESS CAUSING THE FAULT WAS A READ. +#THE ACCESS CAUSING THE FAULT ORIGINATED WHEN THE +#PROCESSOR WAS EXECUTING IN USER MODE. +my $PAGE_FAULT_ERROR_CODE5_count = 0; +my $PAGE_FAULT_ERROR_CODE5_totaltime = 0; +#THE FAULT WAS CAUSED BY A NOT-PRESENT PAGE. +#THE ACCESS CAUSING THE FAULT WAS A WRITE. +#THE ACCESS CAUSING THE FAULT ORIGINATED WHEN THE +#PROCESSOR WAS EXECUTING IN USER MODE. +my $PAGE_FAULT_ERROR_CODE6_count = 0; +my $PAGE_FAULT_ERROR_CODE6_totaltime = 0; +#THE FAULT WAS CAUSED BY A PAGE-LEVEL PROTECTION VIOLATION. +#THE ACCESS CAUSING THE FAULT WAS A WRITE. +#THE ACCESS CAUSING THE FAULT ORIGINATED WHEN THE +#PROCESSOR WAS EXECUTING IN USER MODE. +my $PAGE_FAULT_ERROR_CODE7_count = 0; +my $PAGE_FAULT_ERROR_CODE7_totaltime = 0; + +my $PAGE_FAULT_ERROR_CODE8_count = 0; +my $PAGE_FAULT_ERROR_CODE8_totaltime = 0; + +my $PAGE_FAULT_ERROR_CODE9_count = 0; +my $PAGE_FAULT_ERROR_CODE9_totaltime = 0; + +my $PAGE_FAULT_ERROR_CODE10_count = 0; +my $PAGE_FAULT_ERROR_CODE10_totaltime = 0; + +my $PAGE_FAULT_ERROR_CODE11_count = 0; +my $PAGE_FAULT_ERROR_CODE11_totaltime = 0; + +my $PAGE_FAULT_ERROR_CODE12_count = 0; +my $PAGE_FAULT_ERROR_CODE12_totaltime = 0; + +my $PAGE_FAULT_ERROR_CODE13_count = 0; +my $PAGE_FAULT_ERROR_CODE13_totaltime = 0; + +my $PAGE_FAULT_ERROR_CODE14_count = 0; +my $PAGE_FAULT_ERROR_CODE14_totaltime = 0; + +my $PAGE_FAULT_ERROR_CODE15_count = 0; +my $PAGE_FAULT_ERROR_CODE15_totaltime = 0; + +#other cases +my $PAGE_FAULT_ERROR_CODE16_count = 0; +my $PAGE_FAULT_ERROR_CODE16_totaltime = 0; + + +for ($i=0;$i<256;$i++){ + $VECTOR[$i]->[0]=$i; +} + +$generate_table = undef; +$exit_flag = 0; +$startflag = 0; +$errorcode = -1; +$port = -1; +$intr = 0; + +$sub_table = $VM_SUB[5]; +for($i=0;$i<65536;$i++) +{ + $sub_table->[$i] = 0; +} + +$sub_table = $VM_SUB[6]; +for($i=0;$i<65536;$i++) +{ + $sub_table->[$i] = 0; +} + +while ( <> ) { + chomp; + ($cpuid, $tsc, $diff, $useless, $flag, @left) = split /\s+/; + if ($flag eq "VMENTRY") { + next if($exit_flag != 1); + $exit_flag = 0; + + $endtsc = $tsc; + $end = $tsc; + $tscdiff = $endtsc - $starttsc; + $totaltsc += $tscdiff; + $totalcount += 1; + $generate_table->[1] += $tscdiff; + $generate_table->[2] += 1; + + next if(! defined $sub_table); + + if($intr == 1) { + $sub_table->[1] += $tscdiff; + $sub_table->[2] += 1; + $intr = 0; + } + elsif($errorcode >= 0) { + $sub_table->[1] += $tscdiff; + $sub_table->[2] += 1; + update_errorcode($errorcode,$tscdiff); + $errorcode = -1; + } + elsif($port != -1) { + $sub_table->[$port] += 1; + $port = -1; + } + else { + $sub_table->[1] += $tscdiff; + $sub_table->[2] += 1; + } + } + # If there are lost records, restart from next VMEXIT + elsif ($flag eq "lost_records") { + printf("lost_records...\n"); + $exit_flag = 0; + } + elsif ($flag eq "VMEXIT") { + $typeid = get_typeid(\@left); + $generate_table = $VM_ENTRY[$typeid]; + $starttsc = $tsc; + $exit_flag = 1; + $sub_table = undef; + if ($startflag == 0) { + $start = $tsc; + $startflag = 1; + } + } + elsif ($flag eq "PF_XEN") { + $sub_table = $VM_SUB[0]; + $errorcode = get_errorcode(\@left); + } + elsif ($flag eq "INTR") { + $vector = get_vector(\@left); + $sub_table = $VECTOR[$vector]; + $intr = 1; + } + elsif ($flag eq "IO_READ") { + $port = get_port(\@left); + $sub_table = $VM_SUB[5]; + } + elsif ($flag eq "IO_WRITE") { + $port = get_port(\@left); + $sub_table = $VM_SUB[6]; + } + elsif ($flag eq "NODEVICE") { + $sub_table = $VM_SUB[20]; + } + elsif ($flag eq "GUEST_FAULT") { + $sub_table = $VM_SUB[21]; + } +} + +&generate_report; + +sub generate_report { + my $i; + printf("Start record TSC: %d\nEnd record TSC: %d\nTSC Offset: %d (%.2fs)\n\n",$start,$end,$end-$start,($end-$start)/$freq); + printf("VMExit TSC: %d\nTSC Ratio: %.2f\n\nVMExit Count: %d\n", $totaltsc, ($totaltsc/($end-$start)),$totalcount); + printf("%20s%15s%15s%15s%15s%15s\n","Type","Total TSC","TSC Ratio","Total Count","Count Ratio","Avg TSC"); + for ($i=0; $i<50; $i++) { + $generate_table=$VM_ENTRY[$i]; + + next if ($generate_table->[0] eq ""); + next if ($generate_table->[2] == 0); + if (defined $generate_table->[2]) { + printf("%20s%15d%15.2f%15d%15.2f%15d\n", $generate_table->[0], $generate_table->[1], $generate_table->[1]/$totaltsc, $generate_table->[2], $generate_table->[2]/$totalcount, $generate_table->[1]/$generate_table->[2]); + } + else { + printf("%20s%15d%15.2f%15d%15.2f%15d\n", $generate_table->[0], $generate_table->[1], $generate_table->[1]/$totaltsc, $generate_table->[2], $generate_table->[2]/$totalcount, 0); + } + } + + $generate_table = $VM_ENTRY[0]; + $sub_table = $VM_SUB[0]; + if ($generate_table->[1] !=0) { + printf("\n\nPF_XEN:\ncounts:%d\t\tTSC:%d\t\tTSC ratio of NMI/Exception=%.2f\n",$sub_table->[2],$sub_table->[1],$sub_table->[1]/$generate_table->[1]); + } + + printf("PAGE_FAULT_CODE details:\n"); + printf("CODE\t\tTSC\tCount\tTSC ratio\tAverage TSC\n"); + if($PAGE_FAULT_ERROR_CODE0_count != 0){ + printf("0: \t%10d\t%6d\t%6.2f\t%15d\n",$PAGE_FAULT_ERROR_CODE0_totaltime,$PAGE_FAULT_ERROR_CODE0_count,$PAGE_FAULT_ERROR_CODE0_totaltime/$SHADOW_FAULT_totaltime,$PAGE_FAULT_ERROR_CODE0_totaltime/$PAGE_FAULT_ERROR_CODE0_count); + } + if($PAGE_FAULT_ERROR_CODE1_count != 0){ + printf("1: \t%10d\t%6d\t%6.2f\t%15d\n",$PAGE_FAULT_ERROR_CODE1_totaltime,$PAGE_FAULT_ERROR_CODE1_count,$PAGE_FAULT_ERROR_CODE1_totaltime/$SHADOW_FAULT_totaltime,$PAGE_FAULT_ERROR_CODE1_totaltime/$PAGE_FAULT_ERROR_CODE1_count); + } + if($PAGE_FAULT_ERROR_CODE2_count != 0){ + printf("2: \t%10d\t%6d\t%6.2f\t%15d\n",$PAGE_FAULT_ERROR_CODE2_totaltime,$PAGE_FAULT_ERROR_CODE2_count,$PAGE_FAULT_ERROR_CODE2_totaltime/$SHADOW_FAULT_totaltime,$PAGE_FAULT_ERROR_CODE2_totaltime/$PAGE_FAULT_ERROR_CODE2_count); + } + if($PAGE_FAULT_ERROR_CODE3_count != 0){ + printf("3: \t%10d\t%6d\t%6.2f\t%15d\n",$PAGE_FAULT_ERROR_CODE3_totaltime,$PAGE_FAULT_ERROR_CODE3_count,$PAGE_FAULT_ERROR_CODE3_totaltime/$SHADOW_FAULT_totaltime,$PAGE_FAULT_ERROR_CODE3_totaltime/$PAGE_FAULT_ERROR_CODE3_count); + } + if($PAGE_FAULT_ERROR_CODE4_count != 0){ + printf("4: \t%10d\t%6d\t%6.2f\t%15d\n",$PAGE_FAULT_ERROR_CODE4_totaltime,$PAGE_FAULT_ERROR_CODE4_count,$PAGE_FAULT_ERROR_CODE4_totaltime/$SHADOW_FAULT_totaltime,$PAGE_FAULT_ERROR_CODE4_totaltime/$PAGE_FAULT_ERROR_CODE4_count); + } + if($PAGE_FAULT_ERROR_CODE5_count != 0){ + printf("5: \t%10d\t%6d\t%6.2f\t%15d\n",$PAGE_FAULT_ERROR_CODE5_totaltime,$PAGE_FAULT_ERROR_CODE5_count,$PAGE_FAULT_ERROR_CODE5_totaltime/$SHADOW_FAULT_totaltime,$PAGE_FAULT_ERROR_CODE5_totaltime/$PAGE_FAULT_ERROR_CODE5_count); + } + if($PAGE_FAULT_ERROR_CODE6_count != 0){ + printf("6: \t%10d\t%6d\t%6.2f\t%15d\n",$PAGE_FAULT_ERROR_CODE6_totaltime,$PAGE_FAULT_ERROR_CODE6_count,$PAGE_FAULT_ERROR_CODE6_totaltime/$SHADOW_FAULT_totaltime,$PAGE_FAULT_ERROR_CODE6_totaltime/$PAGE_FAULT_ERROR_CODE6_count); + } + if($PAGE_FAULT_ERROR_CODE7_count != 0){ + printf("7: \t%10d\t%6d\t%6.2f\t%15d\n",$PAGE_FAULT_ERROR_CODE7_totaltime,$PAGE_FAULT_ERROR_CODE7_count,$PAGE_FAULT_ERROR_CODE7_totaltime/$SHADOW_FAULT_totaltime,$PAGE_FAULT_ERROR_CODE7_totaltime/$PAGE_FAULT_ERROR_CODE7_count); + } + if($PAGE_FAULT_ERROR_CODE8_count != 0){ + printf("8: \t%10d\t%6d\t%6.2f\t%15d\n",$PAGE_FAULT_ERROR_CODE8_totaltime,$PAGE_FAULT_ERROR_CODE8_count,$PAGE_FAULT_ERROR_CODE8_totaltime/$SHADOW_FAULT_totaltime,$PAGE_FAULT_ERROR_CODE8_totaltime/$PAGE_FAULT_ERROR_CODE8_count); + } + if($PAGE_FAULT_ERROR_CODE9_count != 0){ + printf("9: \t%10d\t%6d\t%6.2f\t%15d\n",$PAGE_FAULT_ERROR_CODE9_totaltime,$PAGE_FAULT_ERROR_CODE9_count,$PAGE_FAULT_ERROR_CODE9_totaltime/$SHADOW_FAULT_totaltime,$PAGE_FAULT_ERROR_CODE9_totaltime/$PAGE_FAULT_ERROR_CODE9_count); + } + if($PAGE_FAULT_ERROR_CODE10_count != 0){ + printf("10: \t%10d\t%6d\t%6.2f\t%15d\n",$PAGE_FAULT_ERROR_CODE10_totaltime,$PAGE_FAULT_ERROR_CODE10_count,$PAGE_FAULT_ERROR_CODE10_totaltime/$SHADOW_FAULT_totaltime,$PAGE_FAULT_ERROR_CODE10_totaltime/$PAGE_FAULT_ERROR_CODE10_count); + } + if($PAGE_FAULT_ERROR_CODE11_count != 0){ + printf("11: \t%10d\t%6d\t%6.2f\t%15d\n",$PAGE_FAULT_ERROR_CODE11_totaltime,$PAGE_FAULT_ERROR_CODE11_count,$PAGE_FAULT_ERROR_CODE11_totaltime/$SHADOW_FAULT_totaltime,$PAGE_FAULT_ERROR_CODE11_totaltime/$PAGE_FAULT_ERROR_CODE11_count); + } + if($PAGE_FAULT_ERROR_CODE12_count != 0){ + printf("12: \t%10d\t%6d\t%6.2f\t%15d\n",$PAGE_FAULT_ERROR_CODE12_totaltime,$PAGE_FAULT_ERROR_CODE12_count,$PAGE_FAULT_ERROR_CODE12_totaltime/$SHADOW_FAULT_totaltime,$PAGE_FAULT_ERROR_CODE12_totaltime/$PAGE_FAULT_ERROR_CODE12_count); + } + if($PAGE_FAULT_ERROR_CODE13_count != 0){ + printf("13: \t%10d\t%6d\t%6.2f\t%15d\n",$PAGE_FAULT_ERROR_CODE13_totaltime,$PAGE_FAULT_ERROR_CODE13_count,$PAGE_FAULT_ERROR_CODE13_totaltime/$SHADOW_FAULT_totaltime,$PAGE_FAULT_ERROR_CODE13_totaltime/$PAGE_FAULT_ERROR_CODE13_count); + } + if($PAGE_FAULT_ERROR_CODE14_count != 0){ + printf("14: \t%10d\t%6d\t%6.2f\t%15d\n",$PAGE_FAULT_ERROR_CODE14_totaltime,$PAGE_FAULT_ERROR_CODE14_count,$PAGE_FAULT_ERROR_CODE14_totaltime/$SHADOW_FAULT_totaltime,$PAGE_FAULT_ERROR_CODE14_totaltime/$PAGE_FAULT_ERROR_CODE14_count); + } + if($PAGE_FAULT_ERROR_CODE15_count != 0){ + printf("15: \t%10d\t%6d\t%6.2f\t%15d\n",$PAGE_FAULT_ERROR_CODE15_totaltime,$PAGE_FAULT_ERROR_CODE15_count,$PAGE_FAULT_ERROR_CODE15_totaltime/$SHADOW_FAULT_totaltime,$PAGE_FAULT_ERROR_CODE15_totaltime/$PAGE_FAULT_ERROR_CODE15_count); + } + if($PAGE_FAULT_ERROR_CODE16_count != 0){ + printf("Others: \t%10d\t%6d\t%6.2f\t%15d\n",$PAGE_FAULT_ERROR_CODE16_totaltime,$PAGE_FAULT_ERROR_CODE16_count,$PAGE_FAULT_ERROR_CODE16_totaltime/$SHADOW_FAULT_totaltime,$PAGE_FAULT_ERROR_CODE16_totaltime/$PAGE_FAULT_ERROR_CODE16_count); + } + + printf("\n\nGuest fault details:\n"); + printf("Total TSC\tcounts\tAverage TSC\n"); + $sub_table = $VM_SUB[21]; + if ($sub_table->[2] != 0) { + printf("%10d\t%6d\t%15d\n", $sub_table->[1], $sub_table->[2], $sub_table->[1]/$sub_table->[2]); + } + + printf("\n\nNo device details:\n"); + printf("Total TSC\tcounts\tAverage TSC\n"); + $sub_table = $VM_SUB[20]; + if ($sub_table->[2] != 0) { + printf("%10d\t%6d\t%15d\n", $sub_table->[1], $sub_table->[2], $sub_table->[1]/$sub_table->[2]); + } + + printf("\n\nInterrupt details:\n"); + printf("vector\tcounts\tcount ratio\tTSC\tTSC ratio\tAverage TSC\n"); + $generate_table = $VM_ENTRY[1]; + for($i=0;$i<256;$i++){ + $sub_table = $VECTOR[$i]; + next if ($sub_table->[2] eq undef); + printf("#0x%x\t%5d\t%5.2f\t%10d\t%5.2f\t%15d\n",$sub_table->[0],$sub_table->[2],$sub_table->[2]/$generate_table->[2],$sub_table->[1],$sub_table->[1]/$generate_table->[1],$sub_table->[1]/$sub_table->[2]); + } + printf("\n\nIO details:\n"); + printf("IO read:\n"); + printf("port\tcounts\n"); + $sub_table = $VM_SUB[5]; + for($i=0;$i<65536;$i++){ + next if($sub_table->[$i] eq 0); + printf("0x%x\t%d\n",$i,$sub_table->[$i]); + } + printf("\nIO write:\n"); + printf("port\tcounts\n"); + $sub_table = $VM_SUB[6]; + for($i=0;$i<65536;$i++){ + next if($sub_table->[$i] eq 0); + printf("0x%x\t%d\n",$i,$sub_table->[$i]); + } +} + +sub get_typeid { + my ($temp1, $temp2) = split /exitcode\ \=\ /, "@{$_[0]}"; + ($temp1) = split /\ /, $temp2; + return hex $temp1; +} + +sub get_errorcode{ + my ($temp1, $temp2) = split /errorcode\ \=\ /, "@{$_[0]}"; + ($temp1) = split /\ /, $temp2; + return hex $temp1; +} + +sub get_vector{ + my ($temp1, $temp2) = split /vector\ \=\ /,"@{$_[0]}"; + ($temp1) = split /\ /, $temp2; + return hex $temp1; +} + +sub get_port{ + my ($temp1, $temp2) = split /port\ \=\ /,"@{$_[0]}"; + ($temp1) = split /\,/, $temp2; + return hex $temp1; +} + + +sub update_errorcode{ + my $code = $_[0]; + my $time = $_[1]; + + $SHADOW_FAULT_count += 1; + $SHADOW_FAULT_totaltime += $time; + + if($code eq 0){ + $PAGE_FAULT_ERROR_CODE0_count += 1; + $PAGE_FAULT_ERROR_CODE0_totaltime += $time; + } + elsif($code eq 1){ + $PAGE_FAULT_ERROR_CODE1_count += 1; + $PAGE_FAULT_ERROR_CODE1_totaltime += $time; + } + elsif($code eq 2){ + $PAGE_FAULT_ERROR_CODE2_count += 1; + $PAGE_FAULT_ERROR_CODE2_totaltime += $time; + } + elsif($code eq 3){ + $PAGE_FAULT_ERROR_CODE3_count += 1; + $PAGE_FAULT_ERROR_CODE3_totaltime += $time; + } + elsif($code eq 4){ + $PAGE_FAULT_ERROR_CODE4_count += 1; + $PAGE_FAULT_ERROR_CODE4_totaltime += $time; + } + elsif($code eq 5){ + $PAGE_FAULT_ERROR_CODE5_count += 1; + $PAGE_FAULT_ERROR_CODE5_totaltime += $time; + } + elsif($code eq 6){ + $PAGE_FAULT_ERROR_CODE6_count += 1; + $PAGE_FAULT_ERROR_CODE6_totaltime += $time; + } + elsif($code eq 7){ + $PAGE_FAULT_ERROR_CODE7_count += 1; + $PAGE_FAULT_ERROR_CODE7_totaltime += $time; + } + elsif($code eq 8){ + $PAGE_FAULT_ERROR_CODE8_count += 1; + $PAGE_FAULT_ERROR_CODE8_totaltime += $time; + } + elsif($code eq 9){ + $PAGE_FAULT_ERROR_CODE9_count += 1; + $PAGE_FAULT_ERROR_CODE9_totaltime += $time; + } + elsif($code eq 10){ + $PAGE_FAULT_ERROR_CODE10_count += 1; + $PAGE_FAULT_ERROR_CODE10_totaltime += $time; + } + elsif($code eq 11){ + $PAGE_FAULT_ERROR_CODE11_count += 1; + $PAGE_FAULT_ERROR_CODE11_totaltime += $time; + } + elsif($code eq 12){ + $PAGE_FAULT_ERROR_CODE12_count += 1; + $PAGE_FAULT_ERROR_CODE12_totaltime += $time; + } + elsif($code eq 13){ + $PAGE_FAULT_ERROR_CODE13_count += 1; + $PAGE_FAULT_ERROR_CODE13_totaltime += $time; + } + elsif($code eq 14){ + $PAGE_FAULT_ERROR_CODE14_count += 1; + $PAGE_FAULT_ERROR_CODE14_totaltime += $time; + } + elsif($code eq 15){ + $PAGE_FAULT_ERROR_CODE15_count += 1; + $PAGE_FAULT_ERROR_CODE15_totaltime += $time; + } + else{ + $PAGE_FAULT_ERROR_CODE16_count += 1; + $PAGE_FAULT_ERROR_CODE16_totaltime += $time; + } +} -- 1.7.1.1 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |