]> sourceware.org Git - systemtap.git/commitdiff
PR31740: use of @hist_log or @hist_linear would lead to bad results in stat ops like...
authorYichun Zhang (agentzh) <yichun@openresty.com>
Wed, 15 May 2024 18:48:06 +0000 (11:48 -0700)
committerYichun Zhang (agentzh) <yichun@openresty.com>
Wed, 15 May 2024 18:48:11 +0000 (11:48 -0700)
The fields bit_shift and stat_ops of pmap were never initialized
properly in such cases.

runtime/pmap-gen.c
testsuite/systemtap.maps/PR31740.exp [new file with mode: 0644]
testsuite/systemtap.maps/PR31740_1.stp [new file with mode: 0644]
testsuite/systemtap.maps/PR31740_2.stp [new file with mode: 0644]

index b1c9100368e09cdb918146e0375151b39aa87ada..a1dbf6e03d0832a549ce51c07a3df899b87f429a 100644 (file)
@@ -207,10 +207,6 @@ KEYSYM(_stp_pmap_new) (int first_arg, ...)
        case HIST_NONE:
                pmap = _stp_pmap_new_hstat (max_entries, wrap,
                                            sizeof(struct KEYSYM(map_node)));
-               if (pmap) {
-                       pmap->bit_shift = bit_shift;
-                       pmap->stat_ops = stat_ops;
-               }
                break;
        case HIST_LOG:
                pmap = _stp_pmap_new_hstat_log (max_entries, wrap,
@@ -226,6 +222,10 @@ KEYSYM(_stp_pmap_new) (int first_arg, ...)
                pmap = NULL;
        }
 
+        if (pmap) {
+               pmap->bit_shift = bit_shift;
+               pmap->stat_ops = stat_ops;
+        }
 
        return pmap;
 }
diff --git a/testsuite/systemtap.maps/PR31740.exp b/testsuite/systemtap.maps/PR31740.exp
new file mode 100644 (file)
index 0000000..e840e7e
--- /dev/null
@@ -0,0 +1,41 @@
+set test "PR31740"
+set testpath "$srcdir/$subdir"
+set work_dir [pwd]
+
+if {! [installtest_p]} { untested $test; return }
+
+# --- TEST 1 ---
+
+set subtest1 "TEST 1: PR31740: hist_log"
+foreach runtime [get_runtime_list] {
+    if {$runtime eq ""} {
+        set runtime "kernel"
+    }
+    set test_name "$test: $subtest1 ($runtime)"
+    set cmd "stap --runtime=$runtime '$srcdir/$subdir/${test}_1.stp'"
+    set exit_code [run_cmd_2way $cmd out stderr]
+    set exp_out "variance = 1\n"
+    is "${test_name}: stdout" $out $exp_out
+    is "${test_name}: exit code" $exit_code 0
+    if {$stderr ne ""} {
+        send_log "stderr:\n$stderr"
+    }
+}
+
+# --- TEST 2 ---
+
+set subtest2 "TEST 2: PR31740: hist_linear"
+foreach runtime [get_runtime_list] {
+    if {$runtime eq ""} {
+        set runtime "kernel"
+    }
+    set test_name "$test: $subtest2 ($runtime)"
+    set cmd "stap --runtime=$runtime '$srcdir/$subdir/${test}_2.stp'"
+    set exit_code [run_cmd_2way $cmd out stderr]
+    set exp_out "variance = 1\n"
+    is "${test_name}: stdout" $out $exp_out
+    is "${test_name}: exit code" $exit_code 0
+    if {$stderr ne ""} {
+        send_log "stderr:\n$stderr"
+    }
+}
diff --git a/testsuite/systemtap.maps/PR31740_1.stp b/testsuite/systemtap.maps/PR31740_1.stp
new file mode 100644 (file)
index 0000000..33951fc
--- /dev/null
@@ -0,0 +1,12 @@
+global stats;
+
+probe oneshot {
+    stats["k"] <<< 1;
+    stats["k"] <<< 2;
+    stats["k"] <<< 3;
+    printf("variance = %d\n", @variance(stats["k"], 7));
+}
+
+probe never {
+    print(@hist_log(stats["k"]));
+}
diff --git a/testsuite/systemtap.maps/PR31740_2.stp b/testsuite/systemtap.maps/PR31740_2.stp
new file mode 100644 (file)
index 0000000..5469b16
--- /dev/null
@@ -0,0 +1,12 @@
+global stats;
+
+probe oneshot {
+    stats["k"] <<< 1;
+    stats["k"] <<< 2;
+    stats["k"] <<< 3;
+    printf("variance = %d\n", @variance(stats["k"], 7));
+}
+
+probe never {
+    print(@hist_linear(stats["k"], 0, 4, 1));
+}
This page took 0.028551 seconds and 5 git commands to generate.