On Mon, 17 Aug 2020, Peter Xu wrote: > Then they can be further used by other programs too. > > Two trivial things to mention. > > Firstly, move trace_marker out of enable_trace_mark(). No functional change. > > Secondly, remove the fileprefix setting in process_options(), because if > tracelimit is non-zero, fileprefix will be after all replaced by a further call > to get_debugfileprefix() in debugfs_prepare(). > > Signed-off-by: Peter Xu <peterx@xxxxxxxxxx> > --- > src/cyclictest/cyclictest.c | 90 +------------------------------------ > src/include/rt-utils.h | 3 ++ > src/lib/rt-utils.c | 82 +++++++++++++++++++++++++++++++++ > 3 files changed, 86 insertions(+), 89 deletions(-) > > diff --git a/src/cyclictest/cyclictest.c b/src/cyclictest/cyclictest.c > index eb61be3..dd41893 100644 > --- a/src/cyclictest/cyclictest.c > +++ b/src/cyclictest/cyclictest.c > @@ -219,8 +219,6 @@ static pthread_barrier_t align_barr; > static pthread_barrier_t globalt_barr; > static struct timespec globalt; > > -static char *procfileprefix = "/proc/sys/kernel/"; > -static char *fileprefix; > static char fifopath[MAX_PATH]; > static char histfile[MAX_PATH]; > > @@ -330,89 +328,6 @@ static inline int64_t calctime(struct timespec t) > return time; > } > > -static int trace_file_exists(char *name) > -{ > - struct stat sbuf; > - char *tracing_prefix = get_debugfileprefix(); > - char path[MAX_PATH]; > - strcat(strcpy(path, tracing_prefix), name); > - return stat(path, &sbuf) ? 0 : 1; > -} > - > -#define TRACEBUFSIZ 1024 > -static __thread char tracebuf[TRACEBUFSIZ]; > - > -static void tracemark(char *fmt, ...) __attribute__((format(printf, 1, 2))); > -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 || trace_fd < 0) > - return; > - > - va_start(ap, fmt); > - len = vsnprintf(tracebuf, TRACEBUFSIZ, fmt, ap); > - va_end(ap); > - > - /* write the tracemark message */ > - write(tracemark_fd, tracebuf, len); > - > - /* now stop any trace */ > - write(trace_fd, "0\n", 2); > -} > - > -static void open_tracemark_fd(void) > -{ > - char path[MAX_PATH]; > - > - /* > - * open the tracemark file if it's not already open > - */ > - if (tracemark_fd < 0) { > - sprintf(path, "%s/%s", fileprefix, "trace_marker"); > - tracemark_fd = open(path, O_WRONLY); > - if (tracemark_fd < 0) { > - warn("unable to open trace_marker file: %s\n", path); > - return; > - } > - } > - > - /* > - * if we're not tracing and the tracing_on fd is not open, > - * open the tracing_on file so that we can stop the trace > - * if we hit a breaktrace threshold > - */ > - if (trace_fd < 0) { > - sprintf(path, "%s/%s", fileprefix, "tracing_on"); > - if ((trace_fd = open(path, O_WRONLY)) < 0) > - warn("unable to open tracing_on file: %s\n", path); > - } > -} > - > -static void debugfs_prepare(void) > -{ > - if (mount_debugfs(NULL)) > - fatal("could not mount debugfs"); > - > - fileprefix = get_debugfileprefix(); > - if (!trace_file_exists("tracing_enabled") && > - !trace_file_exists("tracing_on")) > - warn("tracing_enabled or tracing_on not found\n" > - "debug fs not mounted"); > -} > - > -static void enable_trace_mark(void) > -{ > - if (!trace_marker) > - return; > - > - debugfs_prepare(); > - open_tracemark_fd(); > -} > - > /* > * Raise the soft priority limit up to prio, if that is less than or equal > * to the hard limit > @@ -1498,9 +1413,6 @@ static void process_options (int argc, char *argv[], int max_cpus) > "on this processor\n"); > } > > - if (tracelimit) > - fileprefix = procfileprefix; > - > if (clocksel < 0 || clocksel > ARRAY_SIZE(clocksources)) > error = 1; > > @@ -2065,7 +1977,7 @@ int main(int argc, char **argv) > /* use the /dev/cpu_dma_latency trick if it's there */ > set_latency_target(); > > - if (tracelimit) > + if (tracelimit && trace_marker) > enable_trace_mark(); > > if (check_timer()) > diff --git a/src/include/rt-utils.h b/src/include/rt-utils.h > index 6ec2b20..51489b4 100644 > --- a/src/include/rt-utils.h > +++ b/src/include/rt-utils.h > @@ -27,4 +27,7 @@ pid_t gettid(void); > > int parse_time_string(char *val); > > +void enable_trace_mark(void); > +void tracemark(char *fmt, ...) __attribute__((format(printf, 1, 2))); > + > #endif /* __RT_UTILS.H */ > diff --git a/src/lib/rt-utils.c b/src/lib/rt-utils.c > index 1998a32..f786588 100644 > --- a/src/lib/rt-utils.c > +++ b/src/lib/rt-utils.c > @@ -24,7 +24,13 @@ > #include "rt-sched.h" > #include "error.h" > > +#define TRACEBUFSIZ 1024 > + > static char debugfileprefix[MAX_PATH]; > +static char *fileprefix; > +static int trace_fd = -1; > +static int tracemark_fd = -1; > +static __thread char tracebuf[TRACEBUFSIZ]; > > /* > * Finds the tracing directory in a mounted debugfs > @@ -355,3 +361,79 @@ int parse_time_string(char *val) > } > return t; > } > + > +void open_tracemark_fd(void) > +{ > + char path[MAX_PATH]; > + > + /* > + * open the tracemark file if it's not already open > + */ > + if (tracemark_fd < 0) { > + sprintf(path, "%s/%s", fileprefix, "trace_marker"); > + tracemark_fd = open(path, O_WRONLY); > + if (tracemark_fd < 0) { > + warn("unable to open trace_marker file: %s\n", path); > + return; > + } > + } > + > + /* > + * if we're not tracing and the tracing_on fd is not open, > + * open the tracing_on file so that we can stop the trace > + * if we hit a breaktrace threshold > + */ > + if (trace_fd < 0) { > + sprintf(path, "%s/%s", fileprefix, "tracing_on"); > + if ((trace_fd = open(path, O_WRONLY)) < 0) > + warn("unable to open tracing_on file: %s\n", path); > + } > +} > + > +int trace_file_exists(char *name) > +{ > + struct stat sbuf; > + char *tracing_prefix = get_debugfileprefix(); > + char path[MAX_PATH]; > + strcat(strcpy(path, tracing_prefix), name); > + return stat(path, &sbuf) ? 0 : 1; > +} > + > +void debugfs_prepare(void) > +{ > + if (mount_debugfs(NULL)) > + fatal("could not mount debugfs"); > + > + fileprefix = get_debugfileprefix(); > + if (!trace_file_exists("tracing_enabled") && > + !trace_file_exists("tracing_on")) > + warn("tracing_enabled or tracing_on not found\n" > + "debug fs not mounted"); > +} > + > +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 || trace_fd < 0) > + return; > + > + va_start(ap, fmt); > + len = vsnprintf(tracebuf, TRACEBUFSIZ, fmt, ap); > + va_end(ap); > + > + /* write the tracemark message */ > + write(tracemark_fd, tracebuf, len); > + > + /* now stop any trace */ > + write(trace_fd, "0\n", 2); > +} > + > +void enable_trace_mark(void) > +{ > + debugfs_prepare(); > + open_tracemark_fd(); > +} > -- > 2.26.2 > > Signed-off-by: John Kacur <jkacur@xxxxxxxxxx>