1*387f9dfdSAndroid Build Coastguard Worker#!/usr/bin/env python3 2*387f9dfdSAndroid Build Coastguard Worker# Copyright (c) PLUMgrid, Inc. 3*387f9dfdSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License") 4*387f9dfdSAndroid Build Coastguard Worker 5*387f9dfdSAndroid Build Coastguard Workerfrom ctypes import c_uint, c_ulong, Structure 6*387f9dfdSAndroid Build Coastguard Workerfrom bcc import BPF 7*387f9dfdSAndroid Build Coastguard Workerfrom time import sleep 8*387f9dfdSAndroid Build Coastguard Workerimport sys 9*387f9dfdSAndroid Build Coastguard Workerfrom unittest import main, TestCase 10*387f9dfdSAndroid Build Coastguard Workerfrom utils import mayFail 11*387f9dfdSAndroid Build Coastguard Worker 12*387f9dfdSAndroid Build Coastguard Workerarg1 = sys.argv.pop(1).encode() 13*387f9dfdSAndroid Build Coastguard Workerarg2 = b"" 14*387f9dfdSAndroid Build Coastguard Workerif len(sys.argv) > 1: 15*387f9dfdSAndroid Build Coastguard Worker arg2 = sys.argv.pop(1) 16*387f9dfdSAndroid Build Coastguard Worker 17*387f9dfdSAndroid Build Coastguard Worker 18*387f9dfdSAndroid Build Coastguard Workerclass TestBlkRequest(TestCase): 19*387f9dfdSAndroid Build Coastguard Worker def setUp(self): 20*387f9dfdSAndroid Build Coastguard Worker b = BPF(arg1, arg2, debug=0) 21*387f9dfdSAndroid Build Coastguard Worker self.latency = b.get_table(b"latency", c_uint, c_ulong) 22*387f9dfdSAndroid Build Coastguard Worker if BPF.get_kprobe_functions(b"blk_start_request"): 23*387f9dfdSAndroid Build Coastguard Worker b.attach_kprobe(event=b"blk_start_request", 24*387f9dfdSAndroid Build Coastguard Worker fn_name=b"probe_blk_start_request") 25*387f9dfdSAndroid Build Coastguard Worker b.attach_kprobe(event=b"blk_mq_start_request", 26*387f9dfdSAndroid Build Coastguard Worker fn_name=b"probe_blk_start_request") 27*387f9dfdSAndroid Build Coastguard Worker b.attach_kprobe(event=b"blk_update_request", 28*387f9dfdSAndroid Build Coastguard Worker fn_name=b"probe_blk_update_request") 29*387f9dfdSAndroid Build Coastguard Worker 30*387f9dfdSAndroid Build Coastguard Worker def test_blk1(self): 31*387f9dfdSAndroid Build Coastguard Worker import subprocess 32*387f9dfdSAndroid Build Coastguard Worker import os 33*387f9dfdSAndroid Build Coastguard Worker # use /opt instead of /tmp so that it hits a real disk 34*387f9dfdSAndroid Build Coastguard Worker for i in range(0, 2): 35*387f9dfdSAndroid Build Coastguard Worker subprocess.call(["dd", "if=/dev/zero", "of=/opt/trace3.txt", 36*387f9dfdSAndroid Build Coastguard Worker "count=1024", "bs=4096"]) 37*387f9dfdSAndroid Build Coastguard Worker subprocess.call(["sync"]) 38*387f9dfdSAndroid Build Coastguard Worker os.unlink("/opt/trace3.txt") 39*387f9dfdSAndroid Build Coastguard Worker for key, leaf in self.latency.items(): 40*387f9dfdSAndroid Build Coastguard Worker print("latency %u:" % key.value, "count %u" % leaf.value) 41*387f9dfdSAndroid Build Coastguard Worker sys.stdout.flush() 42*387f9dfdSAndroid Build Coastguard Worker self.assertEqual(len(list(self.latency.keys())), len(self.latency)) 43*387f9dfdSAndroid Build Coastguard Worker 44*387f9dfdSAndroid Build Coastguard Workerif __name__ == "__main__": 45*387f9dfdSAndroid Build Coastguard Worker main() 46