From: Yichun Zhang (agentzh) Date: Wed, 15 May 2024 18:48:06 +0000 (-0700) Subject: PR31740: use of @hist_log or @hist_linear would lead to bad results in stat ops like... X-Git-Url: https://sourceware.org/git/?a=commitdiff_plain;h=289609c9b75587d295c74cb59b9b6038ce9c396e;p=systemtap.git PR31740: use of @hist_log or @hist_linear would lead to bad results in stat ops like @variance() The fields bit_shift and stat_ops of pmap were never initialized properly in such cases. --- diff --git a/runtime/pmap-gen.c b/runtime/pmap-gen.c index b1c910036..a1dbf6e03 100644 --- a/runtime/pmap-gen.c +++ b/runtime/pmap-gen.c @@ -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 index 000000000..e840e7ee3 --- /dev/null +++ b/testsuite/systemtap.maps/PR31740.exp @@ -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 index 000000000..33951fc60 --- /dev/null +++ b/testsuite/systemtap.maps/PR31740_1.stp @@ -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 index 000000000..5469b163f --- /dev/null +++ b/testsuite/systemtap.maps/PR31740_2.stp @@ -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)); +}