From a607b421447823aae8fe3cd28a61add1e850c52d Mon Sep 17 00:00:00 2001 From: kernel-z Date: Wed, 13 Jun 2018 18:09:57 +0800 Subject: [PATCH 1/3] modify ext4slower.py for 4.10+ version --- tools/ext4slower.py | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/tools/ext4slower.py b/tools/ext4slower.py index 756d82624143..7d6bc7d3cd11 100755 --- a/tools/ext4slower.py +++ b/tools/ext4slower.py @@ -23,6 +23,7 @@ # # 11-Feb-2016 Brendan Gregg Created this. # 15-Oct-2016 Dina Goldshtein -p to filter by process ID. +# 13-Jun-2018 Joe Yin modify generic_file_read_iter to ext4_file_read_iter. from __future__ import print_function from bcc import BPF @@ -40,6 +41,7 @@ ./ext4slower -j 1 # ... 1 ms, parsable output (csv) ./ext4slower 0 # trace all operations (warning: verbose) ./ext4slower -p 185 # trace PID 185 only + ./ext4slower -n # trace Linux 4.10+ """ parser = argparse.ArgumentParser( description="Trace common ext4 file operations slower than a threshold", @@ -49,6 +51,8 @@ help="just print fields: comma-separated values") parser.add_argument("-p", "--pid", help="trace this PID only") +parser.add_argument("-n", "--newver", action="store_true", + help="trace Linux 4.10+") parser.add_argument("min_ms", nargs="?", default='10', help="minimum I/O duration to trace, in ms (default 10)") parser.add_argument("--ebpf", action="store_true", @@ -57,6 +61,7 @@ min_ms = int(args.min_ms) pid = args.pid csv = args.csv +newver = args.newver debug = 0 # define BPF program @@ -100,6 +105,9 @@ // The current ext4 (Linux 4.5) uses generic_file_read_iter(), instead of it's // own function, for reads. So we need to trace that and then filter on ext4, // which I do by checking file->f_op. +// The new Linux version (since form 4.10) uses ext4_file_read_iter(), And if the 'CONFIG_FS_DAX' +// is not set ,it will call generic_file_read_iter(), else it will call ext4_dax_read_iter(), and +// trace generic_file_read_iter() will fail. int trace_read_entry(struct pt_regs *ctx, struct kiocb *iocb) { u64 id = bpf_get_current_pid_tgid(); @@ -111,7 +119,7 @@ // ext4 filter on file->f_op == ext4_file_operations struct file *fp = iocb->ki_filp; if ((u64)fp->f_op != EXT4_FILE_OPERATIONS) - return 0; + return 0; // store filep and timestamp by id struct val_t val = {}; @@ -321,11 +329,17 @@ def print_event(cpu, data, size): b = BPF(text=bpf_text) # Common file functions. See earlier comment about generic_file_read_iter(). -b.attach_kprobe(event="generic_file_read_iter", fn_name="trace_read_entry") +if (newver): + b.attach_kprobe(event="ext4_file_read_iter", fn_name="trace_read_entry") +else: + b.attach_kprobe(event="generic_file_read_iter", fn_name="trace_read_entry") b.attach_kprobe(event="ext4_file_write_iter", fn_name="trace_write_entry") b.attach_kprobe(event="ext4_file_open", fn_name="trace_open_entry") b.attach_kprobe(event="ext4_sync_file", fn_name="trace_fsync_entry") -b.attach_kretprobe(event="generic_file_read_iter", fn_name="trace_read_return") +if (newver): + b.attach_kretprobe(event="ext4_file_read_iter", fn_name="trace_read_return") +else: + b.attach_kretprobe(event="generic_file_read_iter", fn_name="trace_read_return") b.attach_kretprobe(event="ext4_file_write_iter", fn_name="trace_write_return") b.attach_kretprobe(event="ext4_file_open", fn_name="trace_open_return") b.attach_kretprobe(event="ext4_sync_file", fn_name="trace_fsync_return") From d2b05f95fdfa1ca87e7c1493986d2c5d542f610b Mon Sep 17 00:00:00 2001 From: kernel-z Date: Wed, 13 Jun 2018 19:00:22 +0800 Subject: [PATCH 2/3] modify ext4slower.py for 4.10+ version --- tools/ext4slower.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/ext4slower.py b/tools/ext4slower.py index 7d6bc7d3cd11..23e7ba8c068d 100755 --- a/tools/ext4slower.py +++ b/tools/ext4slower.py @@ -106,8 +106,8 @@ // own function, for reads. So we need to trace that and then filter on ext4, // which I do by checking file->f_op. // The new Linux version (since form 4.10) uses ext4_file_read_iter(), And if the 'CONFIG_FS_DAX' -// is not set ,it will call generic_file_read_iter(), else it will call ext4_dax_read_iter(), and -// trace generic_file_read_iter() will fail. +// is not set ,then ext4_file_read_iter() will call generic_file_read_iter(), else it will call +// ext4_dax_read_iter(), and trace generic_file_read_iter() will fail. int trace_read_entry(struct pt_regs *ctx, struct kiocb *iocb) { u64 id = bpf_get_current_pid_tgid(); @@ -119,7 +119,7 @@ // ext4 filter on file->f_op == ext4_file_operations struct file *fp = iocb->ki_filp; if ((u64)fp->f_op != EXT4_FILE_OPERATIONS) - return 0; + return 0; // store filep and timestamp by id struct val_t val = {}; From 1b964702732317dc8ef071cd2654b79587e00581 Mon Sep 17 00:00:00 2001 From: kernel-z Date: Thu, 14 Jun 2018 11:32:35 +0800 Subject: [PATCH 3/3] #1818 --- tools/ext4slower.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/tools/ext4slower.py b/tools/ext4slower.py index 23e7ba8c068d..eb6430e5ce3e 100755 --- a/tools/ext4slower.py +++ b/tools/ext4slower.py @@ -41,7 +41,6 @@ ./ext4slower -j 1 # ... 1 ms, parsable output (csv) ./ext4slower 0 # trace all operations (warning: verbose) ./ext4slower -p 185 # trace PID 185 only - ./ext4slower -n # trace Linux 4.10+ """ parser = argparse.ArgumentParser( description="Trace common ext4 file operations slower than a threshold", @@ -51,8 +50,6 @@ help="just print fields: comma-separated values") parser.add_argument("-p", "--pid", help="trace this PID only") -parser.add_argument("-n", "--newver", action="store_true", - help="trace Linux 4.10+") parser.add_argument("min_ms", nargs="?", default='10', help="minimum I/O duration to trace, in ms (default 10)") parser.add_argument("--ebpf", action="store_true", @@ -61,7 +58,6 @@ min_ms = int(args.min_ms) pid = args.pid csv = args.csv -newver = args.newver debug = 0 # define BPF program @@ -329,14 +325,14 @@ def print_event(cpu, data, size): b = BPF(text=bpf_text) # Common file functions. See earlier comment about generic_file_read_iter(). -if (newver): +if BPF.get_kprobe_functions(b'ext4_file_read_iter'): b.attach_kprobe(event="ext4_file_read_iter", fn_name="trace_read_entry") else: b.attach_kprobe(event="generic_file_read_iter", fn_name="trace_read_entry") b.attach_kprobe(event="ext4_file_write_iter", fn_name="trace_write_entry") b.attach_kprobe(event="ext4_file_open", fn_name="trace_open_entry") b.attach_kprobe(event="ext4_sync_file", fn_name="trace_fsync_entry") -if (newver): +if BPF.get_kprobe_functions(b'ext4_file_read_iter'): b.attach_kretprobe(event="ext4_file_read_iter", fn_name="trace_read_return") else: b.attach_kretprobe(event="generic_file_read_iter", fn_name="trace_read_return")