Most users write a trace mark and expect that the trace stops afterwads. Decoupling writting and stopping the trace so it can be used in context where trace stopping is not needed. Make tracemark() writting just to the tracemark file. Add tracing_stop() which stops tracing and let current users of tracemark() use it. Signed-off-by: Sebastian Andrzej Siewior <bigeasy@xxxxxxxxxxxxx> --- src/cyclictest/cyclictest.c | 1 + src/include/rt-utils.h | 1 + src/lib/rt-utils.c | 8 ++++++-- src/oslat/oslat.c | 1 + src/sched_deadline/cyclicdeadline.c | 1 + 5 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/cyclictest/cyclictest.c b/src/cyclictest/cyclictest.c index 890da5d869c92..b4bce8915b432 100644 --- a/src/cyclictest/cyclictest.c +++ b/src/cyclictest/cyclictest.c @@ -852,6 +852,7 @@ static void *timerthread(void *param) break_thread_id = stat->tid; tracemark("hit latency threshold (%llu > %d)", (unsigned long long) diff, tracelimit); + tracing_stop(); break_thread_value = diff; } pthread_mutex_unlock(&break_thread_id_lock); diff --git a/src/include/rt-utils.h b/src/include/rt-utils.h index 569023c5d3051..e148dd77fd7d8 100644 --- a/src/include/rt-utils.h +++ b/src/include/rt-utils.h @@ -31,6 +31,7 @@ int parse_mem_string(char *str, uint64_t *val); void enable_trace_mark(void); void tracemark(char *fmt, ...) __attribute__((format(printf, 1, 2))); +void tracing_stop(void); void disable_trace_mark(void); #define MSEC_PER_SEC 1000 diff --git a/src/lib/rt-utils.c b/src/lib/rt-utils.c index 294fc9683a122..e504b17738411 100644 --- a/src/lib/rt-utils.c +++ b/src/lib/rt-utils.c @@ -427,7 +427,7 @@ void tracemark(char *fmt, ...) /* bail out if we're not tracing */ /* or if the kernel doesn't support trace_mark */ - if (tracemark_fd < 0 || trace_fd < 0) + if (tracemark_fd < 0) return; va_start(ap, fmt); @@ -436,8 +436,12 @@ void tracemark(char *fmt, ...) /* write the tracemark message */ write(tracemark_fd, tracebuf, len); +} - /* now stop any trace */ +void tracing_stop(void) +{ + if (trace_fd < 0) + return; write(trace_fd, "0\n", 2); } diff --git a/src/oslat/oslat.c b/src/oslat/oslat.c index 9e5a08a2fbd92..4291221dc6521 100644 --- a/src/oslat/oslat.c +++ b/src/oslat/oslat.c @@ -340,6 +340,7 @@ static void insert_bucket(struct thread *t, stamp_t value) char *line = "%s: Trace threshold (%d us) triggered on cpu %d with %.*f us!\n"; tracemark(line, g.app_name, g.trace_threshold, t->core_i, g.precision, us); + tracing_stop(); err_quit(line, g.app_name, g.trace_threshold, t->core_i, g.precision, us); } diff --git a/src/sched_deadline/cyclicdeadline.c b/src/sched_deadline/cyclicdeadline.c index 04e61edc68d83..e2f827deb275a 100644 --- a/src/sched_deadline/cyclicdeadline.c +++ b/src/sched_deadline/cyclicdeadline.c @@ -885,6 +885,7 @@ void *run_deadline(void *data) break_thread_value = stat->max; tracemark("hit latency threshold (%lld > %d)", (unsigned long long) stat->max, tracelimit); + tracing_stop(); } pthread_mutex_unlock(&break_thread_id_lock); break; -- 2.51.0