From 9655b9de15bb5aaf53c16d6ef76d7b58bea2973a Mon Sep 17 00:00:00 2001 From: Kaige Fu Date: Fri, 29 Nov 2019 00:37:43 +0800 Subject: [PATCH] acrntrace: Fix the incorrect total vmexit cnt issue Originally, we assume that the vmenter will sit at the first line of the trace file. But if the vmexit comes earlier than vmenter. The total vmexit cnt will be set as 0 by the first vmenter. This patch fixes the issue by: - Search the trace file to find the first vmexit entry and start to analyze here and mark the TSC_BEGIN as the tsc of this vmexit. - Inc the total vmexit cnt by 1 when meet the vmexit entry. - Calc the vmexit duration when meet the vmenter in pair with the last vmexit. Tracked-On: #4175 Acked-by: Yan, Like Signed-off-by: Kaige Fu --- .../tools/acrntrace/scripts/vmexit_analyze.py | 38 ++++++++++++------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/misc/tools/acrntrace/scripts/vmexit_analyze.py b/misc/tools/acrntrace/scripts/vmexit_analyze.py index 3f313d4ac..812d0ea77 100755 --- a/misc/tools/acrntrace/scripts/vmexit_analyze.py +++ b/misc/tools/acrntrace/scripts/vmexit_analyze.py @@ -89,12 +89,31 @@ def parse_trace_data(ifile): global TSC_BEGIN, TSC_END, TOTAL_NR_EXITS last_ev_id = '' - tsc_enter = 0 tsc_exit = 0 - tsc_last_exit_period = 0 fd = open(ifile, 'rb') + # The duration of one vmexit is tsc_enter - tsc_exit + # Here we should find the first vmexit and ignore other entries on top of the first vmexit + while True: + try: + line = fd.read(struct.calcsize(TRCREC)) + if not line: + break + (tsc, event, d1, d2) = struct.unpack(TRCREC, line) + event = event & 0xffffffffffff + + if event != VM_EXIT: + continue + + # We found the first vmexit and should seek back one line as we will read it in the following loop + TSC_BEGIN = tsc + fd.seek(fd.tell() - len(line)) + break + + except (IOError, struct.error) as e: + sys.exit() + while True: try: line = fd.read(struct.calcsize(TRCREC)) @@ -105,21 +124,12 @@ def parse_trace_data(ifile): event = event & 0xffffffffffff if event == VM_ENTER: - if TSC_BEGIN == 0: - TSC_BEGIN = tsc - tsc_exit = tsc - TOTAL_NR_EXITS = 0 - - tsc_enter = tsc - TSC_END = tsc_enter - tsc_last_exit_period = tsc_enter - tsc_exit - - if tsc_last_exit_period != 0: - TIME_IN_EXIT[last_ev_id] += tsc_last_exit_period + TSC_END = tsc + # Found one vmenter in pair with the last vmexit + TIME_IN_EXIT[last_ev_id] += tsc - tsc_exit elif event == VM_EXIT: tsc_exit = tsc - TSC_END = tsc_exit TOTAL_NR_EXITS += 1 else: