forked from mirrors/linux
		
	rtla/timerlat: Fix histogram report when a cpu count is 0
On short runs it is possible to get no samples on a cpu, like this:
  # rtla timerlat hist -u -T50
  Index   IRQ-001   Thr-001   Usr-001   IRQ-002   Thr-002   Usr-002
  2             1         0         0         0         0         0
  33            0         1         0         0         0         0
  36            0         0         1         0         0         0
  49            0         0         0         1         0         0
  52            0         0         0         0         1         0
  over:         0         0         0         0         0         0
  count:        1         1         1         1         1         0
  min:          2        33        36        49        52 18446744073709551615
  avg:          2        33        36        49        52         -
  max:          2        33        36        49        52         0
  rtla timerlat hit stop tracing
    IRQ handler delay:		(exit from idle)	    48.21 us (91.09 %)
    IRQ latency:						    49.11 us
    Timerlat IRQ duration:				     2.17 us (4.09 %)
    Blocking thread:					     1.01 us (1.90 %)
  	               swapper/2:0        		     1.01 us
  ------------------------------------------------------------------------
    Thread latency:					    52.93 us (100%)
  Max timerlat IRQ latency from idle: 49.11 us in cpu 2
Note, the value 18446744073709551615 is the same as ~0.
Fix this by reporting no results for the min, avg and max if the count
is 0.
Link: https://lkml.kernel.org/r/20240510190318.44295-1-jkacur@redhat.com
Cc: stable@vger.kernel.org
Fixes: 1eeb6328e8 ("rtla/timerlat: Add timerlat hist mode")
Suggested-by: Daniel Bristot de Oliveria <bristot@kernel.org>
Signed-off-by: John Kacur <jkacur@redhat.com>
Signed-off-by: Daniel Bristot de Oliveira <bristot@kernel.org>
			
			
This commit is contained in:
		
							parent
							
								
									e9a4062e15
								
							
						
					
					
						commit
						01b05fc0e5
					
				
					 1 changed files with 42 additions and 18 deletions
				
			
		| 
						 | 
				
			
			@ -327,17 +327,29 @@ timerlat_print_summary(struct timerlat_hist_params *params,
 | 
			
		|||
		if (!data->hist[cpu].irq_count && !data->hist[cpu].thread_count)
 | 
			
		||||
			continue;
 | 
			
		||||
 | 
			
		||||
		if (!params->no_irq)
 | 
			
		||||
			trace_seq_printf(trace->seq, "%9llu ",
 | 
			
		||||
					data->hist[cpu].min_irq);
 | 
			
		||||
		if (!params->no_irq) {
 | 
			
		||||
			if (data->hist[cpu].irq_count)
 | 
			
		||||
				trace_seq_printf(trace->seq, "%9llu ",
 | 
			
		||||
						data->hist[cpu].min_irq);
 | 
			
		||||
			else
 | 
			
		||||
				trace_seq_printf(trace->seq, "        - ");
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (!params->no_thread)
 | 
			
		||||
			trace_seq_printf(trace->seq, "%9llu ",
 | 
			
		||||
					data->hist[cpu].min_thread);
 | 
			
		||||
		if (!params->no_thread) {
 | 
			
		||||
			if (data->hist[cpu].thread_count)
 | 
			
		||||
				trace_seq_printf(trace->seq, "%9llu ",
 | 
			
		||||
						data->hist[cpu].min_thread);
 | 
			
		||||
			else
 | 
			
		||||
				trace_seq_printf(trace->seq, "        - ");
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (params->user_hist)
 | 
			
		||||
			trace_seq_printf(trace->seq, "%9llu ",
 | 
			
		||||
					data->hist[cpu].min_user);
 | 
			
		||||
		if (params->user_hist) {
 | 
			
		||||
			if (data->hist[cpu].user_count)
 | 
			
		||||
				trace_seq_printf(trace->seq, "%9llu ",
 | 
			
		||||
						data->hist[cpu].min_user);
 | 
			
		||||
			else
 | 
			
		||||
				trace_seq_printf(trace->seq, "        - ");
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	trace_seq_printf(trace->seq, "\n");
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -387,17 +399,29 @@ timerlat_print_summary(struct timerlat_hist_params *params,
 | 
			
		|||
		if (!data->hist[cpu].irq_count && !data->hist[cpu].thread_count)
 | 
			
		||||
			continue;
 | 
			
		||||
 | 
			
		||||
		if (!params->no_irq)
 | 
			
		||||
			trace_seq_printf(trace->seq, "%9llu ",
 | 
			
		||||
					data->hist[cpu].max_irq);
 | 
			
		||||
		if (!params->no_irq) {
 | 
			
		||||
			if (data->hist[cpu].irq_count)
 | 
			
		||||
				trace_seq_printf(trace->seq, "%9llu ",
 | 
			
		||||
						 data->hist[cpu].max_irq);
 | 
			
		||||
			else
 | 
			
		||||
				trace_seq_printf(trace->seq, "        - ");
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (!params->no_thread)
 | 
			
		||||
			trace_seq_printf(trace->seq, "%9llu ",
 | 
			
		||||
					data->hist[cpu].max_thread);
 | 
			
		||||
		if (!params->no_thread) {
 | 
			
		||||
			if (data->hist[cpu].thread_count)
 | 
			
		||||
				trace_seq_printf(trace->seq, "%9llu ",
 | 
			
		||||
						data->hist[cpu].max_thread);
 | 
			
		||||
			else
 | 
			
		||||
				trace_seq_printf(trace->seq, "        - ");
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (params->user_hist)
 | 
			
		||||
			trace_seq_printf(trace->seq, "%9llu ",
 | 
			
		||||
					data->hist[cpu].max_user);
 | 
			
		||||
		if (params->user_hist) {
 | 
			
		||||
			if (data->hist[cpu].user_count)
 | 
			
		||||
				trace_seq_printf(trace->seq, "%9llu ",
 | 
			
		||||
						data->hist[cpu].max_user);
 | 
			
		||||
			else
 | 
			
		||||
				trace_seq_printf(trace->seq, "        - ");
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	trace_seq_printf(trace->seq, "\n");
 | 
			
		||||
	trace_seq_do_printf(trace->seq);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue