tools: replace add with xadd (#3518)
authorzcy <zcy.chenyue.zhou@gmail.com>
Thu, 1 Jul 2021 16:12:32 +0000 (00:12 +0800)
committerGitHub <noreply@github.com>
Thu, 1 Jul 2021 16:12:32 +0000 (09:12 -0700)
resolve #3481
replace add with xadd for more tools.

29 files changed:
tools/argdist.py
tools/biolatency.py
tools/bitesize.py
tools/btrfsdist.py
tools/cachestat.py
tools/cpudist.py
tools/dbstat.py
tools/dcstat.py
tools/ext4dist.py
tools/funccount.py
tools/funcinterval.py
tools/funclatency.py
tools/hardirqs.py
tools/inject.py
tools/nfsdist.py
tools/pidpersec.py
tools/readahead.py
tools/runqlat.py
tools/runqlen.py
tools/softirqs.py
tools/stackcount.py
tools/tcprtt.py
tools/tcpsubnet.py
tools/tcpsynbl.py
tools/vfscount.py
tools/vfsstat.py
tools/wakeuptime.py
tools/xfsdist.py
tools/zfsdist.py

index 88da0d841d490f840e010da0b6a079e7ea60ccbd..b810126ec7e5b391da21a8402fda63dc113c8a41 100755 (executable)
@@ -334,10 +334,11 @@ u64 __time = bpf_ktime_get_ns();
 
         def _generate_hash_update(self):
                 if self.type == "hist":
-                        return "%s.increment(bpf_log2l(__key));" % \
+                        return "%s.atomic_increment(bpf_log2l(__key));" % \
                                 self.probe_hash_name
                 else:
-                        return "%s.increment(__key);" % self.probe_hash_name
+                        return "%s.atomic_increment(__key);" % \
+                                self.probe_hash_name
 
         def _generate_pid_filter(self):
                 # Kernel probes need to explicitly filter pid, because the
index 0599609b8d11715608f8a110ba5f646c3dfc8478..7fb5bd8113beefda282e42cd2d1929ee5eb91b1a 100755 (executable)
@@ -132,18 +132,18 @@ if args.disks:
     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);
-    dist.increment(key);
+    dist.atomic_increment(key);
     """
 elif args.flags:
     storage_str += "BPF_HISTOGRAM(dist, flag_key_t);"
     store_str += """
     flag_key_t key = {.slot = bpf_log2l(delta)};
     key.flags = req->cmd_flags;
-    dist.increment(key);
+    dist.atomic_increment(key);
     """
 else:
     storage_str += "BPF_HISTOGRAM(dist);"
-    store_str += "dist.increment(bpf_log2l(delta));"
+    store_str += "dist.atomic_increment(bpf_log2l(delta));"
 
 if args.extension:
     storage_str += "BPF_ARRAY(extension, ext_val_t, 1);"
@@ -254,7 +254,7 @@ while (1):
     else:
         if args.timestamp:
             print("%-8s\n" % strftime("%H:%M:%S"), end="")
-            
+
         if args.flags:
             dist.print_log2_hist(label, "flags", flags_print)
         else:
index 6ae71dcf8ed4c283fd5e98d66ad14c498d5c7a40..69e36335ba71a248b2a16fbe494e1c20ea1aac0e 100755 (executable)
@@ -31,7 +31,7 @@ TRACEPOINT_PROBE(block, block_rq_issue)
 {
     struct proc_key_t key = {.slot = bpf_log2l(args->bytes / 1024)};
     bpf_probe_read_kernel(&key.name, sizeof(key.name), args->comm);
-    dist.increment(key);
+    dist.atomic_increment(key);
     return 0;
 }
 """
index 0aad2d945af998f66281cac38ad96ce39cb3bc84..72ea304a284e77184b01c8ef517e7d798da4079f 100755 (executable)
@@ -144,7 +144,7 @@ static int trace_return(struct pt_regs *ctx, const char *op)
     // store as histogram
     dist_key_t key = {.slot = bpf_log2l(delta)};
     __builtin_memcpy(&key.op, op, sizeof(key.op));
-    dist.increment(key);
+    dist.atomic_increment(key);
 
     start.delete(&tid);
     return 0;
index bb949493c779eb004ec7eedb1d3b83dddc7af2d5..2c09d14d6b15d50df1b70e0b86cda14cf2ea48e6 100755 (executable)
@@ -81,7 +81,7 @@ int do_count(struct pt_regs *ctx) {
     u64 ip;
 
     key.ip = PT_REGS_IP(ctx);
-    counts.increment(key); // update counter
+    counts.atomic_increment(key); // update counter
     return 0;
 }
 
index b5a6a9782de2a22fec96c7d47b1450efe8a0fec7..a4303f85de3b009a9ebc56baf2e42bc929ebda38 100755 (executable)
@@ -144,7 +144,7 @@ else:
     section = ""
     bpf_text = bpf_text.replace('STORAGE', 'BPF_HISTOGRAM(dist);')
     bpf_text = bpf_text.replace('STORE',
-        'dist.increment(bpf_log2l(delta));')
+        'dist.atomic_increment(bpf_log2l(delta));')
 if debug or args.ebpf:
     print(bpf_text)
     if args.ebpf:
index 72af9f8d142fb763f63b82124b6f6dc3f78084ca..9e36e632f4d466548bc0db0e810729904d2690e5 100755 (executable)
@@ -74,7 +74,7 @@ int probe_end(struct pt_regs *ctx) {
     u64 delta = bpf_ktime_get_ns() - *timestampp;
     FILTER
     delta /= SCALE;
-    latency.increment(bpf_log2l(delta));
+    latency.atomic_increment(bpf_log2l(delta));
     temp.delete(&pid);
     return 0;
 }
index bd0494cd1429a3395728e67ffbcae8620474245c..623762883527ccc20ef7f0beafc35b49602a1c0f 100755 (executable)
@@ -73,18 +73,15 @@ BPF_ARRAY(stats, u64, S_MAXSTAT);
  */
 void count_fast(struct pt_regs *ctx) {
     int key = S_REFS;
-    u64 *leaf = stats.lookup(&key);
-    if (leaf) (*leaf)++;
+    stats.atomic_increment(key);
 }
 
 void count_lookup(struct pt_regs *ctx) {
     int key = S_SLOW;
-    u64 *leaf = stats.lookup(&key);
-    if (leaf) (*leaf)++;
+    stats.atomic_increment(key);
     if (PT_REGS_RC(ctx) == 0) {
         key = S_MISS;
-        leaf = stats.lookup(&key);
-        if (leaf) (*leaf)++;
+        stats.atomic_increment(key);
     }
 }
 """
@@ -117,7 +114,6 @@ while (1):
     try:
         sleep(interval)
     except KeyboardInterrupt:
-        pass
         exit()
 
     print("%-8s: " % strftime("%H:%M:%S"), end="")
index 49139c8197c6c09dd025144cedf9cd4733460d14..0aab1baa668317c191d1450c4ac4f591b6f9a0bb 100755 (executable)
@@ -110,7 +110,7 @@ static int trace_return(struct pt_regs *ctx, const char *op)
     // store as histogram
     dist_key_t key = {.slot = bpf_log2l(delta)};
     __builtin_memcpy(&key.op, op, sizeof(key.op));
-    dist.increment(key);
+    dist.atomic_increment(key);
 
     return 0;
 }
index e54ba50a257e5e51f66ca52355121deffe986463..24b293820a848e28bf5ede2e4978cf4ab1698703 100755 (executable)
@@ -168,11 +168,7 @@ int PROBE_FUNCTION(void *ctx) {
     FILTERPID
     FILTERCPU
     int loc = LOCATION;
-    u64 *val = counts.lookup(&loc);
-    if (!val) {
-        return 0;   // Should never happen, # of locations is known
-    }
-    (*val)++;
+    counts.atomic_increment(loc);
     return 0;
 }
         """
index 097649f44a6ec1745e034d9937d3e49726dccb68..1840eb54811fc38f9d36145c31a38998f9be6ca5 100755 (executable)
@@ -109,7 +109,7 @@ int trace_func_entry(struct pt_regs *ctx)
     FACTOR
 
     // store as histogram
-    dist.increment(bpf_log2l(delta));
+    dist.atomic_increment(bpf_log2l(delta));
 
 out:
     start.update(&index, &ts);
index aad879d1b5ba6e8c3a31934b67efd575ec4fceb3..2ade0695244f7f36f3a98450940ee0a2711744e9 100755 (executable)
@@ -284,7 +284,7 @@ static inline int stack_push(func_stack_t *stack, func_cache_t *cache) {
     key.key.ip  = ip;
     key.key.pid = %s;
     key.slot    = bpf_log2l(delta);
-    dist.increment(key);
+    dist.atomic_increment(key);
 
     if (stack->head == 0) {
         /* empty */
@@ -309,7 +309,7 @@ static inline int stack_push(func_stack_t *stack, func_cache_t *cache) {
         key.key.ip = ip;
         key.key.pid = %s;
         key.slot = bpf_log2l(delta);
-        dist.increment(key);
+        dist.atomic_increment(key);
         ipaddr.delete(&pid);
     }
                 """ % pid)
@@ -318,7 +318,7 @@ else:
                                            'BPF_HASH(start, u32);')
     bpf_text = bpf_text.replace('ENTRYSTORE', 'start.update(&pid, &ts);')
     bpf_text = bpf_text.replace('STORE',
-        'dist.increment(bpf_log2l(delta));')
+        'dist.atomic_increment(bpf_log2l(delta));')
 
 bpf_text = bpf_text.replace('TYPEDEF', '')
 bpf_text = bpf_text.replace('FUNCTION', '')
index b60b63ada71498ddb8244d558d27d7cd7b240ac1..e5924faddfeb7ef5a1ce8990b14e35f1d949d20d 100755 (executable)
@@ -86,7 +86,7 @@ TRACEPOINT_PROBE(irq, irq_handler_entry)
 {
     irq_key_t key = {.slot = 0 /* ignore */};
     TP_DATA_LOC_READ_CONST(&key.name, name, sizeof(key.name));
-    dist.increment(key);
+    dist.atomic_increment(key);
     return 0;
 }
 """
@@ -139,12 +139,12 @@ if args.dist:
     bpf_text = bpf_text.replace('STORE',
         'irq_key_t key = {.slot = bpf_log2l(delta / %d)};' % factor +
         'bpf_probe_read_kernel(&key.name, sizeof(key.name), name);' +
-        'dist.increment(key);')
+        'dist.atomic_increment(key);')
 else:
     bpf_text = bpf_text.replace('STORE',
         'irq_key_t key = {.slot = 0 /* ignore */};' +
         'bpf_probe_read_kernel(&key.name, sizeof(key.name), name);' +
-        'dist.increment(key, delta);')
+        'dist.atomic_increment(key, delta);')
 if debug or args.ebpf:
     print(bpf_text)
     if args.ebpf:
index 9d6b85f8cc16aeb1e469bc282e44a9777ce7fe90..320b39355f13ad328c9090bc9509b097ce257bb3 100755 (executable)
@@ -225,7 +225,7 @@ class Probe:
          * If this is the only call in the chain and predicate passes
          */
         if (%s == 1 && %s && overridden < %s) {
-                count.increment(zero);
+                count.atomic_increment(zero);
                 bpf_override_return(ctx, %s);
                 return 0;
         }
@@ -240,7 +240,7 @@ class Probe:
          * If all conds have been met and predicate passes
          */
         if (p->conds_met == %s && %s && overridden < %s) {
-                count.increment(zero);
+                count.atomic_increment(zero);
                 bpf_override_return(ctx, %s);
         }
         return 0;
index a0841ac1608b88888276aeec4f56f06829859592..4c1f8e3489b5ba3e8bdb5dc9f435bac39c423944 100755 (executable)
@@ -96,7 +96,7 @@ static int trace_return(struct pt_regs *ctx, const char *op)
     // store as histogram
     dist_key_t key = {.slot = bpf_log2l(delta)};
     __builtin_memcpy(&key.op, op, sizeof(key.op));
-    dist.increment(key);
+    dist.atomic_increment(key);
 
     start.delete(&tid);
     return 0;
index c4490043a59dfe395b663616d9bc5423018a545e..be72443534bf27ef7bad2f2b26adb9e3fcca9c9a 100755 (executable)
@@ -29,8 +29,7 @@ enum stat_types {
 BPF_ARRAY(stats, u64, S_MAXSTAT);
 
 static void stats_increment(int key) {
-    u64 *leaf = stats.lookup(&key);
-    if (leaf) (*leaf)++;
+    stats.atomic_increment(key);
 }
 
 void do_count(struct pt_regs *ctx) { stats_increment(S_COUNT); }
index b338261fc78f54c9669a1c5d73050ad04a791456..bc8daec2383894864e9df4f737e4fd814fca2c64 100755 (executable)
@@ -69,9 +69,7 @@ int exit__page_cache_alloc(struct pt_regs *ctx) {
     if (f != NULL && *f == 1) {
         ts = bpf_ktime_get_ns();
         birth.update(&retval, &ts);
-
-        u64 *count = pages.lookup(&zero);
-        if (count) (*count)++; // increment read ahead pages count
+        pages.atomic_increment(zero);
     }
     return 0;
 }
@@ -83,11 +81,8 @@ int entry_mark_page_accessed(struct pt_regs *ctx) {
     u64 *bts = birth.lookup(&arg0);
     if (bts != NULL) {
         delta = bpf_ktime_get_ns() - *bts;
-        dist.increment(bpf_log2l(delta/1000000));
-
-        u64 *count = pages.lookup(&zero);
-        if (count) (*count)--; // decrement read ahead pages count
-
+        dist.atomic_increment(bpf_log2l(delta/1000000));
+        pages.atomic_increment(zero, -1);
         birth.delete(&arg0); // remove the entry from hashmap
     }
     return 0;
index b13ff2d1935e794c8b9915e96931fdf1542ea428..aca0652487b1962ad236a2327b46f425cae23189 100755 (executable)
@@ -236,12 +236,12 @@ elif args.pidnss:
         'BPF_HISTOGRAM(dist, pidns_key_t);')
     bpf_text = bpf_text.replace('STORE', 'pidns_key_t key = ' +
         '{.id = prev->nsproxy->pid_ns_for_children->ns.inum, ' +
-        '.slot = bpf_log2l(delta)}; dist.increment(key);')
+        '.slot = bpf_log2l(delta)}; dist.atomic_increment(key);')
 else:
     section = ""
     bpf_text = bpf_text.replace('STORAGE', 'BPF_HISTOGRAM(dist);')
     bpf_text = bpf_text.replace('STORE',
-        'dist.increment(bpf_log2l(delta));')
+        'dist.atomic_increment(bpf_log2l(delta));')
 if debug or args.ebpf:
     print(bpf_text)
     if args.ebpf:
index b56a5916a42c715e1dfc788e25b3b909bca62545..c77947af0f991b325b2f96627cefa02ef89a7a5c 100755 (executable)
@@ -170,7 +170,7 @@ if args.cpus:
 else:
     bpf_text = bpf_text.replace('STORAGE',
         'BPF_HISTOGRAM(dist, unsigned int);')
-    bpf_text = bpf_text.replace('STORE', 'dist.increment(len);')
+    bpf_text = bpf_text.replace('STORE', 'dist.atomic_increment(len);')
 
 if check_runnable_weight_field():
     bpf_text = bpf_text.replace('RUNNABLE_WEIGHT_FIELD', 'unsigned long runnable_weight;')
index 32bbef5dec361564d320c2752c48570eaa46e891..ba0dac363c83ee1e362fe4569591a17d8862b405 100755 (executable)
@@ -119,11 +119,11 @@ TRACEPOINT_PROBE(irq, softirq_exit)
 if args.dist:
     bpf_text = bpf_text.replace('STORE',
         'key.vec = vec; key.slot = bpf_log2l(delta / %d); ' % factor +
-        'dist.increment(key);')
+        'dist.atomic_increment(key);')
 else:
     bpf_text = bpf_text.replace('STORE',
         'key.vec = valp->vec; ' +
-        'dist.increment(key, delta);')
+        'dist.atomic_increment(key, delta);')
 if debug or args.ebpf:
     print(bpf_text)
     if args.ebpf:
index 2afb91ff875a936f838bd08e3510ae4844468ee6..8b7ca008783857d8585bbbbccc6261767e8e53c5 100755 (executable)
@@ -129,7 +129,7 @@ int trace_count(void *ctx) {
     key.tgid = GET_TGID;
     STORE_COMM
     %s
-    counts.increment(key);
+    counts.atomic_increment(key);
     return 0;
 }
         """
index 046e892f6763655ebf4b5ec607aeb8ede7a83f74..ac1b27d470ffd0a689f6ef2c0a0197b20a7be06d 100755 (executable)
@@ -123,7 +123,7 @@ int trace_tcp_rcv(struct pt_regs *ctx, struct sock *sk, struct sk_buff *skb)
 
     STORE_HIST
     key.slot = bpf_log2l(srtt);
-    hist_srtt.increment(key);
+    hist_srtt.atomic_increment(key);
 
     STORE_LATENCY
 
index 5f2a8062bdff3470264b58333869e01665a63e63..77ccc86eece71576e3418a968de1d4e6b238797c 100755 (executable)
@@ -175,7 +175,7 @@ def generate_bpf_subnets(subnets):
         if (!categorized && (__NET_ADDR__ & __NET_MASK__) ==
              (dst & __NET_MASK__)) {
           struct index_key_t key = {.index = __POS__};
-          ipv4_send_bytes.increment(key, size);
+          ipv4_send_bytes.atomic_increment(key, size);
           categorized = 1;
         }
     """
index c24eb960772a130bac50f11f473e097df6f0cd4b..93cef4b71e69953622089d94f70754c12c667b1c 100755 (executable)
@@ -33,7 +33,7 @@ int do_entry(struct pt_regs *ctx) {
     backlog_key_t key = {};
     key.backlog = sk->sk_max_ack_backlog;
     key.slot = bpf_log2l(sk->sk_ack_backlog);
-    dist.increment(key);
+    dist.atomic_increment(key);
 
     return 0;
 };
index 303d3fdea6dc5262fff0398ecf89a243b82104a1..e58ce68589a083af360e4819f9a9607de71689fd 100755 (executable)
@@ -40,7 +40,7 @@ BPF_HASH(counts, struct key_t, u64, 256);
 int do_count(struct pt_regs *ctx) {
     struct key_t key = {};
     key.ip = PT_REGS_IP(ctx);
-    counts.increment(key);
+    counts.atomic_increment(key);
     return 0;
 }
 """)
index a3d22db82d4cb873272831a852f8b06478adced7..9132b95916ba01b8144d94b2ac91a0b06cc9071e 100755 (executable)
@@ -52,8 +52,7 @@ enum stat_types {
 BPF_ARRAY(stats, u64, S_MAXSTAT);
 
 static void stats_increment(int key) {
-    u64 *leaf = stats.lookup(&key);
-    if (leaf) (*leaf)++;
+    stats.atomic_increment(key);
 }
 """
 
index 531030bbe3c896bbec1cefa36ed410d72e337ea5..90b114cf93f95c52532dea985ca6563c5b969d74 100755 (executable)
@@ -142,7 +142,7 @@ static int wakeup(ARG0, struct task_struct *p) {
     bpf_probe_read_kernel(&key.target, sizeof(key.target), p->comm);
     bpf_get_current_comm(&key.waker, sizeof(key.waker));
 
-    counts.increment(key, delta);
+    counts.atomic_increment(key, delta);
     return 0;
 }
 """
index 54b1687f5c6173fb7f592f214cd41cfad1ca338e..58f73afd6202dc29bba392da22d9afe3f2e77777 100755 (executable)
@@ -98,7 +98,7 @@ static int trace_return(struct pt_regs *ctx, const char *op)
     // store as histogram
     dist_key_t key = {.slot = bpf_log2l(delta)};
     __builtin_memcpy(&key.op, op, sizeof(key.op));
-    dist.increment(key);
+    dist.atomic_increment(key);
 
     start.delete(&tid);
     return 0;
index 112b10c188bd60ffbc804567a375e7ddbb1b838b..a30671daf463712261f0a566e018c998574db679 100755 (executable)
@@ -98,7 +98,7 @@ static int trace_return(struct pt_regs *ctx, const char *op)
     // store as histogram
     dist_key_t key = {.slot = bpf_log2l(delta)};
     __builtin_memcpy(&key.op, op, sizeof(key.op));
-    dist.increment(key);
+    dist.atomic_increment(key);
 
     start.delete(&tid);
     return 0;