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@goodmis.org>
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];
