Package: bpfcc-tools
Version: 0.18.0+ds-2
Severity: normal

Dear Maintainer,

Pretty simple - it looks like the internal field that biosnoop-bpfcc reads
to get the size of the IO started being cleared on IO completion at some point,
so it prints as always 0 now.

Upstream fixed this by stashing the size and timestamp before the IO starts; 
since
that's really the only delta between the two, I'd probably just take that 
wholesale (the
patch attached is a delta between what's currently in 0.18.0 and git master).

(Don't mind the debsums error, I went and tinkered with my copy to try a couple 
of
solutions; it's broken on unmodified biosnoop.)

- Rich

-- System Information:
Debian Release: 11.1
  APT prefers stable-updates
  APT policy: (1000, 'stable-updates'), (1000, 'stable-security'), (1000, 
'stable'), (901, 'proposed-updates'), (900, 'oldstable-debug'), (900, 
'testing'), (800, 'unstable-debug'), (500, 'stable-debug'), (500, 
'proposed-updates-debug'), (500, 'oldstable-proposed-updates-debug'), (1, 
'experimental')
Architecture: amd64 (x86_64)
Foreign Architectures: i386

Kernel: Linux 5.10.0-9-amd64 (SMP w/16 CPU threads)
Kernel taint flags: TAINT_PROPRIETARY_MODULE, TAINT_OOT_MODULE, 
TAINT_UNSIGNED_MODULE
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8), LANGUAGE not set
Shell: /bin/sh linked to /bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled

Versions of packages bpfcc-tools depends on:
ii  python3          3.9.2-3
ii  python3-bpfcc    0.18.0+ds-2
ii  python3-netaddr  0.7.19-5

bpfcc-tools recommends no packages.

bpfcc-tools suggests no packages.

-- no debconf information

-- debsums errors found:
debsums: changed file /usr/sbin/biosnoop-bpfcc (from bpfcc-tools package)
--- tools/biosnoop.py.old       2021-10-21 09:38:53.626276801 -0400
+++ tools/biosnoop.py   2021-10-21 09:39:03.354295218 -0400
@@ -39,6 +39,12 @@
 #include <uapi/linux/ptrace.h>
 #include <linux/blkdev.h>
 
+// for saving the timestamp and __data_len of each request
+struct start_req_t {
+    u64 ts;
+    u64 data_len;
+};
+
 struct val_t {
     u64 ts;
     u32 pid;
@@ -57,7 +63,7 @@
     char name[TASK_COMM_LEN];
 };
 
-BPF_HASH(start, struct request *);
+BPF_HASH(start, struct request *, struct start_req_t);
 BPF_HASH(infobyreq, struct request *, struct val_t);
 BPF_PERF_OUTPUT(events);
 
@@ -80,42 +86,43 @@
 // time block I/O
 int trace_req_start(struct pt_regs *ctx, struct request *req)
 {
-    u64 ts;
-    ts = bpf_ktime_get_ns();
-    start.update(&req, &ts);
+    struct start_req_t start_req = {
+        .ts = bpf_ktime_get_ns(),
+        .data_len = req->__data_len
+    };
+    start.update(&req, &start_req);
     return 0;
 }
 
 // output
 int trace_req_completion(struct pt_regs *ctx, struct request *req)
 {
-    u64 *tsp;
+    struct start_req_t *startp;
     struct val_t *valp;
     struct data_t data = {};
     u64 ts;
 
     // fetch timestamp and calculate delta
-    tsp = start.lookup(&req);
-    if (tsp == 0) {
+    startp = start.lookup(&req);
+    if (startp == 0) {
         // missed tracing issue
         return 0;
     }
     ts = bpf_ktime_get_ns();
-    data.delta = ts - *tsp;
+    data.delta = ts - startp->ts;
     data.ts = ts / 1000;
     data.qdelta = 0;
 
     valp = infobyreq.lookup(&req);
+    data.len = startp->data_len;
     if (valp == 0) {
-        data.len = req->__data_len;
         data.name[0] = '?';
         data.name[1] = 0;
     } else {
         if (##QUEUE##) {
-            data.qdelta = *tsp - valp->ts;
+            data.qdelta = startp->ts - valp->ts;
         }
         data.pid = valp->pid;
-        data.len = req->__data_len;
         data.sector = req->__sector;
         bpf_probe_read_kernel(&data.name, sizeof(data.name), valp->name);
         struct gendisk *rq_disk = req->rq_disk;

Reply via email to