diff --git a/src/cyclictest/cyclictest.c b/src/cyclictest/cyclictest.c index 807041d..abf3e8b 100644 --- a/src/cyclictest/cyclictest.c +++ b/src/cyclictest/cyclictest.c @@ -249,6 +249,7 @@ static char functiontracer[MAX_PATH]; static char traceroptions[MAX_PATH]; static int trace_fd = -1; +static int tracemark_fd = -1; static int kernvar(int mode, const char *name, char *value, size_t sizeofvalue) { @@ -378,6 +379,27 @@ static int trace_file_exists(char *name) return stat(path, &sbuf) ? 0 : 1; } +#define TRACEBUFSIZ 1024 +static __thread char tracebuf[TRACEBUFSIZ]; + +static void tracemark(char *fmt, ...) +{ + va_list ap; + int len; + + /* bail out if we're not tracing */ + /* or if the kernel doesn't support trace_mark */ + if (tracemark_fd < 0) + return; + + va_start(ap, fmt); + len = vsnprintf(tracebuf, TRACEBUFSIZ, fmt, ap); + va_end(ap); + write(tracemark_fd, tracebuf, len); +} + + + void tracing(int on) { if (on) { @@ -540,6 +562,14 @@ static void setup_tracer(void) fatal("unable to open %s for tracing", path); } + /* open the tracemark file descriptor */ + if (tracemark_fd == -1) { + char path[MAX_PATH]; + strcat(strcpy(path, fileprefix), "trace_marker"); + if ((tracemark_fd = open(path, O_WRONLY)) == -1) + warn("unable to open trace_marker file: %s\n", path); + } + } else { setkernvar("trace_all_cpus", "1"); setkernvar("trace_freerunning", "1"); @@ -839,6 +869,7 @@ void *timerthread(void *param) if (!stopped && tracelimit && (diff > tracelimit)) { stopped++; + tracemark("hit latency threshold (%d > %d)", diff, tracelimit); tracing(0); shutdown++; pthread_mutex_lock(&break_thread_id_lock); @@ -1830,6 +1861,8 @@ int main(int argc, char **argv) /* close any tracer file descriptors */ + if (tracemark_fd >= 0) + close(tracemark_fd); if (trace_fd >= 0) close(trace_fd);