bcc/tools: Replace bpf_probe_read with bpf_probe_read_kernel

It is recommended to use bpf_probe_read_kernel_{str} in the bpf tools.
See kernel commit 0ebeea8ca8a4 ("bpf: Restrict bpf_probe_read{, str}()
only to archs where they work")

Signed-off-by: Sumanth Korikkar <[email protected]>
Acked-by: Ilya Leoshkevich <[email protected]>
diff --git a/tools/argdist.py b/tools/argdist.py
index 0bc1414..88da0d8 100755
--- a/tools/argdist.py
+++ b/tools/argdist.py
@@ -42,7 +42,7 @@
                         param_name = param[index + 1:].strip()
                         self.param_types[param_name] = param_type
                         # Maintain list of user params. Then later decide to
-                        # switch to bpf_probe_read or bpf_probe_read_user.
+                        # switch to bpf_probe_read_kernel or bpf_probe_read_user.
                         if "__user" in param_type.split():
                                 self.probe_user_list.add(param_name)
 
@@ -299,7 +299,7 @@
                             self.exprs[i] in self.probe_user_list:
                                 probe_readfunc = "bpf_probe_read_user"
                         else:
-                                probe_readfunc = "bpf_probe_read"
+                                probe_readfunc = "bpf_probe_read_kernel"
                         return (text + "        %s(&__key.v%d.s," +
                                 " sizeof(__key.v%d.s), (void *)%s);\n") % \
                                 (probe_readfunc, i, i, self.exprs[i])
diff --git a/tools/bindsnoop.py b/tools/bindsnoop.py
index de569c2..e08ebf8 100755
--- a/tools/bindsnoop.py
+++ b/tools/bindsnoop.py
@@ -215,7 +215,7 @@
     struct inet_sock *sockp = (struct inet_sock *)skp;
 
     u16 sport = 0;
-    bpf_probe_read(&sport, sizeof(sport), &sockp->inet_sport);
+    bpf_probe_read_kernel(&sport, sizeof(sport), &sockp->inet_sport);
     sport = ntohs(sport);
 
     FILTER_PORT
@@ -296,7 +296,7 @@
                struct ipv4_bind_data_t data4 = {.pid = pid, .ip = ipver};
                data4.uid = bpf_get_current_uid_gid();
                data4.ts_us = bpf_ktime_get_ns() / 1000;
-               bpf_probe_read(
+               bpf_probe_read_kernel(
                  &data4.saddr, sizeof(data4.saddr), &sockp->inet_saddr);
                data4.return_code = ret;
                data4.sport = sport;
@@ -309,7 +309,7 @@
     'ipv6': {
         'count': """
                struct ipv6_flow_key_t flow_key = {};
-               bpf_probe_read(&flow_key.saddr, sizeof(flow_key.saddr),
+               bpf_probe_read_kernel(&flow_key.saddr, sizeof(flow_key.saddr),
                    skp->__sk_common.skc_v6_rcv_saddr.in6_u.u6_addr32);
                flow_key.sport = sport;
                ipv6_count.increment(flow_key);""",
@@ -317,7 +317,7 @@
                struct ipv6_bind_data_t data6 = {.pid = pid, .ip = ipver};
                data6.uid = bpf_get_current_uid_gid();
                data6.ts_us = bpf_ktime_get_ns() / 1000;
-               bpf_probe_read(&data6.saddr, sizeof(data6.saddr),
+               bpf_probe_read_kernel(&data6.saddr, sizeof(data6.saddr),
                    skp->__sk_common.skc_v6_rcv_saddr.in6_u.u6_addr32);
                data6.return_code = ret;
                data6.sport = sport;
diff --git a/tools/biolatency.py b/tools/biolatency.py
index 86d9943..c608dcb 100755
--- a/tools/biolatency.py
+++ b/tools/biolatency.py
@@ -112,7 +112,7 @@
     bpf_text = bpf_text.replace('STORE',
         'disk_key_t key = {.slot = bpf_log2l(delta)}; ' +
         'void *__tmp = (void *)req->rq_disk->disk_name; ' +
-        'bpf_probe_read(&key.disk, sizeof(key.disk), __tmp); ' +
+        'bpf_probe_read_kernel(&key.disk, sizeof(key.disk), __tmp); ' +
         'dist.increment(key);')
 elif args.flags:
     bpf_text = bpf_text.replace('STORAGE',
diff --git a/tools/biosnoop.lua b/tools/biosnoop.lua
index 21261d0..8d9b6a1 100755
--- a/tools/biosnoop.lua
+++ b/tools/biosnoop.lua
@@ -90,8 +90,8 @@
         data.pid = valp->pid;
         data.len = req->__data_len;
         data.sector = req->__sector;
-        bpf_probe_read(&data.name, sizeof(data.name), valp->name);
-        bpf_probe_read(&data.disk_name, sizeof(data.disk_name),
+        bpf_probe_read_kernel(&data.name, sizeof(data.name), valp->name);
+        bpf_probe_read_kernel(&data.disk_name, sizeof(data.disk_name),
                        req->rq_disk->disk_name);
     }
 
diff --git a/tools/biosnoop.py b/tools/biosnoop.py
index b550281..ff9b842 100755
--- a/tools/biosnoop.py
+++ b/tools/biosnoop.py
@@ -117,9 +117,9 @@
         data.pid = valp->pid;
         data.len = req->__data_len;
         data.sector = req->__sector;
-        bpf_probe_read(&data.name, sizeof(data.name), valp->name);
+        bpf_probe_read_kernel(&data.name, sizeof(data.name), valp->name);
         struct gendisk *rq_disk = req->rq_disk;
-        bpf_probe_read(&data.disk_name, sizeof(data.disk_name),
+        bpf_probe_read_kernel(&data.disk_name, sizeof(data.disk_name),
                        rq_disk->disk_name);
     }
 
diff --git a/tools/bitesize.py b/tools/bitesize.py
index f4cea7c..6ae71dc 100755
--- a/tools/bitesize.py
+++ b/tools/bitesize.py
@@ -30,7 +30,7 @@
 TRACEPOINT_PROBE(block, block_rq_issue)
 {
     struct proc_key_t key = {.slot = bpf_log2l(args->bytes / 1024)};
-    bpf_probe_read(&key.name, sizeof(key.name), args->comm);
+    bpf_probe_read_kernel(&key.name, sizeof(key.name), args->comm);
     dist.increment(key);
     return 0;
 }
diff --git a/tools/btrfsslower.py b/tools/btrfsslower.py
index b30880a..9e46243 100755
--- a/tools/btrfsslower.py
+++ b/tools/btrfsslower.py
@@ -233,7 +233,7 @@
     qs = de->d_name;
     if (qs.len == 0)
         return 0;
-    bpf_probe_read(&data.file, sizeof(data.file), (void *)qs.name);
+    bpf_probe_read_kernel(&data.file, sizeof(data.file), (void *)qs.name);
 
     // output
     events.perf_submit(ctx, &data, sizeof(data));
diff --git a/tools/compactsnoop.py b/tools/compactsnoop.py
index 7f9ce7e..71ef95b 100755
--- a/tools/compactsnoop.py
+++ b/tools/compactsnoop.py
@@ -108,7 +108,7 @@
 static inline int zone_to_nid_(struct zone *zone)
 {
     int node;
-    bpf_probe_read(&node, sizeof(node), &zone->node);
+    bpf_probe_read_kernel(&node, sizeof(node), &zone->node);
     return node;
 }
 #else
@@ -122,7 +122,7 @@
 static inline int zone_idx_(struct zone *zone)
 {
     struct pglist_data *zone_pgdat = NULL;
-    bpf_probe_read(&zone_pgdat, sizeof(zone_pgdat), &zone->zone_pgdat);
+    bpf_probe_read_kernel(&zone_pgdat, sizeof(zone_pgdat), &zone->zone_pgdat);
     return zone - zone_pgdat->node_zones;
 }
 
@@ -132,13 +132,13 @@
     u64 _watermark[NR_WMARK] = {};
     u64 watermark_boost = 0;
 
-    bpf_probe_read(&_watermark, sizeof(_watermark), &zone->_watermark);
-    bpf_probe_read(&watermark_boost, sizeof(watermark_boost),
+    bpf_probe_read_kernel(&_watermark, sizeof(_watermark), &zone->_watermark);
+    bpf_probe_read_kernel(&watermark_boost, sizeof(watermark_boost),
                     &zone->watermark_boost);
     valp->min = _watermark[WMARK_MIN] + watermark_boost;
     valp->low = _watermark[WMARK_LOW] + watermark_boost;
     valp->high = _watermark[WMARK_HIGH] + watermark_boost;
-    bpf_probe_read(&valp->free, sizeof(valp->free),
+    bpf_probe_read_kernel(&valp->free, sizeof(valp->free),
                     &zone->vm_stat[NR_FREE_PAGES]);
 }
 #endif
diff --git a/tools/dbslower.py b/tools/dbslower.py
index ffbb5e1..9db225f 100755
--- a/tools/dbslower.py
+++ b/tools/dbslower.py
@@ -158,8 +158,8 @@
         data.timestamp = tempp->timestamp;
         data.duration = delta;
 #if defined(MYSQL56) || defined(MYSQL57)
-	// We already copied string to the bpf stack. Hence use bpf_probe_read()
-        bpf_probe_read(&data.query, sizeof(data.query), tempp->query);
+	// We already copied string to the bpf stack. Hence use bpf_probe_read_kernel()
+        bpf_probe_read_kernel(&data.query, sizeof(data.query), tempp->query);
 #else
 	// USDT - we didnt copy string to the bpf stack before.
         bpf_probe_read_user(&data.query, sizeof(data.query), tempp->query);
diff --git a/tools/dcsnoop.py b/tools/dcsnoop.py
index 331ee30..7c50152 100755
--- a/tools/dcsnoop.py
+++ b/tools/dcsnoop.py
@@ -84,7 +84,7 @@
         .type = type,
     };
     bpf_get_current_comm(&data.comm, sizeof(data.comm));
-    bpf_probe_read(&data.filename, sizeof(data.filename), name);
+    bpf_probe_read_kernel(&data.filename, sizeof(data.filename), name);
     events.perf_submit(ctx, &data, sizeof(data));
 }
 
@@ -102,7 +102,7 @@
     struct entry_t entry = {};
     const char *fname = name->name;
     if (fname) {
-        bpf_probe_read(&entry.name, sizeof(entry.name), (void *)fname);
+        bpf_probe_read_kernel(&entry.name, sizeof(entry.name), (void *)fname);
     }
     entrybypid.update(&pid, &entry);
     return 0;
diff --git a/tools/deadlock.c b/tools/deadlock.c
index a6a6d91..b34a207 100644
--- a/tools/deadlock.c
+++ b/tools/deadlock.c
@@ -164,7 +164,7 @@
   // invalid memory access on `leaf->held_mutexes[i]` below. On newer kernels,
   // we can avoid making this extra copy in `value` and use `leaf` directly.
   struct thread_to_held_mutex_leaf_t value = {};
-  bpf_probe_read(&value, sizeof(struct thread_to_held_mutex_leaf_t), leaf);
+  bpf_probe_read_user(&value, sizeof(struct thread_to_held_mutex_leaf_t), leaf);
 
   #pragma unroll
   for (int i = 0; i < MAX_HELD_MUTEXES; ++i) {
diff --git a/tools/drsnoop.py b/tools/drsnoop.py
index 3dc8d7a..e4ea922 100755
--- a/tools/drsnoop.py
+++ b/tools/drsnoop.py
@@ -128,7 +128,7 @@
     if (bpf_get_current_comm(&val.name, sizeof(val.name)) == 0) {
         val.id = id;
         val.ts = bpf_ktime_get_ns();
-        bpf_probe_read(&val.vm_stat, sizeof(val.vm_stat), (const void *)%s);
+        bpf_probe_read_kernel(&val.vm_stat, sizeof(val.vm_stat), (const void *)%s);
         start.update(&id, &val);
     }
     return 0;
@@ -150,8 +150,8 @@
     data.ts = ts / 1000;
     data.id = valp->id;
     data.uid = bpf_get_current_uid_gid();
-    bpf_probe_read(&data.name, sizeof(data.name), valp->name);
-    bpf_probe_read(&data.vm_stat, sizeof(data.vm_stat), valp->vm_stat);
+    bpf_probe_read_kernel(&data.name, sizeof(data.name), valp->name);
+    bpf_probe_read_kernel(&data.vm_stat, sizeof(data.vm_stat), valp->vm_stat);
     data.nr_reclaimed = args->nr_reclaimed;
 
     events.perf_submit(args, &data, sizeof(data));
diff --git a/tools/ext4slower.py b/tools/ext4slower.py
index 0524f22..90663a5 100755
--- a/tools/ext4slower.py
+++ b/tools/ext4slower.py
@@ -226,7 +226,7 @@
     qs = de->d_name;
     if (qs.len == 0)
         return 0;
-    bpf_probe_read(&data.file, sizeof(data.file), (void *)qs.name);
+    bpf_probe_read_kernel(&data.file, sizeof(data.file), (void *)qs.name);
 
     // output
     events.perf_submit(ctx, &data, sizeof(data));
diff --git a/tools/filelife.py b/tools/filelife.py
index 38b6b12..9b7562f 100755
--- a/tools/filelife.py
+++ b/tools/filelife.py
@@ -90,7 +90,7 @@
     if (bpf_get_current_comm(&data.comm, sizeof(data.comm)) == 0) {
         data.pid = pid;
         data.delta = delta;
-        bpf_probe_read(&data.fname, sizeof(data.fname), d_name.name);
+        bpf_probe_read_kernel(&data.fname, sizeof(data.fname), d_name.name);
     }
 
     events.perf_submit(ctx, &data, sizeof(data));
diff --git a/tools/fileslower.py b/tools/fileslower.py
index 31e3adf..21b0e1c 100755
--- a/tools/fileslower.py
+++ b/tools/fileslower.py
@@ -112,7 +112,7 @@
 
     struct qstr d_name = de->d_name;
     val.name_len = d_name.len;
-    bpf_probe_read(&val.name, sizeof(val.name), d_name.name);
+    bpf_probe_read_kernel(&val.name, sizeof(val.name), d_name.name);
     bpf_get_current_comm(&val.comm, sizeof(val.comm));
     entryinfo.update(&pid, &val);
 
@@ -159,8 +159,8 @@
     data.sz = valp->sz;
     data.delta_us = delta_us;
     data.name_len = valp->name_len;
-    bpf_probe_read(&data.name, sizeof(data.name), valp->name);
-    bpf_probe_read(&data.comm, sizeof(data.comm), valp->comm);
+    bpf_probe_read_kernel(&data.name, sizeof(data.name), valp->name);
+    bpf_probe_read_kernel(&data.comm, sizeof(data.comm), valp->comm);
     events.perf_submit(ctx, &data, sizeof(data));
 
     return 0;
diff --git a/tools/filetop.py b/tools/filetop.py
index dbe7a7d..34cfebc 100755
--- a/tools/filetop.py
+++ b/tools/filetop.py
@@ -108,7 +108,7 @@
     struct info_t info = {.pid = pid};
     bpf_get_current_comm(&info.comm, sizeof(info.comm));
     info.name_len = d_name.len;
-    bpf_probe_read(&info.name, sizeof(info.name), d_name.name);
+    bpf_probe_read_kernel(&info.name, sizeof(info.name), d_name.name);
     if (S_ISREG(mode)) {
         info.type = 'R';
     } else if (S_ISSOCK(mode)) {
diff --git a/tools/funcslower.py b/tools/funcslower.py
index 9acd35d..ffa618d 100755
--- a/tools/funcslower.py
+++ b/tools/funcslower.py
@@ -206,7 +206,7 @@
 #endif
 
 #ifdef GRAB_ARGS
-    bpf_probe_read(&data.args[0], sizeof(data.args), entryp->args);
+    bpf_probe_read_kernel(&data.args[0], sizeof(data.args), entryp->args);
 #endif
     bpf_get_current_comm(&data.comm, sizeof(data.comm));
     events.perf_submit(ctx, &data, sizeof(data));
diff --git a/tools/gethostlatency.py b/tools/gethostlatency.py
index a6b8080..0ba5a1e 100755
--- a/tools/gethostlatency.py
+++ b/tools/gethostlatency.py
@@ -86,8 +86,8 @@
     if (valp == 0)
         return 0;       // missed start
 
-    bpf_probe_read(&data.comm, sizeof(data.comm), valp->comm);
-    bpf_probe_read(&data.host, sizeof(data.host), (void *)valp->host);
+    bpf_probe_read_kernel(&data.comm, sizeof(data.comm), valp->comm);
+    bpf_probe_read_kernel(&data.host, sizeof(data.host), (void *)valp->host);
     data.pid = valp->pid;
     data.delta = tsp - valp->ts;
     events.perf_submit(ctx, &data, sizeof(data));
diff --git a/tools/hardirqs.py b/tools/hardirqs.py
index 589a890..fda804d 100755
--- a/tools/hardirqs.py
+++ b/tools/hardirqs.py
@@ -83,7 +83,7 @@
     char *name = (char *)action->name;
 
     irq_key_t key = {.slot = 0 /* ignore */};
-    bpf_probe_read(&key.name, sizeof(key.name), name);
+    bpf_probe_read_kernel(&key.name, sizeof(key.name), name);
     dist.increment(key);
 
     return 0;
@@ -129,12 +129,12 @@
 if args.dist:
     bpf_text = bpf_text.replace('STORE',
         'irq_key_t key = {.slot = bpf_log2l(delta / %d)};' % factor +
-        'bpf_probe_read(&key.name, sizeof(key.name), name);' +
+        'bpf_probe_read_kernel(&key.name, sizeof(key.name), name);' +
         'dist.increment(key);')
 else:
     bpf_text = bpf_text.replace('STORE',
         'irq_key_t key = {.slot = 0 /* ignore */};' +
-        'bpf_probe_read(&key.name, sizeof(key.name), name);' +
+        'bpf_probe_read_kernel(&key.name, sizeof(key.name), name);' +
         'dist.increment(key, delta);')
 if debug or args.ebpf:
     print(bpf_text)
diff --git a/tools/killsnoop.py b/tools/killsnoop.py
index 2fb1dcb..977c6bb 100755
--- a/tools/killsnoop.py
+++ b/tools/killsnoop.py
@@ -87,7 +87,7 @@
         return 0;
     }
 
-    bpf_probe_read(&data.comm, sizeof(data.comm), valp->comm);
+    bpf_probe_read_kernel(&data.comm, sizeof(data.comm), valp->comm);
     data.pid = pid;
     data.tpid = valp->tpid;
     data.ret = PT_REGS_RC(ctx);
diff --git a/tools/mdflush.py b/tools/mdflush.py
index f1c68ae..2abe15c 100755
--- a/tools/mdflush.py
+++ b/tools/mdflush.py
@@ -47,7 +47,7 @@
 #else
     struct gendisk *bi_disk = bio->bi_bdev->bd_disk;
 #endif
-    bpf_probe_read(&data.disk, sizeof(data.disk), bi_disk->disk_name);
+    bpf_probe_read_kernel(&data.disk, sizeof(data.disk), bi_disk->disk_name);
     events.perf_submit(ctx, &data, sizeof(data));
     return 0;
 }
diff --git a/tools/memleak.py b/tools/memleak.py
index 9fa6805..5399019 100755
--- a/tools/memleak.py
+++ b/tools/memleak.py
@@ -287,7 +287,7 @@
 
         memptrs.delete(&pid);
 
-        if (bpf_probe_read(&addr, sizeof(void*), (void*)(size_t)*memptr64))
+        if (bpf_probe_read_user(&addr, sizeof(void*), (void*)(size_t)*memptr64))
                 return 0;
 
         u64 addr64 = (u64)(size_t)addr;
diff --git a/tools/nfsslower.py b/tools/nfsslower.py
index 5e344b9..6b94f34 100755
--- a/tools/nfsslower.py
+++ b/tools/nfsslower.py
@@ -190,18 +190,18 @@
     struct qstr qs = {};
     if(type == TRACE_GETATTR)
     {
-        bpf_probe_read(&de,sizeof(de), &valp->d);
+        bpf_probe_read_kernel(&de,sizeof(de), &valp->d);
     }
     else
     {
-        bpf_probe_read(&de, sizeof(de), &valp->fp->f_path.dentry);
+        bpf_probe_read_kernel(&de, sizeof(de), &valp->fp->f_path.dentry);
     }
 
-    bpf_probe_read(&qs, sizeof(qs), (void *)&de->d_name);
+    bpf_probe_read_kernel(&qs, sizeof(qs), (void *)&de->d_name);
     if (qs.len == 0)
         return 0;
 
-    bpf_probe_read(&data.file, sizeof(data.file), (void *)qs.name);
+    bpf_probe_read_kernel(&data.file, sizeof(data.file), (void *)qs.name);
     // output
     events.perf_submit(ctx, &data, sizeof(data));
     return 0;
diff --git a/tools/oomkill.py b/tools/oomkill.py
index 298e353..3d6e927 100755
--- a/tools/oomkill.py
+++ b/tools/oomkill.py
@@ -45,7 +45,7 @@
     data.tpid = p->pid;
     data.pages = oc->totalpages;
     bpf_get_current_comm(&data.fcomm, sizeof(data.fcomm));
-    bpf_probe_read(&data.tcomm, sizeof(data.tcomm), p->comm);
+    bpf_probe_read_kernel(&data.tcomm, sizeof(data.tcomm), p->comm);
     events.perf_submit(ctx, &data, sizeof(data));
 }
 """
diff --git a/tools/opensnoop.py b/tools/opensnoop.py
index a68b13f..dffb021 100755
--- a/tools/opensnoop.py
+++ b/tools/opensnoop.py
@@ -151,7 +151,7 @@
         // missed entry
         return 0;
     }
-    bpf_probe_read(&data.comm, sizeof(data.comm), valp->comm);
+    bpf_probe_read_kernel(&data.comm, sizeof(data.comm), valp->comm);
     bpf_probe_read_user(&data.fname, sizeof(data.fname), (void *)valp->fname);
     data.id = valp->id;
     data.ts = tsp / 1000;
diff --git a/tools/runqslower.py b/tools/runqslower.py
index 8f79060..c8b832c 100755
--- a/tools/runqslower.py
+++ b/tools/runqslower.py
@@ -28,7 +28,7 @@
 # Licensed under the Apache License, Version 2.0 (the "License")
 #
 # 02-May-2018   Ivan Babrou   Created this.
-# 18-Nov-2019   Gergely Bod   BUG fix: Use bpf_probe_read_str() to extract the
+# 18-Nov-2019   Gergely Bod   BUG fix: Use bpf_probe_read_kernel_str() to extract the
 #                               process name from 'task_struct* next' in raw tp code.
 #                               bpf_get_current_comm() operates on the current task
 #                               which might already be different than 'next'.
@@ -164,8 +164,8 @@
     struct task_struct *p = (struct task_struct *)ctx->args[0];
     u32 tgid, pid;
 
-    bpf_probe_read(&tgid, sizeof(tgid), &p->tgid);
-    bpf_probe_read(&pid, sizeof(pid), &p->pid);
+    bpf_probe_read_kernel(&tgid, sizeof(tgid), &p->tgid);
+    bpf_probe_read_kernel(&pid, sizeof(pid), &p->pid);
     return trace_enqueue(tgid, pid);
 }
 
@@ -178,10 +178,10 @@
     long state;
 
     // ivcsw: treat like an enqueue event and store timestamp
-    bpf_probe_read(&state, sizeof(long), (const void *)&prev->state);
+    bpf_probe_read_kernel(&state, sizeof(long), (const void *)&prev->state);
     if (state == TASK_RUNNING) {
-        bpf_probe_read(&tgid, sizeof(prev->tgid), &prev->tgid);
-        bpf_probe_read(&pid, sizeof(prev->pid), &prev->pid);
+        bpf_probe_read_kernel(&tgid, sizeof(prev->tgid), &prev->tgid);
+        bpf_probe_read_kernel(&pid, sizeof(prev->pid), &prev->pid);
         u64 ts = bpf_ktime_get_ns();
         if (pid != 0) {
             if (!(FILTER_PID) && !(FILTER_TGID)) {
@@ -191,7 +191,7 @@
 
     }
 
-    bpf_probe_read(&pid, sizeof(next->pid), &next->pid);
+    bpf_probe_read_kernel(&pid, sizeof(next->pid), &next->pid);
 
     u64 *tsp, delta_us;
 
@@ -208,7 +208,7 @@
     struct data_t data = {};
     data.pid = pid;
     data.delta_us = delta_us;
-    bpf_probe_read_str(&data.task, sizeof(data.task), next->comm);
+    bpf_probe_read_kernel_str(&data.task, sizeof(data.task), next->comm);
 
     // output
     events.perf_submit(ctx, &data, sizeof(data));
diff --git a/tools/slabratetop.py b/tools/slabratetop.py
index b947e44..066f79d 100755
--- a/tools/slabratetop.py
+++ b/tools/slabratetop.py
@@ -88,7 +88,7 @@
 {
     struct info_t info = {};
     const char *name = cachep->name;
-    bpf_probe_read(&info.name, sizeof(info.name), name);
+    bpf_probe_read_kernel(&info.name, sizeof(info.name), name);
 
     struct val_t *valp, zero = {};
     valp = counts.lookup_or_try_init(&info, &zero);
diff --git a/tools/sofdsnoop.py b/tools/sofdsnoop.py
index 6df7fca..9bd5bb3 100755
--- a/tools/sofdsnoop.py
+++ b/tools/sofdsnoop.py
@@ -105,7 +105,7 @@
 {
     val->fd_cnt = min(num, MAX_FD);
 
-    if (bpf_probe_read(&val->fd[0], MAX_FD * sizeof(int), data))
+    if (bpf_probe_read_kernel(&val->fd[0], MAX_FD * sizeof(int), data))
         return -1;
 
     events.perf_submit(ctx, val, sizeof(*val));
diff --git a/tools/solisten.py b/tools/solisten.py
index fc066d8..71c0a29 100755
--- a/tools/solisten.py
+++ b/tools/solisten.py
@@ -111,7 +111,7 @@
         if (family == AF_INET) {
             evt.laddr[0] = inet->inet_rcv_saddr;
         } else if (family == AF_INET6) {
-            bpf_probe_read(evt.laddr, sizeof(evt.laddr),
+            bpf_probe_read_kernel(evt.laddr, sizeof(evt.laddr),
                            sk->__sk_common.skc_v6_rcv_saddr.in6_u.u6_addr32);
         }
 
diff --git a/tools/tcpaccept.py b/tools/tcpaccept.py
index 4aa7fd7..1a5f1c7 100755
--- a/tools/tcpaccept.py
+++ b/tools/tcpaccept.py
@@ -117,7 +117,7 @@
     // because the sk_wmem_queued is not following the bitfield of sk_protocol.
     // And the following member is sk_gso_max_segs.
     // So, we can use this:
-    // bpf_probe_read(&protocol, 1, (void *)((u64)&newsk->sk_gso_max_segs) - 3);
+    // bpf_probe_read_kernel(&protocol, 1, (void *)((u64)&newsk->sk_gso_max_segs) - 3);
     // In order to  diff the pre-4.10 and 4.10+ ,introduce the variables gso_max_segs_offset,sk_lingertime,
     // sk_lingertime is closed to the gso_max_segs_offset,and
     // the offset between the two members is 4
@@ -167,9 +167,9 @@
     } else if (family == AF_INET6) {
         struct ipv6_data_t data6 = {.pid = pid, .ip = 6};
         data6.ts_us = bpf_ktime_get_ns() / 1000;
-        bpf_probe_read(&data6.saddr, sizeof(data6.saddr),
+        bpf_probe_read_kernel(&data6.saddr, sizeof(data6.saddr),
             &newsk->__sk_common.skc_v6_rcv_saddr.in6_u.u6_addr32);
-        bpf_probe_read(&data6.daddr, sizeof(data6.daddr),
+        bpf_probe_read_kernel(&data6.daddr, sizeof(data6.daddr),
             &newsk->__sk_common.skc_v6_daddr.in6_u.u6_addr32);
         data6.lport = lport;
         data6.dport = dport;
diff --git a/tools/tcpconnect.py b/tools/tcpconnect.py
index 40878ee..8cb6e4d 100755
--- a/tools/tcpconnect.py
+++ b/tools/tcpconnect.py
@@ -205,9 +205,9 @@
         { 'count' :
                """
                struct ipv6_flow_key_t flow_key = {};
-               bpf_probe_read(&flow_key.saddr, sizeof(flow_key.saddr),
+               bpf_probe_read_kernel(&flow_key.saddr, sizeof(flow_key.saddr),
                    skp->__sk_common.skc_v6_rcv_saddr.in6_u.u6_addr32);
-               bpf_probe_read(&flow_key.daddr, sizeof(flow_key.daddr),
+               bpf_probe_read_kernel(&flow_key.daddr, sizeof(flow_key.daddr),
                    skp->__sk_common.skc_v6_daddr.in6_u.u6_addr32);
                flow_key.dport = ntohs(dport);
                ipv6_count.increment(flow_key);""",
@@ -216,9 +216,9 @@
                struct ipv6_data_t data6 = {.pid = pid, .ip = ipver};
                data6.uid = bpf_get_current_uid_gid();
                data6.ts_us = bpf_ktime_get_ns() / 1000;
-               bpf_probe_read(&data6.saddr, sizeof(data6.saddr),
+               bpf_probe_read_kernel(&data6.saddr, sizeof(data6.saddr),
                    skp->__sk_common.skc_v6_rcv_saddr.in6_u.u6_addr32);
-               bpf_probe_read(&data6.daddr, sizeof(data6.daddr),
+               bpf_probe_read_kernel(&data6.daddr, sizeof(data6.daddr),
                    skp->__sk_common.skc_v6_daddr.in6_u.u6_addr32);
                data6.dport = ntohs(dport);
                bpf_get_current_comm(&data6.task, sizeof(data6.task));
diff --git a/tools/tcpconnlat.py b/tools/tcpconnlat.py
index be6bbbf..e28a43a 100755
--- a/tools/tcpconnlat.py
+++ b/tools/tcpconnlat.py
@@ -160,9 +160,9 @@
     } else /* AF_INET6 */ {
         struct ipv6_data_t data6 = {.pid = infop->pid, .ip = 6};
         data6.ts_us = now / 1000;
-        bpf_probe_read(&data6.saddr, sizeof(data6.saddr),
+        bpf_probe_read_kernel(&data6.saddr, sizeof(data6.saddr),
             skp->__sk_common.skc_v6_rcv_saddr.in6_u.u6_addr32);
-        bpf_probe_read(&data6.daddr, sizeof(data6.daddr),
+        bpf_probe_read_kernel(&data6.daddr, sizeof(data6.daddr),
             skp->__sk_common.skc_v6_daddr.in6_u.u6_addr32);
         data6.dport = ntohs(dport);
         data6.delta_us = delta_us;
diff --git a/tools/tcpdrop.py b/tools/tcpdrop.py
index 14515f7..aceff87 100755
--- a/tools/tcpdrop.py
+++ b/tools/tcpdrop.py
@@ -128,9 +128,9 @@
         struct ipv6_data_t data6 = {};
         data6.pid = pid;
         data6.ip = 6;
-        bpf_probe_read(&data6.saddr, sizeof(data6.saddr),
+        bpf_probe_read_kernel(&data6.saddr, sizeof(data6.saddr),
             sk->__sk_common.skc_v6_rcv_saddr.in6_u.u6_addr32);
-        bpf_probe_read(&data6.daddr, sizeof(data6.daddr),
+        bpf_probe_read_kernel(&data6.daddr, sizeof(data6.daddr),
             sk->__sk_common.skc_v6_daddr.in6_u.u6_addr32);
         data6.dport = dport;
         data6.sport = sport;
diff --git a/tools/tcplife.lua b/tools/tcplife.lua
index 3f4f6af..3e18011 100755
--- a/tools/tcplife.lua
+++ b/tools/tcplife.lua
@@ -154,7 +154,7 @@
         if (mep == 0) {
             bpf_get_current_comm(&data4.task, sizeof(data4.task));
         } else {
-            bpf_probe_read(&data4.task, sizeof(data4.task), (void *)mep->task);
+            bpf_probe_read_kernel(&data4.task, sizeof(data4.task), (void *)mep->task);
         }
         ipv4_events.perf_submit(ctx, &data4, sizeof(data4));
 
@@ -162,9 +162,9 @@
         struct ipv6_data_t data6 = {.span_us = delta_us,
             .rx_b = rx_b, .tx_b = tx_b};
         data6.ts_us = bpf_ktime_get_ns() / 1000;
-        bpf_probe_read(&data6.saddr, sizeof(data6.saddr),
+        bpf_probe_read_kernel(&data6.saddr, sizeof(data6.saddr),
             sk->__sk_common.skc_v6_rcv_saddr.in6_u.u6_addr32);
-        bpf_probe_read(&data6.daddr, sizeof(data6.daddr),
+        bpf_probe_read_kernel(&data6.daddr, sizeof(data6.daddr),
             sk->__sk_common.skc_v6_daddr.in6_u.u6_addr32);
         // a workaround until data6 compiles with separate lport/dport
         data6.ports = ntohs(dport) + ((0ULL + lport) << 32);
@@ -172,7 +172,7 @@
         if (mep == 0) {
             bpf_get_current_comm(&data6.task, sizeof(data6.task));
         } else {
-            bpf_probe_read(&data6.task, sizeof(data6.task), (void *)mep->task);
+            bpf_probe_read_kernel(&data6.task, sizeof(data6.task), (void *)mep->task);
         }
         ipv6_events.perf_submit(ctx, &data6, sizeof(data6));
     }
diff --git a/tools/tcplife.py b/tools/tcplife.py
index 980eebb..1600a3c 100755
--- a/tools/tcplife.py
+++ b/tools/tcplife.py
@@ -206,7 +206,7 @@
         if (mep == 0) {
             bpf_get_current_comm(&data4.task, sizeof(data4.task));
         } else {
-            bpf_probe_read(&data4.task, sizeof(data4.task), (void *)mep->task);
+            bpf_probe_read_kernel(&data4.task, sizeof(data4.task), (void *)mep->task);
         }
         ipv4_events.perf_submit(ctx, &data4, sizeof(data4));
 
@@ -216,9 +216,9 @@
         data6.rx_b = rx_b;
         data6.tx_b = tx_b;
         data6.ts_us = bpf_ktime_get_ns() / 1000;
-        bpf_probe_read(&data6.saddr, sizeof(data6.saddr),
+        bpf_probe_read_kernel(&data6.saddr, sizeof(data6.saddr),
             sk->__sk_common.skc_v6_rcv_saddr.in6_u.u6_addr32);
-        bpf_probe_read(&data6.daddr, sizeof(data6.daddr),
+        bpf_probe_read_kernel(&data6.daddr, sizeof(data6.daddr),
             sk->__sk_common.skc_v6_daddr.in6_u.u6_addr32);
         // a workaround until data6 compiles with separate lport/dport
         data6.ports = dport + ((0ULL + lport) << 32);
@@ -226,7 +226,7 @@
         if (mep == 0) {
             bpf_get_current_comm(&data6.task, sizeof(data6.task));
         } else {
-            bpf_probe_read(&data6.task, sizeof(data6.task), (void *)mep->task);
+            bpf_probe_read_kernel(&data6.task, sizeof(data6.task), (void *)mep->task);
         }
         ipv6_events.perf_submit(ctx, &data6, sizeof(data6));
     }
@@ -332,7 +332,7 @@
         if (mep == 0) {
             bpf_get_current_comm(&data4.task, sizeof(data4.task));
         } else {
-            bpf_probe_read(&data4.task, sizeof(data4.task), (void *)mep->task);
+            bpf_probe_read_kernel(&data4.task, sizeof(data4.task), (void *)mep->task);
         }
         ipv4_events.perf_submit(args, &data4, sizeof(data4));
 
@@ -350,7 +350,7 @@
         if (mep == 0) {
             bpf_get_current_comm(&data6.task, sizeof(data6.task));
         } else {
-            bpf_probe_read(&data6.task, sizeof(data6.task), (void *)mep->task);
+            bpf_probe_read_kernel(&data6.task, sizeof(data6.task), (void *)mep->task);
         }
         ipv6_events.perf_submit(args, &data6, sizeof(data6));
     }
diff --git a/tools/tcpretrans.py b/tools/tcpretrans.py
index 1b2636a..7785d9b 100755
--- a/tools/tcpretrans.py
+++ b/tools/tcpretrans.py
@@ -180,9 +180,9 @@
         { 'count' :
             """
                     struct ipv6_flow_key_t flow_key = {};
-                    bpf_probe_read(&flow_key.saddr, sizeof(flow_key.saddr),
+                    bpf_probe_read_kernel(&flow_key.saddr, sizeof(flow_key.saddr),
                         skp->__sk_common.skc_v6_rcv_saddr.in6_u.u6_addr32);
-                    bpf_probe_read(&flow_key.daddr, sizeof(flow_key.daddr),
+                    bpf_probe_read_kernel(&flow_key.daddr, sizeof(flow_key.daddr),
                         skp->__sk_common.skc_v6_daddr.in6_u.u6_addr32);
                     // lport is host order
                     flow_key.lport = lport;
@@ -192,9 +192,9 @@
                     data6.pid = pid;
                     data6.ip = 6;
                     data6.type = type;
-                    bpf_probe_read(&data6.saddr, sizeof(data6.saddr),
+                    bpf_probe_read_kernel(&data6.saddr, sizeof(data6.saddr),
                         skp->__sk_common.skc_v6_rcv_saddr.in6_u.u6_addr32);
-                    bpf_probe_read(&data6.daddr, sizeof(data6.daddr),
+                    bpf_probe_read_kernel(&data6.daddr, sizeof(data6.daddr),
                         skp->__sk_common.skc_v6_daddr.in6_u.u6_addr32);
                     // lport is host order
                     data6.lport = lport;
diff --git a/tools/tcpstates.py b/tools/tcpstates.py
index 48f8788..7681822 100755
--- a/tools/tcpstates.py
+++ b/tools/tcpstates.py
@@ -178,7 +178,7 @@
     // because the sk_wmem_queued is not following the bitfield of sk_protocol.
     // And the following member is sk_gso_max_segs.
     // So, we can use this:
-    // bpf_probe_read(&protocol, 1, (void *)((u64)&newsk->sk_gso_max_segs) - 3);
+    // bpf_probe_read_kernel(&protocol, 1, (void *)((u64)&newsk->sk_gso_max_segs) - 3);
     // In order to  diff the pre-4.10 and 4.10+ ,introduce the variables gso_max_segs_offset,sk_lingertime,
     // sk_lingertime is closed to the gso_max_segs_offset,and
     // the offset between the two members is 4
@@ -189,16 +189,16 @@
     if (sk_lingertime_offset - gso_max_segs_offset == 4)
         // 4.10+ with little endian
 #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
-        bpf_probe_read(&protocol, 1, (void *)((u64)&sk->sk_gso_max_segs) - 3);
+        bpf_probe_read_kernel(&protocol, 1, (void *)((u64)&sk->sk_gso_max_segs) - 3);
 else
         // pre-4.10 with little endian
-        bpf_probe_read(&protocol, 1, (void *)((u64)&sk->sk_wmem_queued) - 3);
+        bpf_probe_read_kernel(&protocol, 1, (void *)((u64)&sk->sk_wmem_queued) - 3);
 #elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
         // 4.10+ with big endian
-        bpf_probe_read(&protocol, 1, (void *)((u64)&sk->sk_gso_max_segs) - 1);
+        bpf_probe_read_kernel(&protocol, 1, (void *)((u64)&sk->sk_gso_max_segs) - 1);
 else
         // pre-4.10 with big endian
-        bpf_probe_read(&protocol, 1, (void *)((u64)&sk->sk_wmem_queued) - 1);
+        bpf_probe_read_kernel(&protocol, 1, (void *)((u64)&sk->sk_wmem_queued) - 1);
 #else
 # error "Fix your compiler's __BYTE_ORDER__?!"
 #endif
@@ -250,9 +250,9 @@
             .newstate = state };
         data6.skaddr = (u64)sk;
         data6.ts_us = bpf_ktime_get_ns() / 1000;
-        bpf_probe_read(&data6.saddr, sizeof(data6.saddr),
+        bpf_probe_read_kernel(&data6.saddr, sizeof(data6.saddr),
             sk->__sk_common.skc_v6_rcv_saddr.in6_u.u6_addr32);
-        bpf_probe_read(&data6.daddr, sizeof(data6.daddr),
+        bpf_probe_read_kernel(&data6.daddr, sizeof(data6.daddr),
             sk->__sk_common.skc_v6_daddr.in6_u.u6_addr32);
         // a workaround until data6 compiles with separate lport/dport
         data6.ports = dport + ((0ULL + lport) << 16);
diff --git a/tools/tcptop.py b/tools/tcptop.py
index 510c4e8..e9d0d1a 100755
--- a/tools/tcptop.py
+++ b/tools/tcptop.py
@@ -125,9 +125,9 @@
 
     } else if (family == AF_INET6) {
         struct ipv6_key_t ipv6_key = {.pid = pid};
-        bpf_probe_read(&ipv6_key.saddr, sizeof(ipv6_key.saddr),
+        bpf_probe_read_kernel(&ipv6_key.saddr, sizeof(ipv6_key.saddr),
             &sk->__sk_common.skc_v6_rcv_saddr.in6_u.u6_addr32);
-        bpf_probe_read(&ipv6_key.daddr, sizeof(ipv6_key.daddr),
+        bpf_probe_read_kernel(&ipv6_key.daddr, sizeof(ipv6_key.daddr),
             &sk->__sk_common.skc_v6_daddr.in6_u.u6_addr32);
         ipv6_key.lport = sk->__sk_common.skc_num;
         dport = sk->__sk_common.skc_dport;
@@ -171,9 +171,9 @@
 
     } else if (family == AF_INET6) {
         struct ipv6_key_t ipv6_key = {.pid = pid};
-        bpf_probe_read(&ipv6_key.saddr, sizeof(ipv6_key.saddr),
+        bpf_probe_read_kernel(&ipv6_key.saddr, sizeof(ipv6_key.saddr),
             &sk->__sk_common.skc_v6_rcv_saddr.in6_u.u6_addr32);
-        bpf_probe_read(&ipv6_key.daddr, sizeof(ipv6_key.daddr),
+        bpf_probe_read_kernel(&ipv6_key.daddr, sizeof(ipv6_key.daddr),
             &sk->__sk_common.skc_v6_daddr.in6_u.u6_addr32);
         ipv6_key.lport = sk->__sk_common.skc_num;
         dport = sk->__sk_common.skc_dport;
diff --git a/tools/tcptracer.py b/tools/tcptracer.py
index 7f67d33..2e486b1 100755
--- a/tools/tcptracer.py
+++ b/tools/tcptracer.py
@@ -149,9 +149,9 @@
 #ifdef CONFIG_NET_NS
   net_ns_inum = skp->__sk_common.skc_net.net->ns.inum;
 #endif
-  bpf_probe_read(&saddr, sizeof(saddr),
+  bpf_probe_read_kernel(&saddr, sizeof(saddr),
                  skp->__sk_common.skc_v6_rcv_saddr.in6_u.u6_addr32);
-  bpf_probe_read(&daddr, sizeof(daddr),
+  bpf_probe_read_kernel(&daddr, sizeof(daddr),
                  skp->__sk_common.skc_v6_daddr.in6_u.u6_addr32);
 
   ##FILTER_NETNS##
@@ -491,9 +491,9 @@
       evt6.pid = pid >> 32;
       evt6.ip = ipver;
 
-      bpf_probe_read(&evt6.saddr, sizeof(evt6.saddr),
+      bpf_probe_read_kernel(&evt6.saddr, sizeof(evt6.saddr),
                      newsk->__sk_common.skc_v6_rcv_saddr.in6_u.u6_addr32);
-      bpf_probe_read(&evt6.daddr, sizeof(evt6.daddr),
+      bpf_probe_read_kernel(&evt6.daddr, sizeof(evt6.daddr),
                      newsk->__sk_common.skc_v6_daddr.in6_u.u6_addr32);
 
       evt6.sport = lport;
diff --git a/tools/trace.py b/tools/trace.py
index add3f3e..9c44a4a 100755
--- a/tools/trace.py
+++ b/tools/trace.py
@@ -238,17 +238,17 @@
 
         aliases_indarg = {
                 "arg1": "({u64 _val; struct pt_regs *_ctx = (struct pt_regs *)PT_REGS_PARM1(ctx);"
-                        "  bpf_probe_read(&_val, sizeof(_val), &(PT_REGS_PARM1(_ctx))); _val;})",
+                        "  bpf_probe_read_kernel(&_val, sizeof(_val), &(PT_REGS_PARM1(_ctx))); _val;})",
                 "arg2": "({u64 _val; struct pt_regs *_ctx = (struct pt_regs *)PT_REGS_PARM1(ctx);"
-                        "  bpf_probe_read(&_val, sizeof(_val), &(PT_REGS_PARM2(_ctx))); _val;})",
+                        "  bpf_probe_read_kernel(&_val, sizeof(_val), &(PT_REGS_PARM2(_ctx))); _val;})",
                 "arg3": "({u64 _val; struct pt_regs *_ctx = (struct pt_regs *)PT_REGS_PARM1(ctx);"
-                        "  bpf_probe_read(&_val, sizeof(_val), &(PT_REGS_PARM3(_ctx))); _val;})",
+                        "  bpf_probe_read_kernel(&_val, sizeof(_val), &(PT_REGS_PARM3(_ctx))); _val;})",
                 "arg4": "({u64 _val; struct pt_regs *_ctx = (struct pt_regs *)PT_REGS_PARM1(ctx);"
-                        "  bpf_probe_read(&_val, sizeof(_val), &(PT_REGS_PARM4(_ctx))); _val;})",
+                        "  bpf_probe_read_kernel(&_val, sizeof(_val), &(PT_REGS_PARM4(_ctx))); _val;})",
                 "arg5": "({u64 _val; struct pt_regs *_ctx = (struct pt_regs *)PT_REGS_PARM1(ctx);"
-                        "  bpf_probe_read(&_val, sizeof(_val), &(PT_REGS_PARM5(_ctx))); _val;})",
+                        "  bpf_probe_read_kernel(&_val, sizeof(_val), &(PT_REGS_PARM5(_ctx))); _val;})",
                 "arg6": "({u64 _val; struct pt_regs *_ctx = (struct pt_regs *)PT_REGS_PARM1(ctx);"
-                        "  bpf_probe_read(&_val, sizeof(_val), &(PT_REGS_PARM6(_ctx))); _val;})",
+                        "  bpf_probe_read_kernel(&_val, sizeof(_val), &(PT_REGS_PARM6(_ctx))); _val;})",
         }
 
         aliases_common = {
@@ -399,7 +399,7 @@
                         text = ("        %s %s = 0;\n" +
                                 "        bpf_usdt_readarg(%s, ctx, &%s);\n") \
                                 % (arg_ctype, expr, expr[3], expr)
-                probe_read_func = "bpf_probe_read"
+                probe_read_func = "bpf_probe_read_kernel"
                 if field_type == "s":
                         if self.library:
                             probe_read_func = "bpf_probe_read_user"
diff --git a/tools/ttysnoop.py b/tools/ttysnoop.py
index 24c1180..b576b7a 100755
--- a/tools/ttysnoop.py
+++ b/tools/ttysnoop.py
@@ -77,7 +77,7 @@
     if (file->f_inode->i_ino != PTS)
         return 0;
 
-    // bpf_probe_read() can only use a fixed size, so truncate to count
+    // bpf_probe_read_user() can only use a fixed size, so truncate to count
     // in user space:
     struct data_t data = {};
     bpf_probe_read_user(&data.buf, BUFSIZE, (void *)buf);
diff --git a/tools/wakeuptime.py b/tools/wakeuptime.py
index a22245a..e13bdf0 100755
--- a/tools/wakeuptime.py
+++ b/tools/wakeuptime.py
@@ -136,7 +136,7 @@
     struct key_t key = {};
 
     key.w_k_stack_id = stack_traces.get_stackid(ctx, 0);
-    bpf_probe_read(&key.target, sizeof(key.target), p->comm);
+    bpf_probe_read_kernel(&key.target, sizeof(key.target), p->comm);
     bpf_get_current_comm(&key.waker, sizeof(key.waker));
 
     counts.increment(key, delta);
diff --git a/tools/xfsslower.py b/tools/xfsslower.py
index 9fa1256..f259e49 100755
--- a/tools/xfsslower.py
+++ b/tools/xfsslower.py
@@ -196,7 +196,7 @@
     struct qstr qs = valp->fp->f_path.dentry->d_name;
     if (qs.len == 0)
         return 0;
-    bpf_probe_read(&data.file, sizeof(data.file), (void *)qs.name);
+    bpf_probe_read_kernel(&data.file, sizeof(data.file), (void *)qs.name);
 
     // output
     events.perf_submit(ctx, &data, sizeof(data));
diff --git a/tools/zfsslower.py b/tools/zfsslower.py
index 2f05b56..3a61a36 100755
--- a/tools/zfsslower.py
+++ b/tools/zfsslower.py
@@ -192,7 +192,7 @@
     struct qstr qs = valp->fp->f_path.dentry->d_name;
     if (qs.len == 0)
         return 0;
-    bpf_probe_read(&data.file, sizeof(data.file), (void *)qs.name);
+    bpf_probe_read_kernel(&data.file, sizeof(data.file), (void *)qs.name);
 
     // output
     events.perf_submit(ctx, &data, sizeof(data));