blob: 645921358eeed4657ad2949f9aa95ec21625b9df [file] [log] [blame]
#!/usr/bin/python3
from dynticks_testing_lib import parse_cpulist
import os, sys, subprocess, time
TRACING_PATH="/sys/kernel/tracing"
def file_write(path, buf):
f = open(path, "w")
f.write(buf)
f.close()
def trace_file_write(path, buf):
path = os.path.join(TRACING_PATH, path)
f = open(path, "w")
f.write(buf)
f.close()
def trace_file_read(path):
path = os.path.join(TRACING_PATH, path)
return open(path).read()
# Parse nohz_full=
if not os.path.exists("/sys/devices/system/cpu/nohz_full"):
print("Can't find /sys/devices/system/cpu/nohz_full")
sys.exit(-1)
cpulist = open("/sys/devices/system/cpu/nohz_full").read()
if cpulist.strip() == "(null)":
print("nohz_full= not set ?")
sys.exit(-1)
print("nohz_full=%s" % cpulist)
nohz_full = parse_cpulist(cpulist)
# Reaffine IRQ vectors
vector_affinity = {}
for vec in os.listdir("/proc/irq"):
path = "/proc/irq/%s" % vec
if not os.path.isdir(path) or vec == "0":
continue
path = os.path.join(path, "smp_affinity")
f = open(path, "r")
affinity = f.read()
f.close()
try:
file_write(path, "1")
vector_affinity[vec] = affinity
except OSError:
print("Couldn't reset IRQ %s affinity" % vec)
pass
# Spawn user loops
user_loops = []
for cpu in nohz_full:
p = subprocess.Popen(["./user_loop"])
user_loops.append(p)
os.sched_setaffinity(p.pid, [cpu])
# Trace
trace_file_write("tracing_on", "0");
trace_file_write("trace", "");
EVENTS = ["sched/sched_switch", "irq", "workqueue/workqueue_execute_start", \
"timer/hrtimer_expire_entry", "timer/timer_expire_entry",
"timer/tick_stop", "irq_vectors"]
for event in EVENTS:
trace_file_write(os.path.join("events", event, "enable"), "1")
trace_file_write("current_tracer", "nop");
trace_file_write("tracing_on", "1");
time.sleep(10)
trace_file_write("tracing_on", "0");
for event in EVENTS:
trace_file_write(os.path.join("events", event, "enable"), "0")
# Dump
fr = open(os.path.join(TRACING_PATH, "trace"), "r")
fw = open("./trace", "w")
for l in fr:
fw.write(l)
fr.close()
fw.close()
# Kill user loops
user_loop = []
for user_loop in user_loops:
user_loop.kill()
# Restore IRQ vectors affinity
for vec in vector_affinity:
path = "/proc/irq/%s/smp_affinity" % vec
try:
file_write(path, vector_affinity[vec])
except OSError:
pass