Blame SOURCES/Fix-tools-for-RHEL-7.patch

f282d1
From c28fdc2ad6c6acbd6c61dc78a6c6e114572357a5 Mon Sep 17 00:00:00 2001
f282d1
From: Jerome Marchand <jmarchan@redhat.com>
f282d1
Date: Thu, 16 Aug 2018 14:58:56 +0200
f282d1
Subject: [PATCH] Fix tools for RHEL 7
f282d1
f282d1
There some differences on RHEL 7 that make some tools fail. This patch
f282d1
fixes the following:
f282d1
 - missing /sys/kernel/debug/kprobes/blacklist file
f282d1
 - missing __vfs_read() function
f282d1
 - aio_read/write methods replaced by read/write_iter in file_operations
f282d1
 - changes in mnt_namespace structure
f282d1
 - change in finish_task_switch() argument list
f282d1
 - changes in sock_common struct
f282d1
 - missing TCP_NEW_SYN_RECV TCP state
f282d1
 - mm_page_alloc tracepoint returns page struct instead of PFN
f282d1
 - iocb argument removed from tcp_sendmsg()
f282d1
---
f282d1
 src/python/bcc/__init__.py |  7 +++++--
f282d1
 tools/btrfsdist.py         | 13 +++++++------
f282d1
 tools/btrfsslower.py       | 13 +++++++------
f282d1
 tools/cpudist.py           |  4 +++-
f282d1
 tools/ext4dist.py          | 11 ++++++-----
f282d1
 tools/ext4slower.py        | 13 +++++++------
f282d1
 tools/fileslower.py        | 13 +++++++++----
f282d1
 tools/memleak.py           | 12 ++++++++++--
f282d1
 tools/mountsnoop.py        |  9 ++++-----
f282d1
 tools/nfsslower.py         |  1 +
f282d1
 tools/offcputime.py        |  4 +++-
f282d1
 tools/offwaketime.py       |  4 +++-
f282d1
 tools/runqlat.py           |  2 +-
f282d1
 tools/runqslower.py        |  2 +-
f282d1
 tools/solisten.py          |  2 +-
f282d1
 tools/tcpsubnet.py         |  4 ++--
f282d1
 tools/tcptracer.py         |  9 ++++-----
f282d1
 tools/xfsdist.py           |  8 ++++----
f282d1
 tools/xfsslower.py         | 11 ++++++-----
f282d1
 19 files changed, 84 insertions(+), 58 deletions(-)
f282d1
f282d1
diff --git a/src/python/bcc/__init__.py b/src/python/bcc/__init__.py
f282d1
index 8f793aa..470ac49 100644
f282d1
--- a/src/python/bcc/__init__.py
f282d1
+++ b/src/python/bcc/__init__.py
f282d1
@@ -500,8 +500,11 @@ DEBUG_BPF_REGISTER_STATE = 0x10
f282d1
 
f282d1
     @staticmethod
f282d1
     def get_kprobe_functions(event_re):
f282d1
-        with open("%s/../kprobes/blacklist" % TRACEFS, "rb") as blacklist_f:
f282d1
-            blacklist = set([line.rstrip().split()[1] for line in blacklist_f])
f282d1
+        try:
f282d1
+            with open("%s/../kprobes/blacklist" % TRACEFS, "rb") as blacklist_f:
f282d1
+                blacklist = set([line.rstrip().split()[1] for line in blacklist_f])
f282d1
+        except:
f282d1
+            blacklist = set()
f282d1
         fns = []
f282d1
 
f282d1
         in_init_section = 0
f282d1
diff --git a/tools/btrfsdist.py b/tools/btrfsdist.py
f282d1
index 4659ab4..3326b67 100755
f282d1
--- a/tools/btrfsdist.py
f282d1
+++ b/tools/btrfsdist.py
f282d1
@@ -60,6 +60,7 @@ debug = 0
f282d1
 bpf_text = """
f282d1
 #include <uapi/linux/ptrace.h>
f282d1
 #include <linux/fs.h>
f282d1
+#include <linux/aio.h>
f282d1
 #include <linux/sched.h>
f282d1
 
f282d1
 #define OP_NAME_LEN 8
f282d1
@@ -81,7 +82,7 @@ int trace_entry(struct pt_regs *ctx)
f282d1
     return 0;
f282d1
 }
f282d1
 
f282d1
-// The current btrfs (Linux 4.5) uses generic_file_read_iter() instead of it's
f282d1
+// btrfs uses generic_file_aio_read() instead of it's
f282d1
 // own read function. So we need to trace that and then filter on btrfs, which
f282d1
 // I do by checking file->f_op.
f282d1
 int trace_read_entry(struct pt_regs *ctx, struct kiocb *iocb)
f282d1
@@ -193,13 +194,13 @@ bpf_text = bpf_text.replace('FACTOR', str(factor))
f282d1
 # load BPF program
f282d1
 b = BPF(text=bpf_text)
f282d1
 
f282d1
-# Common file functions. See earlier comment about generic_file_read_iter().
f282d1
-b.attach_kprobe(event="generic_file_read_iter", fn_name="trace_read_entry")
f282d1
-b.attach_kprobe(event="btrfs_file_write_iter", fn_name="trace_entry")
f282d1
+# Common file functions. See earlier comment about generic_file_aio_read().
f282d1
+b.attach_kprobe(event="generic_file_aio_read", fn_name="trace_read_entry")
f282d1
+b.attach_kprobe(event="btrfs_file_aio_write", fn_name="trace_entry")
f282d1
 b.attach_kprobe(event="generic_file_open", fn_name="trace_open_entry")
f282d1
 b.attach_kprobe(event="btrfs_sync_file", fn_name="trace_entry")
f282d1
-b.attach_kretprobe(event="generic_file_read_iter", fn_name="trace_read_return")
f282d1
-b.attach_kretprobe(event="btrfs_file_write_iter", fn_name="trace_write_return")
f282d1
+b.attach_kretprobe(event="generic_file_aio_read", fn_name="trace_read_return")
f282d1
+b.attach_kretprobe(event="btrfs_file_aio_write", fn_name="trace_write_return")
f282d1
 b.attach_kretprobe(event="generic_file_open", fn_name="trace_open_return")
f282d1
 b.attach_kretprobe(event="btrfs_sync_file", fn_name="trace_fsync_return")
f282d1
 
f282d1
diff --git a/tools/btrfsslower.py b/tools/btrfsslower.py
f282d1
index 644cb22..a720396 100755
f282d1
--- a/tools/btrfsslower.py
f282d1
+++ b/tools/btrfsslower.py
f282d1
@@ -63,6 +63,7 @@ debug = 0
f282d1
 bpf_text = """
f282d1
 #include <uapi/linux/ptrace.h>
f282d1
 #include <linux/fs.h>
f282d1
+#include <linux/aio.h>
f282d1
 #include <linux/sched.h>
f282d1
 #include <linux/dcache.h>
f282d1
 
f282d1
@@ -97,7 +98,7 @@ BPF_PERF_OUTPUT(events);
f282d1
 // Store timestamp and size on entry
f282d1
 //
f282d1
 
f282d1
-// The current btrfs (Linux 4.5) uses generic_file_read_iter() instead of it's
f282d1
+// btrfs uses generic_file_aio_read() instead of it's
f282d1
 // own read function. So we need to trace that and then filter on btrfs, which
f282d1
 // I do by checking file->f_op.
f282d1
 int trace_read_entry(struct pt_regs *ctx, struct kiocb *iocb)
f282d1
@@ -124,7 +125,7 @@ int trace_read_entry(struct pt_regs *ctx, struct kiocb *iocb)
f282d1
     return 0;
f282d1
 }
f282d1
 
f282d1
-// btrfs_file_write_iter():
f282d1
+// btrfs_file_aio_write():
f282d1
 int trace_write_entry(struct pt_regs *ctx, struct kiocb *iocb)
f282d1
 {
f282d1
     u64 id = bpf_get_current_pid_tgid();
f282d1
@@ -327,12 +328,12 @@ TASK_COMM_LEN = 16      # linux/sched.h
f282d1
 b = BPF(text=bpf_text)
f282d1
 
f282d1
 # Common file functions. See earlier comment about generic_*().
f282d1
-b.attach_kprobe(event="generic_file_read_iter", fn_name="trace_read_entry")
f282d1
-b.attach_kprobe(event="btrfs_file_write_iter", fn_name="trace_write_entry")
f282d1
+b.attach_kprobe(event="generic_file_aio_read", fn_name="trace_read_entry")
f282d1
+b.attach_kprobe(event="btrfs_file_aio_write", fn_name="trace_write_entry")
f282d1
 b.attach_kprobe(event="generic_file_open", fn_name="trace_open_entry")
f282d1
 b.attach_kprobe(event="btrfs_sync_file", fn_name="trace_fsync_entry")
f282d1
-b.attach_kretprobe(event="generic_file_read_iter", fn_name="trace_read_return")
f282d1
-b.attach_kretprobe(event="btrfs_file_write_iter", fn_name="trace_write_return")
f282d1
+b.attach_kretprobe(event="generic_file_aio_read", fn_name="trace_read_return")
f282d1
+b.attach_kretprobe(event="btrfs_file_aio_write", fn_name="trace_write_return")
f282d1
 b.attach_kretprobe(event="generic_file_open", fn_name="trace_open_return")
f282d1
 b.attach_kretprobe(event="btrfs_sync_file", fn_name="trace_fsync_return")
f282d1
 
f282d1
diff --git a/tools/cpudist.py b/tools/cpudist.py
f282d1
index 4d7c9eb..ddb675e 100755
f282d1
--- a/tools/cpudist.py
f282d1
+++ b/tools/cpudist.py
f282d1
@@ -94,7 +94,9 @@ static inline void update_hist(u32 tgid, u32 pid, u64 ts)
f282d1
     STORE
f282d1
 }
f282d1
 
f282d1
-int sched_switch(struct pt_regs *ctx, struct task_struct *prev)
f282d1
+struct rq;
f282d1
+
f282d1
+int sched_switch(struct pt_regs *ctx, struct rq *rq, struct task_struct *prev)
f282d1
 {
f282d1
     u64 ts = bpf_ktime_get_ns();
f282d1
     u64 pid_tgid = bpf_get_current_pid_tgid();
f282d1
diff --git a/tools/ext4dist.py b/tools/ext4dist.py
f282d1
index 227c138..f57cda8 100755
f282d1
--- a/tools/ext4dist.py
f282d1
+++ b/tools/ext4dist.py
f282d1
@@ -60,6 +60,7 @@ debug = 0
f282d1
 bpf_text = """
f282d1
 #include <uapi/linux/ptrace.h>
f282d1
 #include <linux/fs.h>
f282d1
+#include <linux/aio.h>
f282d1
 #include <linux/sched.h>
f282d1
 
f282d1
 #define OP_NAME_LEN 8
f282d1
@@ -81,7 +82,7 @@ int trace_entry(struct pt_regs *ctx)
f282d1
     return 0;
f282d1
 }
f282d1
 
f282d1
-// The current ext4 (Linux 4.5) uses generic_file_read_iter(), instead of it's
f282d1
+// ext4 uses generic_file_aio_read(), instead of it's
f282d1
 // own function, for reads. So we need to trace that and then filter on ext4,
f282d1
 // which I do by checking file->f_op.
f282d1
 int trace_read_entry(struct pt_regs *ctx, struct kiocb *iocb)
f282d1
@@ -183,12 +184,12 @@ b = BPF(text=bpf_text)
f282d1
 if BPF.get_kprobe_functions('ext4_file_read_iter'):
f282d1
 	b.attach_kprobe(event="ext4_file_read_iter", fn_name="trace_entry")
f282d1
 else:
f282d1
-	b.attach_kprobe(event="generic_file_read_iter", fn_name="trace_read_entry")
f282d1
-b.attach_kprobe(event="ext4_file_write_iter", fn_name="trace_entry")
f282d1
+	b.attach_kprobe(event="generic_file_aio_read", fn_name="trace_read_entry")
f282d1
+b.attach_kprobe(event="ext4_file_write", fn_name="trace_entry")
f282d1
 b.attach_kprobe(event="ext4_file_open", fn_name="trace_entry")
f282d1
 b.attach_kprobe(event="ext4_sync_file", fn_name="trace_entry")
f282d1
-b.attach_kretprobe(event="generic_file_read_iter", fn_name="trace_read_return")
f282d1
-b.attach_kretprobe(event="ext4_file_write_iter", fn_name="trace_write_return")
f282d1
+b.attach_kretprobe(event="generic_file_aio_read", fn_name="trace_read_return")
f282d1
+b.attach_kretprobe(event="ext4_file_write", fn_name="trace_write_return")
f282d1
 b.attach_kretprobe(event="ext4_file_open", fn_name="trace_open_return")
f282d1
 b.attach_kretprobe(event="ext4_sync_file", fn_name="trace_fsync_return")
f282d1
 
f282d1
diff --git a/tools/ext4slower.py b/tools/ext4slower.py
f282d1
index eb6430e..276123f 100755
f282d1
--- a/tools/ext4slower.py
f282d1
+++ b/tools/ext4slower.py
f282d1
@@ -64,6 +64,7 @@ debug = 0
f282d1
 bpf_text = """
f282d1
 #include <uapi/linux/ptrace.h>
f282d1
 #include <linux/fs.h>
f282d1
+#include <linux/aio.h>
f282d1
 #include <linux/sched.h>
f282d1
 #include <linux/dcache.h>
f282d1
 
f282d1
@@ -98,7 +99,7 @@ BPF_PERF_OUTPUT(events);
f282d1
 // Store timestamp and size on entry
f282d1
 //
f282d1
 
f282d1
-// The current ext4 (Linux 4.5) uses generic_file_read_iter(), instead of it's
f282d1
+// ext4 uses generic_file_aio_read(), instead of it's
f282d1
 // own function, for reads. So we need to trace that and then filter on ext4,
f282d1
 // which I do by checking file->f_op.
f282d1
 // The new Linux version (since form 4.10) uses ext4_file_read_iter(), And if the 'CONFIG_FS_DAX' 
f282d1
@@ -128,7 +129,7 @@ int trace_read_entry(struct pt_regs *ctx, struct kiocb *iocb)
f282d1
     return 0;
f282d1
 }
f282d1
 
f282d1
-// ext4_file_write_iter():
f282d1
+// ext4_file_write():
f282d1
 int trace_write_entry(struct pt_regs *ctx, struct kiocb *iocb)
f282d1
 {
f282d1
     u64 id = bpf_get_current_pid_tgid();
f282d1
@@ -328,15 +329,15 @@ b = BPF(text=bpf_text)
f282d1
 if BPF.get_kprobe_functions(b'ext4_file_read_iter'):
f282d1
     b.attach_kprobe(event="ext4_file_read_iter", fn_name="trace_read_entry")
f282d1
 else:
f282d1
-    b.attach_kprobe(event="generic_file_read_iter", fn_name="trace_read_entry")
f282d1
-b.attach_kprobe(event="ext4_file_write_iter", fn_name="trace_write_entry")
f282d1
+    b.attach_kprobe(event="generic_file_aio_read", fn_name="trace_read_entry")
f282d1
+b.attach_kprobe(event="ext4_file_write", fn_name="trace_write_entry")
f282d1
 b.attach_kprobe(event="ext4_file_open", fn_name="trace_open_entry")
f282d1
 b.attach_kprobe(event="ext4_sync_file", fn_name="trace_fsync_entry")
f282d1
 if BPF.get_kprobe_functions(b'ext4_file_read_iter'):
f282d1
     b.attach_kretprobe(event="ext4_file_read_iter", fn_name="trace_read_return")
f282d1
 else:
f282d1
-    b.attach_kretprobe(event="generic_file_read_iter", fn_name="trace_read_return")
f282d1
-b.attach_kretprobe(event="ext4_file_write_iter", fn_name="trace_write_return")
f282d1
+    b.attach_kretprobe(event="generic_file_aio_read", fn_name="trace_read_return")
f282d1
+b.attach_kretprobe(event="ext4_file_write", fn_name="trace_write_return")
f282d1
 b.attach_kretprobe(event="ext4_file_open", fn_name="trace_open_return")
f282d1
 b.attach_kretprobe(event="ext4_sync_file", fn_name="trace_fsync_return")
f282d1
 
f282d1
diff --git a/tools/fileslower.py b/tools/fileslower.py
f282d1
index 5caa4ca..6af91af 100755
f282d1
--- a/tools/fileslower.py
f282d1
+++ b/tools/fileslower.py
f282d1
@@ -124,7 +124,7 @@ int trace_read_entry(struct pt_regs *ctx, struct file *file,
f282d1
     char __user *buf, size_t count)
f282d1
 {
f282d1
     // skip non-sync I/O; see kernel code for __vfs_read()
f282d1
-    if (!(file->f_op->read_iter))
f282d1
+    if (!(file->f_op->aio_read))
f282d1
         return 0;
f282d1
     return trace_rw_entry(ctx, file, buf, count);
f282d1
 }
f282d1
@@ -133,7 +133,7 @@ int trace_write_entry(struct pt_regs *ctx, struct file *file,
f282d1
     char __user *buf, size_t count)
f282d1
 {
f282d1
     // skip non-sync I/O; see kernel code for __vfs_write()
f282d1
-    if (!(file->f_op->write_iter))
f282d1
+    if (!(file->f_op->aio_write))
f282d1
         return 0;
f282d1
     return trace_rw_entry(ctx, file, buf, count);
f282d1
 }
f282d1
@@ -200,8 +200,13 @@ b = BPF(text=bpf_text)
f282d1
 # do_sync_read/do_sync_write), but those became static. So trace these from
f282d1
 # the parent functions, at the cost of more overhead, instead.
f282d1
 # Ultimately, we should be using [V]FS tracepoints.
f282d1
-b.attach_kprobe(event="__vfs_read", fn_name="trace_read_entry")
f282d1
-b.attach_kretprobe(event="__vfs_read", fn_name="trace_read_return")
f282d1
+try:
f282d1
+    b.attach_kprobe(event="__vfs_read", fn_name="trace_read_entry")
f282d1
+    b.attach_kretprobe(event="__vfs_read", fn_name="trace_read_return")
f282d1
+except:
f282d1
+    # older kernels don't have __vfs_read so try vfs_read instead
f282d1
+    b.attach_kprobe(event="vfs_read", fn_name="trace_read_entry")
f282d1
+    b.attach_kretprobe(event="vfs_read", fn_name="trace_read_return")
f282d1
 try:
f282d1
     b.attach_kprobe(event="__vfs_write", fn_name="trace_write_entry")
f282d1
     b.attach_kretprobe(event="__vfs_write", fn_name="trace_write_return")
f282d1
diff --git a/tools/memleak.py b/tools/memleak.py
f282d1
index 5d69538..3cf9ee0 100755
f282d1
--- a/tools/memleak.py
f282d1
+++ b/tools/memleak.py
f282d1
@@ -354,13 +354,21 @@ TRACEPOINT_PROBE(kmem, kmem_cache_free) {
f282d1
         return gen_free_enter((struct pt_regs *)args, (void *)args->ptr);
f282d1
 }
f282d1
 
f282d1
+/*
f282d1
+ * Upstream reads the PFN here, but on RHEL7 kernel this is not available
f282d1
+ * and the address of the pages struct is returned instead. This value is
f282d1
+ * used as the key in a hash to identify each allocation. No other allocation
f282d1
+ * should return an address belonging to mem_map, so there's no risk of
f282d1
+ * colision
f282d1
+ */
f282d1
+
f282d1
 TRACEPOINT_PROBE(kmem, mm_page_alloc) {
f282d1
         gen_alloc_enter((struct pt_regs *)args, PAGE_SIZE << args->order);
f282d1
-        return gen_alloc_exit2((struct pt_regs *)args, args->pfn);
f282d1
+        return gen_alloc_exit2((struct pt_regs *)args, (size_t)args->page);
f282d1
 }
f282d1
 
f282d1
 TRACEPOINT_PROBE(kmem, mm_page_free) {
f282d1
-        return gen_free_enter((struct pt_regs *)args, (void *)args->pfn);
f282d1
+        return gen_free_enter((struct pt_regs *)args, (void *)args->page);
f282d1
 }
f282d1
 """
f282d1
 
f282d1
diff --git a/tools/mountsnoop.py b/tools/mountsnoop.py
f282d1
index 2d0fa1a..bec8993 100755
f282d1
--- a/tools/mountsnoop.py
f282d1
+++ b/tools/mountsnoop.py
f282d1
@@ -24,7 +24,6 @@ bpf_text = r"""
f282d1
 #include <linux/sched.h>
f282d1
 
f282d1
 #include <linux/nsproxy.h>
f282d1
-#include <linux/ns_common.h>
f282d1
 
f282d1
 /*
f282d1
  * XXX: struct mnt_namespace is defined in fs/mount.h, which is private to the
f282d1
@@ -34,7 +33,7 @@ bpf_text = r"""
f282d1
  */
f282d1
 struct mnt_namespace {
f282d1
     atomic_t count;
f282d1
-    struct ns_common ns;
f282d1
+    unsigned int proc_inum;
f282d1
 };
f282d1
 
f282d1
 /*
f282d1
@@ -69,7 +68,7 @@ struct data_t {
f282d1
     union {
f282d1
         /* EVENT_MOUNT, EVENT_UMOUNT */
f282d1
         struct {
f282d1
-            /* current->nsproxy->mnt_ns->ns.inum */
f282d1
+            /* current->nsproxy->proc_inum */
f282d1
             unsigned int mnt_ns;
f282d1
             char comm[TASK_COMM_LEN];
f282d1
             unsigned long flags;
f282d1
@@ -106,7 +105,7 @@ int syscall__mount(struct pt_regs *ctx, char __user *source,
f282d1
     task = (struct task_struct *)bpf_get_current_task();
f282d1
     nsproxy = task->nsproxy;
f282d1
     mnt_ns = nsproxy->mnt_ns;
f282d1
-    event.enter.mnt_ns = mnt_ns->ns.inum;
f282d1
+    event.enter.mnt_ns = mnt_ns->proc_inum;
f282d1
     events.perf_submit(ctx, &event, sizeof(event));
f282d1
 
f282d1
     event.type = EVENT_MOUNT_SOURCE;
f282d1
@@ -161,7 +160,7 @@ int syscall__umount(struct pt_regs *ctx, char __user *target, int flags)
f282d1
     task = (struct task_struct *)bpf_get_current_task();
f282d1
     nsproxy = task->nsproxy;
f282d1
     mnt_ns = nsproxy->mnt_ns;
f282d1
-    event.enter.mnt_ns = mnt_ns->ns.inum;
f282d1
+    event.enter.mnt_ns = mnt_ns->proc_inum;
f282d1
     events.perf_submit(ctx, &event, sizeof(event));
f282d1
 
f282d1
     event.type = EVENT_UMOUNT_TARGET;
f282d1
diff --git a/tools/nfsslower.py b/tools/nfsslower.py
f282d1
index 0f836af..a7018cb 100755
f282d1
--- a/tools/nfsslower.py
f282d1
+++ b/tools/nfsslower.py
f282d1
@@ -65,6 +65,7 @@ bpf_text = """
f282d1
 
f282d1
 #include <uapi/linux/ptrace.h>
f282d1
 #include <linux/fs.h>
f282d1
+#include <linux/aio.h>
f282d1
 #include <linux/sched.h>
f282d1
 #include <linux/dcache.h>
f282d1
 
f282d1
diff --git a/tools/offcputime.py b/tools/offcputime.py
f282d1
index e1f3af9..802fbfd 100755
f282d1
--- a/tools/offcputime.py
f282d1
+++ b/tools/offcputime.py
f282d1
@@ -128,7 +128,9 @@ BPF_HASH(counts, struct key_t);
f282d1
 BPF_HASH(start, u32);
f282d1
 BPF_STACK_TRACE(stack_traces, STACK_STORAGE_SIZE);
f282d1
 
f282d1
-int oncpu(struct pt_regs *ctx, struct task_struct *prev) {
f282d1
+struct rq;
f282d1
+
f282d1
+int oncpu(struct pt_regs *ctx, struct rq *rq, struct task_struct *prev) {
f282d1
     u32 pid = prev->pid;
f282d1
     u32 tgid = prev->tgid;
f282d1
     u64 ts, *tsp;
f282d1
diff --git a/tools/offwaketime.py b/tools/offwaketime.py
f282d1
index 2b78c89..83838c9 100755
f282d1
--- a/tools/offwaketime.py
f282d1
+++ b/tools/offwaketime.py
f282d1
@@ -163,7 +163,9 @@ int waker(struct pt_regs *ctx, struct task_struct *p) {
f282d1
     return 0;
f282d1
 }
f282d1
 
f282d1
-int oncpu(struct pt_regs *ctx, struct task_struct *p) {
f282d1
+struct rq;
f282d1
+
f282d1
+int oncpu(struct pt_regs *ctx, struct rq *rq, struct task_struct *p) {
f282d1
     // PID and TGID of the previous Process (Process going into waiting)
f282d1
     u32 pid = p->pid;
f282d1
     u32 tgid = p->tgid;
f282d1
diff --git a/tools/runqlat.py b/tools/runqlat.py
f282d1
index 9fd4064..0c9bb1c 100755
f282d1
--- a/tools/runqlat.py
f282d1
+++ b/tools/runqlat.py
f282d1
@@ -111,7 +111,7 @@ int trace_ttwu_do_wakeup(struct pt_regs *ctx, struct rq *rq, struct task_struct
f282d1
 }
f282d1
 
f282d1
 // calculate latency
f282d1
-int trace_run(struct pt_regs *ctx, struct task_struct *prev)
f282d1
+int trace_run(struct pt_regs *ctx, struct rq *rq, struct task_struct *prev)
f282d1
 {
f282d1
     u32 pid, tgid;
f282d1
 
f282d1
diff --git a/tools/runqslower.py b/tools/runqslower.py
f282d1
index 7a1869c..b3e3fac 100755
f282d1
--- a/tools/runqslower.py
f282d1
+++ b/tools/runqslower.py
f282d1
@@ -98,7 +98,7 @@ int trace_ttwu_do_wakeup(struct pt_regs *ctx, struct rq *rq, struct task_struct
f282d1
 }
f282d1
 
f282d1
 // calculate latency
f282d1
-int trace_run(struct pt_regs *ctx, struct task_struct *prev)
f282d1
+int trace_run(struct pt_regs *ctx, struct rq *rq, struct task_struct *prev)
f282d1
 {
f282d1
     u32 pid, tgid;
f282d1
 
f282d1
diff --git a/tools/solisten.py b/tools/solisten.py
f282d1
index 6a35f82..a9e8722 100755
f282d1
--- a/tools/solisten.py
f282d1
+++ b/tools/solisten.py
f282d1
@@ -100,7 +100,7 @@ int kprobe__inet_listen(struct pt_regs *ctx, struct socket *sock, int backlog)
f282d1
 
f282d1
         // Get network namespace id, if kernel supports it
f282d1
 #ifdef CONFIG_NET_NS
f282d1
-        evt.netns = sk->__sk_common.skc_net.net->ns.inum;
f282d1
+        evt.netns = sk->__sk_common.skc_net->proc_inum;
f282d1
 #else
f282d1
         evt.netns = 0;
f282d1
 #endif
f282d1
diff --git a/tools/tcpsubnet.py b/tools/tcpsubnet.py
f282d1
index 2779276..f47eea7 100755
f282d1
--- a/tools/tcpsubnet.py
f282d1
+++ b/tools/tcpsubnet.py
f282d1
@@ -110,8 +110,8 @@ struct index_key_t {
f282d1
 
f282d1
 BPF_HASH(ipv4_send_bytes, struct index_key_t);
f282d1
 
f282d1
-int kprobe__tcp_sendmsg(struct pt_regs *ctx, struct sock *sk,
f282d1
-    struct msghdr *msg, size_t size)
f282d1
+int kprobe__tcp_sendmsg(struct pt_regs *ctx, struct kiocb *iocb,
f282d1
+    struct sock *sk, struct msghdr *msg, size_t size)
f282d1
 {
f282d1
     u16 family = sk->__sk_common.skc_family;
f282d1
     u64 *val, zero = 0;
f282d1
diff --git a/tools/tcptracer.py b/tools/tcptracer.py
f282d1
index 5e97ee6..177e860 100755
f282d1
--- a/tools/tcptracer.py
f282d1
+++ b/tools/tcptracer.py
f282d1
@@ -116,7 +116,7 @@ static int read_ipv4_tuple(struct ipv4_tuple_t *tuple, struct sock *skp)
f282d1
   u16 sport = sockp->inet_sport;
f282d1
   u16 dport = skp->__sk_common.skc_dport;
f282d1
 #ifdef CONFIG_NET_NS
f282d1
-  net_ns_inum = skp->__sk_common.skc_net.net->ns.inum;
f282d1
+  net_ns_inum = skp->__sk_common.skc_net->proc_inum;
f282d1
 #endif
f282d1
 
f282d1
   ##FILTER_NETNS##
f282d1
@@ -143,7 +143,7 @@ static int read_ipv6_tuple(struct ipv6_tuple_t *tuple, struct sock *skp)
f282d1
   u16 sport = sockp->inet_sport;
f282d1
   u16 dport = skp->__sk_common.skc_dport;
f282d1
 #ifdef CONFIG_NET_NS
f282d1
-  net_ns_inum = skp->__sk_common.skc_net.net->ns.inum;
f282d1
+  net_ns_inum = skp->__sk_common.skc_net->proc_inum;
f282d1
 #endif
f282d1
   bpf_probe_read(&saddr, sizeof(saddr),
f282d1
                  skp->__sk_common.skc_v6_rcv_saddr.in6_u.u6_addr32);
f282d1
@@ -361,8 +361,7 @@ int trace_close_entry(struct pt_regs *ctx, struct sock *skp)
f282d1
   // Don't generate close events for connections that were never
f282d1
   // established in the first place.
f282d1
   if (oldstate == TCP_SYN_SENT ||
f282d1
-      oldstate == TCP_SYN_RECV ||
f282d1
-      oldstate == TCP_NEW_SYN_RECV)
f282d1
+      oldstate == TCP_SYN_RECV )
f282d1
       return 0;
f282d1
 
f282d1
   u8 ipver = 0;
f282d1
@@ -433,7 +432,7 @@ int trace_accept_return(struct pt_regs *ctx)
f282d1
 
f282d1
   // Get network namespace id, if kernel supports it
f282d1
 #ifdef CONFIG_NET_NS
f282d1
-  net_ns_inum = newsk->__sk_common.skc_net.net->ns.inum;
f282d1
+  net_ns_inum = newsk->__sk_common.skc_net->proc_inum;
f282d1
 #endif
f282d1
 
f282d1
   ##FILTER_NETNS##
f282d1
diff --git a/tools/xfsdist.py b/tools/xfsdist.py
f282d1
index f409f90..2976f9e 100755
f282d1
--- a/tools/xfsdist.py
f282d1
+++ b/tools/xfsdist.py
f282d1
@@ -137,12 +137,12 @@ bpf_text = bpf_text.replace('FACTOR', str(factor))
f282d1
 b = BPF(text=bpf_text)
f282d1
 
f282d1
 # common file functions
f282d1
-b.attach_kprobe(event="xfs_file_read_iter", fn_name="trace_entry")
f282d1
-b.attach_kprobe(event="xfs_file_write_iter", fn_name="trace_entry")
f282d1
+b.attach_kprobe(event="xfs_file_aio_read", fn_name="trace_entry")
f282d1
+b.attach_kprobe(event="xfs_file_aio_write", fn_name="trace_entry")
f282d1
 b.attach_kprobe(event="xfs_file_open", fn_name="trace_entry")
f282d1
 b.attach_kprobe(event="xfs_file_fsync", fn_name="trace_entry")
f282d1
-b.attach_kretprobe(event="xfs_file_read_iter", fn_name="trace_read_return")
f282d1
-b.attach_kretprobe(event="xfs_file_write_iter", fn_name="trace_write_return")
f282d1
+b.attach_kretprobe(event="xfs_file_aio_read", fn_name="trace_read_return")
f282d1
+b.attach_kretprobe(event="xfs_file_aio_write", fn_name="trace_write_return")
f282d1
 b.attach_kretprobe(event="xfs_file_open", fn_name="trace_open_return")
f282d1
 b.attach_kretprobe(event="xfs_file_fsync", fn_name="trace_fsync_return")
f282d1
 
f282d1
diff --git a/tools/xfsslower.py b/tools/xfsslower.py
f282d1
index da70c57..4320284 100755
f282d1
--- a/tools/xfsslower.py
f282d1
+++ b/tools/xfsslower.py
f282d1
@@ -60,6 +60,7 @@ debug = 0
f282d1
 bpf_text = """
f282d1
 #include <uapi/linux/ptrace.h>
f282d1
 #include <linux/fs.h>
f282d1
+#include <linux/aio.h>
f282d1
 #include <linux/sched.h>
f282d1
 #include <linux/dcache.h>
f282d1
 
f282d1
@@ -94,7 +95,7 @@ BPF_PERF_OUTPUT(events);
f282d1
 // Store timestamp and size on entry
f282d1
 //
f282d1
 
f282d1
-// xfs_file_read_iter(), xfs_file_write_iter():
f282d1
+// xfs_file_aio_read(), xfs_file_aio_write():
f282d1
 int trace_rw_entry(struct pt_regs *ctx, struct kiocb *iocb)
f282d1
 {
f282d1
     u64 id = bpf_get_current_pid_tgid();
f282d1
@@ -273,12 +274,12 @@ TASK_COMM_LEN = 16      # linux/sched.h
f282d1
 b = BPF(text=bpf_text)
f282d1
 
f282d1
 # common file functions
f282d1
-b.attach_kprobe(event="xfs_file_read_iter", fn_name="trace_rw_entry")
f282d1
-b.attach_kprobe(event="xfs_file_write_iter", fn_name="trace_rw_entry")
f282d1
+b.attach_kprobe(event="xfs_file_aio_read", fn_name="trace_rw_entry")
f282d1
+b.attach_kprobe(event="xfs_file_aio_write", fn_name="trace_rw_entry")
f282d1
 b.attach_kprobe(event="xfs_file_open", fn_name="trace_open_entry")
f282d1
 b.attach_kprobe(event="xfs_file_fsync", fn_name="trace_fsync_entry")
f282d1
-b.attach_kretprobe(event="xfs_file_read_iter", fn_name="trace_read_return")
f282d1
-b.attach_kretprobe(event="xfs_file_write_iter", fn_name="trace_write_return")
f282d1
+b.attach_kretprobe(event="xfs_file_aio_read", fn_name="trace_read_return")
f282d1
+b.attach_kretprobe(event="xfs_file_aio_write", fn_name="trace_write_return")
f282d1
 b.attach_kretprobe(event="xfs_file_open", fn_name="trace_open_return")
f282d1
 b.attach_kretprobe(event="xfs_file_fsync", fn_name="trace_fsync_return")
f282d1
 
f282d1
-- 
f282d1
2.17.1
f282d1