Re: [PATCH v3] sched_deadline/cyclicdeadline: add tracelimit

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On Thu, 30 Jun 2022, Song Chen wrote:

> cyclictest has tracelimit to stop running when max latency
> is higher than threshold but cyclicdeadline doesn't.
> 
> Therefore, tracelimit is introduced to cyclicdeadline in
> this commit, once max latency is over, test stops and log
> prints at the bottom of the ftrace file.
> 
> Signed-off-by: Song Chen <chensong_2000@xxxxxx>
> Reviewed-by:   Daniel Wagner <wagi@xxxxxxxxx>
> 
> ---
> v2:
> 1, disable ftrace when hitting thresold
> 
> v3:
> 1, update man page
> ---
>  src/sched_deadline/cyclicdeadline.8 |  6 ++++
>  src/sched_deadline/cyclicdeadline.c | 49 ++++++++++++++++++++++++++---
>  2 files changed, 51 insertions(+), 4 deletions(-)
> 
> diff --git a/src/sched_deadline/cyclicdeadline.8 b/src/sched_deadline/cyclicdeadline.8
> index 1a56ed0..fab301e 100644
> --- a/src/sched_deadline/cyclicdeadline.8
> +++ b/src/sched_deadline/cyclicdeadline.8
> @@ -50,6 +50,12 @@ The number of threads to run as deadline (default 1)
>  .B \-q, \-\-quiet
>  Print a summary only on exit. Useful for automated tests, where only
>  the summary output needs to be captured.
> +.TP
> +.B \-b, \-\-breaktrace=USEC
> +Send break trace command when latency > USEC
> +.TP
> +.B \-\-tracemark
> +write a trace mark when \-b latency is exceeded.
>  .br
>  .SH AUTHOR
>  cyclicdeadline was written by Steven Rostedt <rostedt@xxxxxxxxxxx>
> diff --git a/src/sched_deadline/cyclicdeadline.c b/src/sched_deadline/cyclicdeadline.c
> index d865fa3..a925d1c 100644
> --- a/src/sched_deadline/cyclicdeadline.c
> +++ b/src/sched_deadline/cyclicdeadline.c
> @@ -80,7 +80,11 @@ struct sched_data {
>  };
>  
>  static int shutdown;
> -
> +static int tracelimit = 0;
> +static int trace_marker = 0;
> +static pthread_mutex_t break_thread_id_lock = PTHREAD_MUTEX_INITIALIZER;
> +static pid_t break_thread_id = 0;
> +static uint64_t break_thread_value = 0;
>  static pthread_barrier_t barrier;
>  
>  static int cpu_count;
> @@ -667,6 +671,10 @@ static void teardown(void)
>  
>  	destroy_cpuset(CPUSET_ALL, 0);
>  	destroy_cpuset(CPUSET_LOCAL, 1);
> +
> +	/* close any tracer file descriptors */
> +	disable_trace_mark();
> +
>  }
>  
>  static void usage(int error)
> @@ -689,6 +697,8 @@ static void usage(int error)
>  	       "                           (default 500us).\n"
>  	       "-t NUM   --threads         The number of threads to run as deadline (default 1).\n"
>  	       "-q       --quiet           print a summary only on exit\n"
> +	       "-b USEC  --breaktrace=USEC send break trace command when latency > USEC\n"
> +	       "         --tracemark       write a trace mark when -b latency is exceeded\n"
>  	       );
>  	exit(error);
>  }
> @@ -825,6 +835,18 @@ void *run_deadline(void *data)
>  
>  	while (!shutdown) {
>  		period = do_runtime(tid, sd, period);
> +		if (tracelimit && (stat->max > tracelimit)) {
> +			shutdown++;
> +			pthread_mutex_lock(&break_thread_id_lock);
> +			if (break_thread_id == 0) {
> +				break_thread_id = stat->tid;
> +				break_thread_value = stat->max;
> +				tracemark( "hit latency threshold (%lld > %d)",
> +						 (unsigned long long) stat->max, tracelimit);
> +			}
> +			pthread_mutex_unlock(&break_thread_id_lock);
> +			break;
> +		}
>  		sched_yield();
>  	}
>  	ret = sched_getattr(0, &attr, sizeof(attr), 0);
> @@ -1063,9 +1085,10 @@ static void write_stats(FILE *f, void *data)
>  	fprintf(f, "  }\n");
>  }
>  
> -enum options_valud {
> +enum options_values {
>  	OPT_AFFINITY=1, OPT_DURATION, OPT_HELP, OPT_INTERVAL,
> -	OPT_JSON, OPT_STEP, OPT_THREADS, OPT_QUIET
> +	OPT_JSON, OPT_STEP, OPT_THREADS, OPT_QUIET,
> +	OPT_BREAKTRACE, OPT_TRACEMARK,
>  };
>  
>  int main(int argc, char **argv)
> @@ -1104,9 +1127,11 @@ int main(int argc, char **argv)
>  			{ "step",	required_argument,	NULL,	OPT_STEP },
>  			{ "threads",	required_argument,	NULL,	OPT_THREADS },
>  			{ "quiet",	no_argument,		NULL,	OPT_QUIET },
> +			{ "breaktrace",       required_argument, NULL, OPT_BREAKTRACE },
> +			{ "tracemark",	     no_argument,	NULL, OPT_TRACEMARK },
>  			{ NULL,		0,			NULL,	0   },
>  		};
> -		c = getopt_long(argc, argv, "a::c:D:hi:s:t:q", options, NULL);
> +		c = getopt_long(argc, argv, "a::c:D:hi:s:t:b:q", options, NULL);
>  		if (c == -1)
>  			break;
>  		switch (c) {
> @@ -1141,6 +1166,10 @@ int main(int argc, char **argv)
>  		case 'D':
>  			duration = parse_time_string(optarg);
>  			break;
> +		case 'b':
> +		case OPT_BREAKTRACE:
> +			tracelimit = atoi(optarg);
> +			break;
>  		case OPT_QUIET:
>  		case 'q':
>  			quiet = 1;
> @@ -1149,6 +1178,9 @@ int main(int argc, char **argv)
>  		case 'h':
>  			usage(0);
>  			break;
> +		case OPT_TRACEMARK:
> +			trace_marker = 1;
> +			break;
>  		default:
>  			usage(1);
>  		}
> @@ -1186,6 +1218,8 @@ int main(int argc, char **argv)
>  		warn("mlockall");
>  
>  	setup_ftrace_marker();
> +	if (tracelimit && trace_marker)
> +		enable_trace_mark();
>  
>  	thread = calloc(nr_threads, sizeof(*thread));
>  	sched_data = calloc(nr_threads, sizeof(*sched_data));
> @@ -1294,6 +1328,13 @@ int main(int argc, char **argv)
>  
>  	loop(sched_data, nr_threads);
>  
> +	if (tracelimit) {
> +		if (break_thread_id) {
> +			printf("# Break thread: %d\n", break_thread_id);
> +			printf("# Break value: %llu\n", (unsigned long long)break_thread_value);
> +		}
> +	}
> +
>  	for (i = 0; i < nr_threads; i++) {
>  
>  		sd = &sched_data[i];
> -- 
> 2.25.1
> 
> 
    - Fixed style problems reported by checkpatch from kernel, namely
    - Don't initialize static to 0
    - no space after open parenthesis
    - removed multiple spaces after Reviewed-by
    Signed-off-by: John Kacur <jkacur@xxxxxxxxxx>




[Index of Archives]     [RT Stable]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]

  Powered by Linux