lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite for Android: free password hash cracker in your pocket
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <20241119134858.1862632-1-tglozar@redhat.com>
Date: Tue, 19 Nov 2024 14:48:57 +0100
From: tglozar@...hat.com
To: rostedt@...dmis.org
Cc: linux-trace-kernel@...r.kernel.org,
	linux-kernel@...r.kernel.org,
	jkacur@...hat.com,
	Tomas Glozar <tglozar@...hat.com>
Subject: [PATCH] rtla/timerlat: Fix histogram ALL for zero samples

From: Tomas Glozar <tglozar@...hat.com>

rtla timerlat hist currently computers the minimum, maximum and average
latency even in cases when there are zero samples. This leads to
nonsensical values being calculated for maximum and minimum, and to
divide by zero for average.

A similar bug is fixed by 01b05fc0e5f3 ("rtla/timerlat: Fix histogram
report when a cpu count is 0") but the bug still remains for printing
the sum over all CPUs in timerlat_print_stats_all.

The issue can be reproduced with this command:

$ rtla timerlat hist -U -k -d 1s
Index
over:
count:
min:
avg:
max:
Floating point exception (core dumped)

(There are always no samples with -U unless the user workload is
created; the -k is to work around a bug with -U.)

Fix the bug by omitting max/min/avg when sample count is zero,
displaying a dash instead, just like we already do for the individual
CPUs.

Cc: stable@...r.kernel.org
Fixes: 1462501c7a8 ("rtla/timerlat: Add a summary for hist mode")
Signed-off-by: Tomas Glozar <tglozar@...hat.com>
---
 tools/tracing/rtla/src/timerlat_hist.c | 93 ++++++++++++++++++--------
 1 file changed, 66 insertions(+), 27 deletions(-)

diff --git a/tools/tracing/rtla/src/timerlat_hist.c b/tools/tracing/rtla/src/timerlat_hist.c
index a3907c390d67..5cbbe3e98c1d 100644
--- a/tools/tracing/rtla/src/timerlat_hist.c
+++ b/tools/tracing/rtla/src/timerlat_hist.c
@@ -504,51 +504,90 @@ timerlat_print_stats_all(struct timerlat_hist_params *params,
 	if (!params->no_index)
 		trace_seq_printf(trace->seq, "min:  ");
 
-	if (!params->no_irq)
-		trace_seq_printf(trace->seq, "%9llu ",
-				 sum.min_irq);
+	if (!params->no_irq) {
+		if (sum.irq_count != 0)
+			trace_seq_printf(trace->seq, "%9llu ",
+					 sum.min_irq);
+		else
+			trace_seq_printf(trace->seq, "%9c ", '-');
+	}
 
-	if (!params->no_thread)
-		trace_seq_printf(trace->seq, "%9llu ",
-				 sum.min_thread);
+	if (!params->no_thread) {
+		if (sum.thread_count != 0)
+			trace_seq_printf(trace->seq, "%9llu ",
+					 sum.min_thread);
+		else
+			trace_seq_printf(trace->seq, "%9c ", '-');
+	}
 
-	if (params->user_hist)
-		trace_seq_printf(trace->seq, "%9llu ",
-				 sum.min_user);
+	if (params->user_hist) {
+		if (sum.user_count != 0) {
+			trace_seq_printf(trace->seq, "%9llu ",
+					 sum.min_user);
+		} else {
+			trace_seq_printf(trace->seq, "%9c ", '-');
+		}
+	}
 
 	trace_seq_printf(trace->seq, "\n");
 
 	if (!params->no_index)
 		trace_seq_printf(trace->seq, "avg:  ");
 
-	if (!params->no_irq)
-		trace_seq_printf(trace->seq, "%9llu ",
-				 sum.sum_irq / sum.irq_count);
+	if (!params->no_irq) {
+		if (sum.irq_count != 0)
+			trace_seq_printf(trace->seq, "%9llu ",
+					 sum.sum_irq / sum.irq_count);
+		else
+			trace_seq_printf(trace->seq, "%9c ", '-');
+	}
 
-	if (!params->no_thread)
-		trace_seq_printf(trace->seq, "%9llu ",
-				 sum.sum_thread / sum.thread_count);
+	if (!params->no_thread) {
+		if (sum.thread_count != 0)
+			trace_seq_printf(trace->seq, "%9llu ",
+					 sum.sum_thread / sum.thread_count);
+		else
+			trace_seq_printf(trace->seq, "%9c ", '-');
+	}
 
-	if (params->user_hist)
-		trace_seq_printf(trace->seq, "%9llu ",
-				 sum.sum_user / sum.user_count);
+	if (params->user_hist) {
+		if (sum.user_count != 0) {
+			trace_seq_printf(trace->seq, "%9llu ",
+					 sum.sum_user / sum.user_count);
+		} else {
+			trace_seq_printf(trace->seq, "%9c ", '-');
+		}
+	}
 
 	trace_seq_printf(trace->seq, "\n");
 
 	if (!params->no_index)
 		trace_seq_printf(trace->seq, "max:  ");
 
-	if (!params->no_irq)
-		trace_seq_printf(trace->seq, "%9llu ",
-				 sum.max_irq);
+	if (!params->no_irq) {
+		if (sum.irq_count != 0)
+			trace_seq_printf(trace->seq, "%9llu ",
+					 sum.max_irq);
+		else
+			trace_seq_printf(trace->seq, "%9c ", '-');
+	}
 
-	if (!params->no_thread)
-		trace_seq_printf(trace->seq, "%9llu ",
-				 sum.max_thread);
+	if (!params->no_thread) {
+		if (sum.thread_count != 0)
+			trace_seq_printf(trace->seq, "%9llu ",
+					 sum.max_thread);
+		else
+			trace_seq_printf(trace->seq, "%9c ", '-');
+	}
 
-	if (params->user_hist)
-		trace_seq_printf(trace->seq, "%9llu ",
-				 sum.max_user);
+	if (params->user_hist) {
+		if (sum.user_count != 0) {
+			trace_seq_printf(trace->seq, "%9llu ",
+					 sum.max_user);
+		} else {
+			trace_seq_printf(trace->seq, "%9c ", '-');
+		}
+	}
 
 	trace_seq_printf(trace->seq, "\n");
 	trace_seq_do_printf(trace->seq);
-- 
2.47.0


Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ