xref: /aosp_15_r20/external/bcc/tools/vfscount.py (revision 387f9dfdfa2baef462e92476d413c7bc2470293e)
1*387f9dfdSAndroid Build Coastguard Worker#!/usr/bin/env python
2*387f9dfdSAndroid Build Coastguard Worker# @lint-avoid-python-3-compatibility-imports
3*387f9dfdSAndroid Build Coastguard Worker#
4*387f9dfdSAndroid Build Coastguard Worker# vfscount  Count VFS calls ("vfs_*").
5*387f9dfdSAndroid Build Coastguard Worker#           For Linux, uses BCC, eBPF. See .c file.
6*387f9dfdSAndroid Build Coastguard Worker#
7*387f9dfdSAndroid Build Coastguard Worker# Written as a basic example of counting functions.
8*387f9dfdSAndroid Build Coastguard Worker#
9*387f9dfdSAndroid Build Coastguard Worker# Copyright (c) 2015 Brendan Gregg.
10*387f9dfdSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License")
11*387f9dfdSAndroid Build Coastguard Worker#
12*387f9dfdSAndroid Build Coastguard Worker# 14-Aug-2015   Brendan Gregg   Created this.
13*387f9dfdSAndroid Build Coastguard Worker
14*387f9dfdSAndroid Build Coastguard Workerfrom __future__ import print_function
15*387f9dfdSAndroid Build Coastguard Workerfrom bcc import BPF
16*387f9dfdSAndroid Build Coastguard Workerfrom time import sleep
17*387f9dfdSAndroid Build Coastguard Workerfrom sys import argv
18*387f9dfdSAndroid Build Coastguard Workerdef usage():
19*387f9dfdSAndroid Build Coastguard Worker    print("USAGE: %s [time]" % argv[0])
20*387f9dfdSAndroid Build Coastguard Worker    exit()
21*387f9dfdSAndroid Build Coastguard Worker
22*387f9dfdSAndroid Build Coastguard Workerinterval = 99999999
23*387f9dfdSAndroid Build Coastguard Workerif len(argv) > 1:
24*387f9dfdSAndroid Build Coastguard Worker    try:
25*387f9dfdSAndroid Build Coastguard Worker        interval = int(argv[1])
26*387f9dfdSAndroid Build Coastguard Worker        if interval == 0:
27*387f9dfdSAndroid Build Coastguard Worker            raise
28*387f9dfdSAndroid Build Coastguard Worker    except:  # also catches -h, --help
29*387f9dfdSAndroid Build Coastguard Worker        usage()
30*387f9dfdSAndroid Build Coastguard Worker# load BPF program
31*387f9dfdSAndroid Build Coastguard Workerb = BPF(text="""
32*387f9dfdSAndroid Build Coastguard Worker#include <uapi/linux/ptrace.h>
33*387f9dfdSAndroid Build Coastguard Worker
34*387f9dfdSAndroid Build Coastguard Workerstruct key_t {
35*387f9dfdSAndroid Build Coastguard Worker    u64 ip;
36*387f9dfdSAndroid Build Coastguard Worker};
37*387f9dfdSAndroid Build Coastguard Worker
38*387f9dfdSAndroid Build Coastguard WorkerBPF_HASH(counts, struct key_t, u64, 256);
39*387f9dfdSAndroid Build Coastguard Worker
40*387f9dfdSAndroid Build Coastguard Workerint do_count(struct pt_regs *ctx) {
41*387f9dfdSAndroid Build Coastguard Worker    struct key_t key = {};
42*387f9dfdSAndroid Build Coastguard Worker    key.ip = PT_REGS_IP(ctx);
43*387f9dfdSAndroid Build Coastguard Worker    counts.atomic_increment(key);
44*387f9dfdSAndroid Build Coastguard Worker    return 0;
45*387f9dfdSAndroid Build Coastguard Worker}
46*387f9dfdSAndroid Build Coastguard Worker""")
47*387f9dfdSAndroid Build Coastguard Workerb.attach_kprobe(event_re="^vfs_.*", fn_name="do_count")
48*387f9dfdSAndroid Build Coastguard Worker
49*387f9dfdSAndroid Build Coastguard Worker# header
50*387f9dfdSAndroid Build Coastguard Workerprint("Tracing... Ctrl-C to end.")
51*387f9dfdSAndroid Build Coastguard Worker
52*387f9dfdSAndroid Build Coastguard Worker# output
53*387f9dfdSAndroid Build Coastguard Workertry:
54*387f9dfdSAndroid Build Coastguard Worker    sleep(interval)
55*387f9dfdSAndroid Build Coastguard Workerexcept KeyboardInterrupt:
56*387f9dfdSAndroid Build Coastguard Worker    pass
57*387f9dfdSAndroid Build Coastguard Worker
58*387f9dfdSAndroid Build Coastguard Workerprint("\n%-16s %-26s %8s" % ("ADDR", "FUNC", "COUNT"))
59*387f9dfdSAndroid Build Coastguard Workercounts = b.get_table("counts")
60*387f9dfdSAndroid Build Coastguard Workerfor k, v in sorted(counts.items(), key=lambda counts: counts[1].value):
61*387f9dfdSAndroid Build Coastguard Worker    print("%-16x %-26s %8d" % (k.ip, b.ksym(k.ip), v.value))
62