Messages in this thread Patch in this message | | | Date | Thu, 11 Feb 2021 14:56:48 -0500 | From | Steven Rostedt <> | Subject | Re: [PATCH] Add the latency-collector to tools |
| |
On Thu, 11 Feb 2021 17:17:42 +0100 Viktor Rosendahl <Viktor.Rosendahl@bmw.de> wrote:
> It seems to work but I discovered during testing that it seems like newer > kernels have a tendency to lose some latencies in longer bursts. I guess this > is likely to be another regression in the preemptirqsoff tracer.
Not sure what you mean by the above. I'd be interested in fixing it if is really a problem.
> diff --git a/tools/tracing/Makefile b/tools/tracing/Makefile > new file mode 100644 > index 000000000000..f53859765154 > --- /dev/null > +++ b/tools/tracing/Makefile > @@ -0,0 +1,23 @@ > +# SPDX-License-Identifier: GPL-2.0 > +# Makefile for vm tools > +# > +VAR_CFLAGS := $(shell pkg-config --cflags libtracefs 2>/dev/null) > +VAR_LDLIBS := $(shell pkg-config --libs libtracefs 2>/dev/null) > + > +TARGETS = latency-collector > +CFLAGS = -Wall -Wextra -g -O2 $(VAR_CFLAGS) > +LDFLAGS = -lpthread $(VAR_LDLIBS) > + > +all: $(TARGETS) > + > +%: %.c > + $(CC) $(CFLAGS) -o $@ $< $(LDFLAGS) > + > +clean: > + $(RM) latency-collector > + > +sbindir ?= /usr/sbin
I wonder if it should default to /usr/local?
prefix ?= /usr/local sbindir ?= ${prefix}/sbin
> + > +install: all > + install -d $(DESTDIR)$(sbindir) > + install -m 755 -p $(TARGETS) $(DESTDIR)$(sbindir) > diff --git a/tools/tracing/latency-collector.c b/tools/tracing/latency-collector.c > new file mode 100644 > index 000000000000..e9aa7a47a8a3 > --- /dev/null > +++ b/tools/tracing/latency-collector.c > @@ -0,0 +1,2102 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * Copyright (C) 2017, 2018, 2019, 2021 BMW Car IT GmbH > + * Author: Viktor Rosendahl (viktor.rosendahl@bmw.de) > + */ > + > +#define _GNU_SOURCE > +#define _POSIX_C_SOURCE 200809L > + > +#include <ctype.h> > +#include <stdbool.h> > +#include <stdio.h> > +#include <stdlib.h> > +#include <string.h> > + > +#include <err.h> > +#include <errno.h> > +#include <fcntl.h> > +#include <getopt.h> > +#include <sched.h> > +#include <linux/unistd.h> > +#include <signal.h> > +#include <sys/inotify.h> > +#include <unistd.h> > +#include <pthread.h> > +#include <tracefs.h> > + > +static const char *prg_name; > +static const char *prg_unknown = "unknown program name"; > + > +static int fd_stdout; > + > +static int sched_policy; > +static bool sched_policy_set; > + > +static int sched_pri; > +static bool sched_pri_set; > + > +static bool trace_enable = true; > +static bool setup_ftrace = true; > +static bool use_random_sleep; > + > +enum traceopt { > + OPTIDX_FUNC_TR = 0, > + OPTIDX_DISP_GR, > + OPTIDX_NR > +}; > + > +/* Should be in the order of enum traceopt */ > +static const char * const optstr[] = { > + "function-trace", /* OPTIDX_FUNC_TR */ > + "display-graph", /* OPTIDX_DISP_GR */ > + NULL > +}; A trick to force the enum and string order is this:
#define TRACE_OPTS \ C(FUNC_TR, "function-trace"), \ C(DISP_GR, "display-graph")
#undef C #define C(a, b) OPTIDX_##a
enum traceopt { TRACE_OPTS, OPTIDX_NR }; #undef C #define C(a, b) b
static const char *cost optstr[] = { TRACE_OPTS, NULL };
> + > +enum errhandling { > + ERR_EXIT = 0, > + ERR_WARN, > + ERR_CLEANUP, > +};
I didn't look too deeply at the rest, just skimmed it basically, and I tried it out.
I'm fine with pulling this into my queue, as it's just a tool and wont cause any other issues. I can move some of the files in scripts that deals with tracing into the tools/tracing directory too. Maybe this should be placed in a sub directory? tools/tracing/latency/ ?
Feel free to submit a proper patch (proper change log, etc).
Thanks,
-- Steve
| |