@@ -80,7 +80,10 @@ struct sched_data {
};
static int shutdown;
-
+static int tracelimit = 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;
@@ -689,6 +692,7 @@ 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"
);
exit(error);
}
@@ -825,6 +829,19 @@ 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;
+ ftrace_write(sd->buff,
+ "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 +1080,9 @@ 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,
};
int main(int argc, char **argv)
@@ -1104,9 +1121,10 @@ 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 },
{ 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 +1159,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;
@@ -1294,6 +1316,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];