kvm: Add more VM stats
authorAndreas Sandberg <andreas@sandberg.pp.se>
Tue, 11 Jun 2013 07:43:05 +0000 (09:43 +0200)
committerAndreas Sandberg <andreas@sandberg.pp.se>
Tue, 11 Jun 2013 07:43:05 +0000 (09:43 +0200)
This changeset adds the following stats to KVM:
 * numVMHalfEntries: Number of entries into KVM to finalize pending
   IO operations without executing guest instructions. These typically
   happen as a result of a drain where the guest must finalize some
   operations before the guest state is consistent.
 * numExitSignal: Number of VM exits that have been triggered by a
   signal. These usually happen as a result of the timer that limits
   the time spent in KVM.

src/cpu/kvm/base.cc
src/cpu/kvm/base.hh

index 539790e527303c10a060261ef2dfa77ce885df54..4c176c18b8e7fec52173879ad51a79bc17a215b1 100644 (file)
@@ -201,6 +201,16 @@ BaseKvmCPU::regStats()
         .desc("total number of KVM exits")
         ;
 
+    numVMHalfEntries
+        .name(name() + ".numVMHalfEntries")
+        .desc("number of KVM entries to finalize pending operations")
+        ;
+
+    numExitSignal
+        .name(name() + ".numExitSignal")
+        .desc("exits due to signal delivery")
+        ;
+
     numMMIO
         .name(name() + ".numMMIO")
         .desc("number of VM exits due to memory mapped IO")
@@ -523,10 +533,12 @@ BaseKvmCPU::tick()
 
           // Enter into the RunningService state unless the
           // simulation was stopped by a timer.
-          if (_kvmRun->exit_reason !=  KVM_EXIT_INTR)
+          if (_kvmRun->exit_reason !=  KVM_EXIT_INTR) {
               _status = RunningService;
-          else
+          } else {
+              ++numExitSignal;
               _status = Running;
+          }
 
           if (tryDrain())
               _status = Idle;
@@ -574,6 +586,8 @@ BaseKvmCPU::kvmRun(Tick ticks)
         // then immediately exits.
         DPRINTF(KvmRun, "KVM: Delivering IO without full guest entry\n");
 
+        ++numVMHalfEntries;
+
         // This signal is always masked while we are executing in gem5
         // and gets unmasked temporarily as soon as we enter into
         // KVM. See setSignalMask() and setupSignalHandler().
index 2e3ee551bc6ce0c48e33e01b72924cc2799b90d4..3c299ce4e15b1df76f0fa26ccbfae81514d1ee28 100644 (file)
@@ -687,6 +687,8 @@ class BaseKvmCPU : public BaseCPU
     /* @{ */
     Stats::Scalar numInsts;
     Stats::Scalar numVMExits;
+    Stats::Scalar numVMHalfEntries;
+    Stats::Scalar numExitSignal;
     Stats::Scalar numMMIO;
     Stats::Scalar numCoalescedMMIO;
     Stats::Scalar numIO;