Expanded ftrace2pyplot for user-supplied ftrace function name
This commit is contained in:
parent
c7798a9358
commit
89a7d48866
7 changed files with 21 additions and 9 deletions
|
|
@ -6,6 +6,10 @@ parser = argparse.ArgumentParser(
|
|||
)
|
||||
|
||||
# Positional
|
||||
parser.add_argument(
|
||||
"fn", metavar="function", type=str,
|
||||
help="ftrace function name to filter entries for"
|
||||
)
|
||||
parser.add_argument(
|
||||
"directory", type=str, help="ftrace-cmd output .dat directory"
|
||||
)
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
from os import path
|
||||
from argparse import Namespace
|
||||
import glob
|
||||
from typing import List, Tuple, Union
|
||||
from typing import List, Tuple, Union, Optional
|
||||
import re
|
||||
|
||||
import trappy
|
||||
|
|
@ -12,7 +12,7 @@ import matplotlib.pyplot as plt
|
|||
|
||||
from .arguments import parser
|
||||
|
||||
def parse_basename_into_byte_count(basename: str) -> int:
|
||||
def parse_basename_to_kibs(basename: str) -> int:
|
||||
ret: int = -1
|
||||
|
||||
regex = re.compile(r"(?P<size>[0-9]+)(?P<unit>[kmgKMG])")
|
||||
|
|
@ -31,7 +31,7 @@ def parse_basename_into_byte_count(basename: str) -> int:
|
|||
def clip_to(
|
||||
dataset: Union[pd.Series, pd.DataFrame],
|
||||
percentile: float,
|
||||
axis: int = None
|
||||
axis: Optional[int] = None
|
||||
) -> Union[pd.Series, pd.DataFrame]:
|
||||
assert(0 <= percentile <= 1)
|
||||
if percentile == .0:
|
||||
|
|
@ -47,17 +47,22 @@ def clip_to(
|
|||
|
||||
return clipped
|
||||
|
||||
def parse_function_graph_ftrace(trace_fpath: str):
|
||||
trace = trappy.FTrace(trace_fpath)
|
||||
def parse_function_graph_ftrace(
|
||||
ftrace_dat_path: str,
|
||||
fn: str
|
||||
) -> Optional[pd.DataFrame]:
|
||||
trace = trappy.FTrace(ftrace_dat_path)
|
||||
fngraph_df: pd.DataFrame = trace.funcgraph_exit.data_frame
|
||||
assert fngraph_df is not None
|
||||
|
||||
# Sieve `__dcache_clean_poc` entries
|
||||
# Sieve function entries
|
||||
# Notably, the long ones are mostly preempted by e.g., softirq (rcu, etc.)
|
||||
# I should prob. identify them but whatever
|
||||
# Other long ones that are NOT preempted may be due to QEMU process
|
||||
# scheduling on host, not sure
|
||||
fngraph_df = fngraph_df.loc[fngraph_df["func"] == "__dcache_clean_poc"]
|
||||
fngraph_df = fngraph_df.loc[fngraph_df["func"] == fn]
|
||||
if fngraph_df.shape[0] == 0:
|
||||
return None
|
||||
|
||||
# Compute runtime of function
|
||||
fngraph_df.loc[:, "rettime"] = (fngraph_df["rettime"]
|
||||
|
|
@ -83,8 +88,11 @@ def run(args: Namespace):
|
|||
|
||||
for ftrace_dat_path in ftrace_dat_paths:
|
||||
print("Loading \"{}\"...".format(ftrace_dat_path))
|
||||
fngraph_df = parse_function_graph_ftrace(ftrace_dat_path)
|
||||
size_in_kb = parse_basename_into_byte_count(
|
||||
fngraph_df = parse_function_graph_ftrace(ftrace_dat_path, args.fn)
|
||||
if fngraph_df is None:
|
||||
print("No entry -- pass")
|
||||
continue
|
||||
size_in_kb = parse_basename_to_kibs(
|
||||
str(path.basename(ftrace_dat_path).split(".")[:-1]))
|
||||
ftrace_dfs.append((size_in_kb, fngraph_df))
|
||||
|
||||
|
|
|
|||
BIN
src/aarch64-linux-flush-dcache/visualizer/out-95p-new.pdf
Normal file
BIN
src/aarch64-linux-flush-dcache/visualizer/out-95p-new.pdf
Normal file
Binary file not shown.
BIN
src/aarch64-linux-flush-dcache/visualizer/out-log-new.pdf
Normal file
BIN
src/aarch64-linux-flush-dcache/visualizer/out-log-new.pdf
Normal file
Binary file not shown.
Binary file not shown.
BIN
src/aarch64-linux-flush-dcache/visualizer/tlb-95p.pdf
Normal file
BIN
src/aarch64-linux-flush-dcache/visualizer/tlb-95p.pdf
Normal file
Binary file not shown.
BIN
src/aarch64-linux-flush-dcache/visualizer/tlb-log.pdf
Normal file
BIN
src/aarch64-linux-flush-dcache/visualizer/tlb-log.pdf
Normal file
Binary file not shown.
Loading…
Add table
Add a link
Reference in a new issue