mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-11-24 16:01:14 +07:00
Changes in user visible interfaces:
. Rename 'record's --no-delay option to --no-buffering, better reflecting its purpose and freeing up '--delay' to take the place of '--initial-delay', so that 'record' and 'stat' are consistent. Refactorings: . Get rid of die() and friends (good riddance!) in libtraceevent (Namhyung Kim) Developer stuff: . Fix cross build problems related to pkgconfig and CROSS_COMPILE not being propagated to the feature tests, leading to features being tested in the host and then being enabled on the target. (Mark Rutland) . Fix pointer-integer size mismatch in some libtraceevent plugins (Mark Rutland) . Fix build error due to zfree() cast (Namhyung Kim) Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.15 (GNU/Linux) iQIcBAABAgAGBQJS1u6yAAoJENZQFvNTUqpAYosP/iA/tWMBZcCr18BDFkdoXdDh s8Mjq7UZAELXvX8HsQGNz1FyJJwQXAkpiqk+5t8+FsDuSMWHvhgVPd0V7ObMGGSN vZGfaPZ3QuTv+z+a7t7x1iI11WOAiaWU979ni3TDpQruOBWeum0+JED4rsgdTZne PFcGZDeODXbnAGOg5zJRcIlnBQvn3AtIWrGuvsNgxJ/SJMl9ZxQwj+mCZHmwgka5 0zNpDGYkrhYQoNMOtz4GshvMZfgzN8iGaGzTbiQs5HvWA4YGoFAXkLyW89EUyI3L 5tmmhlf5wFQ8HzUHfdBrVmUVcqz5QYnAR+GejyuJPPcqVJogP2tMY0j4nbSeI9Q1 aAwOsX7OLhSzlsdu/hKVNmJk65MpbyOTYRkImgUxdEcchGWrwXIIVwi8xuCQ6RS4 y4RsBOqDInRgEdPkwe2vkfK0FbmOqdqrFyIN8b3w1qCBF6Twr0uKduaMZ7sDRPV0 Y7hJCJOLH30ORANcrDz2WFGFcBLzkie+MLOQkjBfDUaODQ+m/jQ0W9NFxfLlQ9D+ lhCgCKa8i2GXLrnHpPhCqQdU+ZkBAXceivs+cHLE4B+v23HUu8O5Y07Nq9E+OUH5 p97wrnZhiYVBMiR1wrTWqtmgPsqUzx/+zaQ9QNd/9XRdtXbkoJoGhYWUDGdfckLk 39XH8uIh1KRLTmDlRIla =ur7j -----END PGP SIGNATURE----- Merge tag 'perf-core-for-mingo' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/core Pull perf/core updates from Arnaldo Carvalho de Melo: Changes in user visible interfaces: * Rename 'record's --no-delay option to --no-buffering, better reflecting its purpose and freeing up '--delay' to take the place of '--initial-delay', so that 'record' and 'stat' are consistent. Refactorings: * Get rid of die() and friends (good riddance!) in libtraceevent (Namhyung Kim) Infrastructure enhancements: * Fix cross build problems related to pkgconfig and CROSS_COMPILE not being propagated to the feature tests, leading to features being tested in the host and then being enabled on the target. (Mark Rutland) * Fix pointer-integer size mismatch in some libtraceevent plugins (Mark Rutland) * Fix build error due to zfree() cast (Namhyung Kim) Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
commit
3e7e09dbd1
@ -136,7 +136,7 @@ export Q VERBOSE
|
||||
|
||||
EVENT_PARSE_VERSION = $(EP_VERSION).$(EP_PATCHLEVEL).$(EP_EXTRAVERSION)
|
||||
|
||||
INCLUDES = -I. $(CONFIG_INCLUDES)
|
||||
INCLUDES = -I. -I $(srctree)/../../include $(CONFIG_INCLUDES)
|
||||
|
||||
# Set compile option CFLAGS if not set elsewhere
|
||||
CFLAGS ?= -g -Wall
|
||||
|
@ -58,6 +58,12 @@ struct pevent_record {
|
||||
#endif
|
||||
};
|
||||
|
||||
enum trace_seq_fail {
|
||||
TRACE_SEQ__GOOD,
|
||||
TRACE_SEQ__BUFFER_POISONED,
|
||||
TRACE_SEQ__MEM_ALLOC_FAILED,
|
||||
};
|
||||
|
||||
/*
|
||||
* Trace sequences are used to allow a function to call several other functions
|
||||
* to create a string of data to use (up to a max of PAGE_SIZE).
|
||||
@ -68,6 +74,7 @@ struct trace_seq {
|
||||
unsigned int buffer_size;
|
||||
unsigned int len;
|
||||
unsigned int readpos;
|
||||
enum trace_seq_fail state;
|
||||
};
|
||||
|
||||
void trace_seq_init(struct trace_seq *s);
|
||||
@ -98,7 +105,7 @@ typedef int (*pevent_event_handler_func)(struct trace_seq *s,
|
||||
void *context);
|
||||
|
||||
typedef int (*pevent_plugin_load_func)(struct pevent *pevent);
|
||||
typedef int (*pevent_plugin_unload_func)(void);
|
||||
typedef int (*pevent_plugin_unload_func)(struct pevent *pevent);
|
||||
|
||||
struct plugin_option {
|
||||
struct plugin_option *next;
|
||||
@ -123,7 +130,7 @@ struct plugin_option {
|
||||
* PEVENT_PLUGIN_UNLOADER: (optional)
|
||||
* The function called just before unloading
|
||||
*
|
||||
* int PEVENT_PLUGIN_UNLOADER(void)
|
||||
* int PEVENT_PLUGIN_UNLOADER(struct pevent *pevent)
|
||||
*
|
||||
* PEVENT_PLUGIN_OPTIONS: (optional)
|
||||
* Plugin options that can be set before loading
|
||||
@ -404,7 +411,8 @@ enum pevent_errno {
|
||||
struct plugin_list;
|
||||
|
||||
struct plugin_list *traceevent_load_plugins(struct pevent *pevent);
|
||||
void traceevent_unload_plugins(struct plugin_list *plugin_list);
|
||||
void traceevent_unload_plugins(struct plugin_list *plugin_list,
|
||||
struct pevent *pevent);
|
||||
|
||||
struct cmdline;
|
||||
struct cmdline_list;
|
||||
|
@ -197,7 +197,7 @@ traceevent_load_plugins(struct pevent *pevent)
|
||||
}
|
||||
|
||||
void
|
||||
traceevent_unload_plugins(struct plugin_list *plugin_list)
|
||||
traceevent_unload_plugins(struct plugin_list *plugin_list, struct pevent *pevent)
|
||||
{
|
||||
pevent_plugin_unload_func func;
|
||||
struct plugin_list *list;
|
||||
@ -207,7 +207,7 @@ traceevent_unload_plugins(struct plugin_list *plugin_list)
|
||||
plugin_list = list->next;
|
||||
func = dlsym(list->handle, PEVENT_PLUGIN_UNLOADER_NAME);
|
||||
if (func)
|
||||
func();
|
||||
func(pevent);
|
||||
dlclose(list->handle);
|
||||
free(list->name);
|
||||
free(list);
|
||||
|
@ -23,18 +23,14 @@
|
||||
#include <ctype.h>
|
||||
|
||||
/* Can be overridden */
|
||||
void die(const char *fmt, ...);
|
||||
void *malloc_or_die(unsigned int size);
|
||||
void warning(const char *fmt, ...);
|
||||
void pr_stat(const char *fmt, ...);
|
||||
void vpr_stat(const char *fmt, va_list ap);
|
||||
|
||||
/* Always available */
|
||||
void __die(const char *fmt, ...);
|
||||
void __warning(const char *fmt, ...);
|
||||
void __pr_stat(const char *fmt, ...);
|
||||
|
||||
void __vdie(const char *fmt, ...);
|
||||
void __vwarning(const char *fmt, ...);
|
||||
void __vpr_stat(const char *fmt, ...);
|
||||
|
||||
|
@ -25,40 +25,6 @@
|
||||
|
||||
#define __weak __attribute__((weak))
|
||||
|
||||
void __vdie(const char *fmt, va_list ap)
|
||||
{
|
||||
int ret = errno;
|
||||
|
||||
if (errno)
|
||||
perror("trace-cmd");
|
||||
else
|
||||
ret = -1;
|
||||
|
||||
fprintf(stderr, " ");
|
||||
vfprintf(stderr, fmt, ap);
|
||||
|
||||
fprintf(stderr, "\n");
|
||||
exit(ret);
|
||||
}
|
||||
|
||||
void __die(const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
va_start(ap, fmt);
|
||||
__vdie(fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
void __weak die(const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
va_start(ap, fmt);
|
||||
__vdie(fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
void __vwarning(const char *fmt, va_list ap)
|
||||
{
|
||||
if (errno)
|
||||
@ -117,13 +83,3 @@ void __weak pr_stat(const char *fmt, ...)
|
||||
__vpr_stat(fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
void __weak *malloc_or_die(unsigned int size)
|
||||
{
|
||||
void *data;
|
||||
|
||||
data = malloc(size);
|
||||
if (!data)
|
||||
die("malloc");
|
||||
return data;
|
||||
}
|
||||
|
@ -8,7 +8,7 @@ static unsigned long long
|
||||
process___le16_to_cpup(struct trace_seq *s,
|
||||
unsigned long long *args)
|
||||
{
|
||||
uint16_t *val = (uint16_t *) args[0];
|
||||
uint16_t *val = (uint16_t *) (unsigned long) args[0];
|
||||
return val ? (long long) le16toh(*val) : 0;
|
||||
}
|
||||
|
||||
|
@ -144,7 +144,7 @@ int PEVENT_PLUGIN_LOADER(struct pevent *pevent)
|
||||
return 0;
|
||||
}
|
||||
|
||||
void PEVENT_PLUGIN_UNLOADER(void)
|
||||
void PEVENT_PLUGIN_UNLOADER(struct pevent *pevent)
|
||||
{
|
||||
int i, x;
|
||||
|
||||
|
@ -405,7 +405,7 @@ scsi_trace_parse_cdb(struct trace_seq *p, unsigned char *cdb, int len)
|
||||
unsigned long long process_scsi_trace_parse_cdb(struct trace_seq *s,
|
||||
unsigned long long *args)
|
||||
{
|
||||
scsi_trace_parse_cdb(s, (unsigned char *) args[1], args[2]);
|
||||
scsi_trace_parse_cdb(s, (unsigned char *) (unsigned long) args[1], args[2]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -22,6 +22,7 @@
|
||||
#include <string.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
#include <asm/bug.h>
|
||||
#include "event-parse.h"
|
||||
#include "event-utils.h"
|
||||
|
||||
@ -32,10 +33,21 @@
|
||||
#define TRACE_SEQ_POISON ((void *)0xdeadbeef)
|
||||
#define TRACE_SEQ_CHECK(s) \
|
||||
do { \
|
||||
if ((s)->buffer == TRACE_SEQ_POISON) \
|
||||
die("Usage of trace_seq after it was destroyed"); \
|
||||
if (WARN_ONCE((s)->buffer == TRACE_SEQ_POISON, \
|
||||
"Usage of trace_seq after it was destroyed")) \
|
||||
(s)->state = TRACE_SEQ__BUFFER_POISONED; \
|
||||
} while (0)
|
||||
|
||||
#define TRACE_SEQ_CHECK_RET_N(s, n) \
|
||||
do { \
|
||||
TRACE_SEQ_CHECK(s); \
|
||||
if ((s)->state != TRACE_SEQ__GOOD) \
|
||||
return n; \
|
||||
} while (0)
|
||||
|
||||
#define TRACE_SEQ_CHECK_RET(s) TRACE_SEQ_CHECK_RET_N(s, )
|
||||
#define TRACE_SEQ_CHECK_RET0(s) TRACE_SEQ_CHECK_RET_N(s, 0)
|
||||
|
||||
/**
|
||||
* trace_seq_init - initialize the trace_seq structure
|
||||
* @s: a pointer to the trace_seq structure to initialize
|
||||
@ -45,7 +57,11 @@ void trace_seq_init(struct trace_seq *s)
|
||||
s->len = 0;
|
||||
s->readpos = 0;
|
||||
s->buffer_size = TRACE_SEQ_BUF_SIZE;
|
||||
s->buffer = malloc_or_die(s->buffer_size);
|
||||
s->buffer = malloc(s->buffer_size);
|
||||
if (s->buffer != NULL)
|
||||
s->state = TRACE_SEQ__GOOD;
|
||||
else
|
||||
s->state = TRACE_SEQ__MEM_ALLOC_FAILED;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -71,17 +87,23 @@ void trace_seq_destroy(struct trace_seq *s)
|
||||
{
|
||||
if (!s)
|
||||
return;
|
||||
TRACE_SEQ_CHECK(s);
|
||||
TRACE_SEQ_CHECK_RET(s);
|
||||
free(s->buffer);
|
||||
s->buffer = TRACE_SEQ_POISON;
|
||||
}
|
||||
|
||||
static void expand_buffer(struct trace_seq *s)
|
||||
{
|
||||
char *buf;
|
||||
|
||||
buf = realloc(s->buffer, s->buffer_size + TRACE_SEQ_BUF_SIZE);
|
||||
if (WARN_ONCE(!buf, "Can't allocate trace_seq buffer memory")) {
|
||||
s->state = TRACE_SEQ__MEM_ALLOC_FAILED;
|
||||
return;
|
||||
}
|
||||
|
||||
s->buffer = buf;
|
||||
s->buffer_size += TRACE_SEQ_BUF_SIZE;
|
||||
s->buffer = realloc(s->buffer, s->buffer_size);
|
||||
if (!s->buffer)
|
||||
die("Can't allocate trace_seq buffer memory");
|
||||
}
|
||||
|
||||
/**
|
||||
@ -105,9 +127,9 @@ trace_seq_printf(struct trace_seq *s, const char *fmt, ...)
|
||||
int len;
|
||||
int ret;
|
||||
|
||||
TRACE_SEQ_CHECK(s);
|
||||
|
||||
try_again:
|
||||
TRACE_SEQ_CHECK_RET0(s);
|
||||
|
||||
len = (s->buffer_size - 1) - s->len;
|
||||
|
||||
va_start(ap, fmt);
|
||||
@ -141,9 +163,9 @@ trace_seq_vprintf(struct trace_seq *s, const char *fmt, va_list args)
|
||||
int len;
|
||||
int ret;
|
||||
|
||||
TRACE_SEQ_CHECK(s);
|
||||
|
||||
try_again:
|
||||
TRACE_SEQ_CHECK_RET0(s);
|
||||
|
||||
len = (s->buffer_size - 1) - s->len;
|
||||
|
||||
ret = vsnprintf(s->buffer + s->len, len, fmt, args);
|
||||
@ -172,13 +194,15 @@ int trace_seq_puts(struct trace_seq *s, const char *str)
|
||||
{
|
||||
int len;
|
||||
|
||||
TRACE_SEQ_CHECK(s);
|
||||
TRACE_SEQ_CHECK_RET0(s);
|
||||
|
||||
len = strlen(str);
|
||||
|
||||
while (len > ((s->buffer_size - 1) - s->len))
|
||||
expand_buffer(s);
|
||||
|
||||
TRACE_SEQ_CHECK_RET0(s);
|
||||
|
||||
memcpy(s->buffer + s->len, str, len);
|
||||
s->len += len;
|
||||
|
||||
@ -187,11 +211,13 @@ int trace_seq_puts(struct trace_seq *s, const char *str)
|
||||
|
||||
int trace_seq_putc(struct trace_seq *s, unsigned char c)
|
||||
{
|
||||
TRACE_SEQ_CHECK(s);
|
||||
TRACE_SEQ_CHECK_RET0(s);
|
||||
|
||||
while (s->len >= (s->buffer_size - 1))
|
||||
expand_buffer(s);
|
||||
|
||||
TRACE_SEQ_CHECK_RET0(s);
|
||||
|
||||
s->buffer[s->len++] = c;
|
||||
|
||||
return 1;
|
||||
@ -199,7 +225,7 @@ int trace_seq_putc(struct trace_seq *s, unsigned char c)
|
||||
|
||||
void trace_seq_terminate(struct trace_seq *s)
|
||||
{
|
||||
TRACE_SEQ_CHECK(s);
|
||||
TRACE_SEQ_CHECK_RET(s);
|
||||
|
||||
/* There's always one character left on the buffer */
|
||||
s->buffer[s->len] = 0;
|
||||
@ -208,5 +234,16 @@ void trace_seq_terminate(struct trace_seq *s)
|
||||
int trace_seq_do_printf(struct trace_seq *s)
|
||||
{
|
||||
TRACE_SEQ_CHECK(s);
|
||||
return printf("%.*s", s->len, s->buffer);
|
||||
|
||||
switch (s->state) {
|
||||
case TRACE_SEQ__GOOD:
|
||||
return printf("%.*s", s->len, s->buffer);
|
||||
case TRACE_SEQ__BUFFER_POISONED:
|
||||
puts("Usage of trace_seq after it was destroyed");
|
||||
break;
|
||||
case TRACE_SEQ__MEM_ALLOC_FAILED:
|
||||
puts("Can't allocate trace_seq buffer memory");
|
||||
break;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
@ -68,8 +68,7 @@ OPTIONS
|
||||
--realtime=::
|
||||
Collect data with this RT SCHED_FIFO priority.
|
||||
|
||||
-D::
|
||||
--no-delay::
|
||||
--no-buffering::
|
||||
Collect data without buffering.
|
||||
|
||||
-c::
|
||||
@ -209,7 +208,8 @@ overrides that and uses per-thread mmaps. A side-effect of that is that
|
||||
inheritance is automatically disabled. --per-thread is ignored with a warning
|
||||
if combined with -a or -C options.
|
||||
|
||||
--initial-delay msecs::
|
||||
-D::
|
||||
--delay=::
|
||||
After starting the program, wait msecs before measuring. This is useful to
|
||||
filter out the startup phase of the program, which is often very different.
|
||||
|
||||
|
@ -76,6 +76,7 @@ $(OUTPUT)PERF-VERSION-FILE: ../../.git/HEAD
|
||||
|
||||
CC = $(CROSS_COMPILE)gcc
|
||||
AR = $(CROSS_COMPILE)ar
|
||||
PKG_CONFIG = $(CROSS_COMPILE)pkg-config
|
||||
|
||||
RM = rm -f
|
||||
LN = ln -f
|
||||
|
@ -838,7 +838,7 @@ const struct option record_options[] = {
|
||||
"record events on existing thread id"),
|
||||
OPT_INTEGER('r', "realtime", &record.realtime_prio,
|
||||
"collect data with this RT SCHED_FIFO priority"),
|
||||
OPT_BOOLEAN('D', "no-delay", &record.opts.no_delay,
|
||||
OPT_BOOLEAN(0, "no-buffering", &record.opts.no_buffering,
|
||||
"collect data without buffering"),
|
||||
OPT_BOOLEAN('R', "raw-samples", &record.opts.raw_samples,
|
||||
"collect raw sample records from all opened counters"),
|
||||
@ -882,7 +882,7 @@ const struct option record_options[] = {
|
||||
OPT_CALLBACK('G', "cgroup", &record.evlist, "name",
|
||||
"monitor event in cgroup name only",
|
||||
parse_cgroups),
|
||||
OPT_UINTEGER(0, "initial-delay", &record.opts.initial_delay,
|
||||
OPT_UINTEGER('D', "delay", &record.opts.initial_delay,
|
||||
"ms to wait before starting measurement after program start"),
|
||||
OPT_STRING('u', "uid", &record.opts.target.uid_str, "user",
|
||||
"user to profile"),
|
||||
|
@ -75,24 +75,6 @@ static int report__config(const char *var, const char *value, void *cb)
|
||||
return perf_default_config(var, value, cb);
|
||||
}
|
||||
|
||||
static int report__resolve_callchain(struct report *rep, struct symbol **parent,
|
||||
struct perf_evsel *evsel, struct addr_location *al,
|
||||
struct perf_sample *sample)
|
||||
{
|
||||
if ((sort__has_parent || symbol_conf.use_callchain) && sample->callchain) {
|
||||
return machine__resolve_callchain(al->machine, evsel, al->thread, sample,
|
||||
parent, al, rep->max_stack);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int hist_entry__append_callchain(struct hist_entry *he, struct perf_sample *sample)
|
||||
{
|
||||
if (!symbol_conf.use_callchain)
|
||||
return 0;
|
||||
return callchain_append(he->callchain, &callchain_cursor, sample->period);
|
||||
}
|
||||
|
||||
static int report__add_mem_hist_entry(struct perf_tool *tool, struct addr_location *al,
|
||||
struct perf_sample *sample, struct perf_evsel *evsel,
|
||||
union perf_event *event)
|
||||
@ -103,7 +85,7 @@ static int report__add_mem_hist_entry(struct perf_tool *tool, struct addr_locati
|
||||
struct hist_entry *he;
|
||||
struct mem_info *mi, *mx;
|
||||
uint64_t cost;
|
||||
int err = report__resolve_callchain(rep, &parent, evsel, al, sample);
|
||||
int err = sample__resolve_callchain(sample, &parent, evsel, al, rep->max_stack);
|
||||
|
||||
if (err)
|
||||
return err;
|
||||
@ -155,7 +137,7 @@ static int report__add_branch_hist_entry(struct perf_tool *tool, struct addr_loc
|
||||
unsigned i;
|
||||
struct hist_entry *he;
|
||||
struct branch_info *bi, *bx;
|
||||
int err = report__resolve_callchain(rep, &parent, evsel, al, sample);
|
||||
int err = sample__resolve_callchain(sample, &parent, evsel, al, rep->max_stack);
|
||||
|
||||
if (err)
|
||||
return err;
|
||||
@ -208,7 +190,7 @@ static int report__add_hist_entry(struct perf_tool *tool, struct perf_evsel *evs
|
||||
struct report *rep = container_of(tool, struct report, tool);
|
||||
struct symbol *parent = NULL;
|
||||
struct hist_entry *he;
|
||||
int err = report__resolve_callchain(rep, &parent, evsel, al, sample);
|
||||
int err = sample__resolve_callchain(sample, &parent, evsel, al, rep->max_stack);
|
||||
|
||||
if (err)
|
||||
return err;
|
||||
|
@ -743,15 +743,10 @@ static void perf_event__process_sample(struct perf_tool *tool,
|
||||
if (al.sym == NULL || !al.sym->ignore) {
|
||||
struct hist_entry *he;
|
||||
|
||||
if ((sort__has_parent || symbol_conf.use_callchain) &&
|
||||
sample->callchain) {
|
||||
err = machine__resolve_callchain(machine, evsel,
|
||||
al.thread, sample,
|
||||
&parent, &al,
|
||||
top->max_stack);
|
||||
if (err)
|
||||
return;
|
||||
}
|
||||
err = sample__resolve_callchain(sample, &parent, evsel, &al,
|
||||
top->max_stack);
|
||||
if (err)
|
||||
return;
|
||||
|
||||
he = perf_evsel__add_hist_entry(evsel, &al, sample);
|
||||
if (he == NULL) {
|
||||
@ -759,12 +754,9 @@ static void perf_event__process_sample(struct perf_tool *tool,
|
||||
return;
|
||||
}
|
||||
|
||||
if (symbol_conf.use_callchain) {
|
||||
err = callchain_append(he->callchain, &callchain_cursor,
|
||||
sample->period);
|
||||
if (err)
|
||||
return;
|
||||
}
|
||||
err = hist_entry__append_callchain(he, sample);
|
||||
if (err)
|
||||
return;
|
||||
|
||||
if (sort__has_sym)
|
||||
perf_top__record_precise_ip(top, he, evsel->idx, ip);
|
||||
|
@ -2258,7 +2258,7 @@ int cmd_trace(int argc, const char **argv, const char *prefix __maybe_unused)
|
||||
},
|
||||
.user_freq = UINT_MAX,
|
||||
.user_interval = ULLONG_MAX,
|
||||
.no_delay = true,
|
||||
.no_buffering = true,
|
||||
.mmap_pages = 1024,
|
||||
},
|
||||
.output = stdout,
|
||||
|
@ -372,7 +372,7 @@ ifndef NO_SLANG
|
||||
endif
|
||||
|
||||
ifndef NO_GTK2
|
||||
FLAGS_GTK2=$(CFLAGS) $(LDFLAGS) $(EXTLIBS) $(shell pkg-config --libs --cflags gtk+-2.0 2>/dev/null)
|
||||
FLAGS_GTK2=$(CFLAGS) $(LDFLAGS) $(EXTLIBS) $(shell $(PKG_CONFIG) --libs --cflags gtk+-2.0 2>/dev/null)
|
||||
ifneq ($(feature-gtk2), 1)
|
||||
msg := $(warning GTK2 not found, disables GTK2 support. Please install gtk2-devel or libgtk2.0-dev);
|
||||
NO_GTK2 := 1
|
||||
@ -381,8 +381,8 @@ ifndef NO_GTK2
|
||||
GTK_CFLAGS := -DHAVE_GTK_INFO_BAR_SUPPORT
|
||||
endif
|
||||
CFLAGS += -DHAVE_GTK2_SUPPORT
|
||||
GTK_CFLAGS += $(shell pkg-config --cflags gtk+-2.0 2>/dev/null)
|
||||
GTK_LIBS := $(shell pkg-config --libs gtk+-2.0 2>/dev/null)
|
||||
GTK_CFLAGS += $(shell $(PKG_CONFIG) --cflags gtk+-2.0 2>/dev/null)
|
||||
GTK_LIBS := $(shell $(PKG_CONFIG) --libs gtk+-2.0 2>/dev/null)
|
||||
EXTLIBS += -ldl
|
||||
endif
|
||||
endif
|
||||
|
@ -28,7 +28,8 @@ FILES= \
|
||||
test-stackprotector-all.bin \
|
||||
test-timerfd.bin
|
||||
|
||||
CC := $(CC) -MD
|
||||
CC := $(CROSS_COMPILE)gcc -MD
|
||||
PKG_CONFIG := $(CROSS_COMPILE)pkg-config
|
||||
|
||||
all: $(FILES)
|
||||
|
||||
@ -37,7 +38,7 @@ BUILD = $(CC) $(CFLAGS) -o $(OUTPUT)$@ $(patsubst %.bin,%.c,$@) $(LDFLAGS)
|
||||
###############################
|
||||
|
||||
test-all.bin:
|
||||
$(BUILD) -Werror -fstack-protector-all -O2 -Werror -D_FORTIFY_SOURCE=2 -ldw -lelf -lnuma -lelf -laudit -I/usr/include/slang -lslang $(shell pkg-config --libs --cflags gtk+-2.0 2>/dev/null) $(FLAGS_PERL_EMBED) $(FLAGS_PYTHON_EMBED) -DPACKAGE='"perf"' -lbfd -ldl
|
||||
$(BUILD) -Werror -fstack-protector-all -O2 -Werror -D_FORTIFY_SOURCE=2 -ldw -lelf -lnuma -lelf -laudit -I/usr/include/slang -lslang $(shell $(PKG_CONFIG) --libs --cflags gtk+-2.0 2>/dev/null) $(FLAGS_PERL_EMBED) $(FLAGS_PYTHON_EMBED) -DPACKAGE='"perf"' -lbfd -ldl
|
||||
|
||||
test-hello.bin:
|
||||
$(BUILD)
|
||||
@ -82,10 +83,10 @@ test-libslang.bin:
|
||||
$(BUILD) -I/usr/include/slang -lslang
|
||||
|
||||
test-gtk2.bin:
|
||||
$(BUILD) $(shell pkg-config --libs --cflags gtk+-2.0 2>/dev/null)
|
||||
$(BUILD) $(shell $(PKG_CONFIG) --libs --cflags gtk+-2.0 2>/dev/null)
|
||||
|
||||
test-gtk2-infobar.bin:
|
||||
$(BUILD) $(shell pkg-config --libs --cflags gtk+-2.0 2>/dev/null)
|
||||
$(BUILD) $(shell $(PKG_CONFIG) --libs --cflags gtk+-2.0 2>/dev/null)
|
||||
|
||||
grep-libs = $(filter -l%,$(1))
|
||||
strip-libs = $(filter-out -l%,$(1))
|
||||
|
@ -252,7 +252,7 @@ struct record_opts {
|
||||
int call_graph;
|
||||
bool group;
|
||||
bool inherit_stat;
|
||||
bool no_delay;
|
||||
bool no_buffering;
|
||||
bool no_inherit;
|
||||
bool no_inherit_set;
|
||||
bool no_samples;
|
||||
|
@ -11,10 +11,10 @@ int test__syscall_open_tp_fields(void)
|
||||
.uid = UINT_MAX,
|
||||
.uses_mmap = true,
|
||||
},
|
||||
.no_delay = true,
|
||||
.freq = 1,
|
||||
.mmap_pages = 256,
|
||||
.raw_samples = true,
|
||||
.no_buffering = true,
|
||||
.freq = 1,
|
||||
.mmap_pages = 256,
|
||||
.raw_samples = true,
|
||||
};
|
||||
const char *filename = "/etc/passwd";
|
||||
int flags = O_RDONLY | O_DIRECTORY;
|
||||
|
@ -39,9 +39,9 @@ int test__PERF_RECORD(void)
|
||||
.uid = UINT_MAX,
|
||||
.uses_mmap = true,
|
||||
},
|
||||
.no_delay = true,
|
||||
.freq = 10,
|
||||
.mmap_pages = 256,
|
||||
.no_buffering = true,
|
||||
.freq = 10,
|
||||
.mmap_pages = 256,
|
||||
};
|
||||
cpu_set_t cpu_mask;
|
||||
size_t cpu_mask_size = sizeof(cpu_mask);
|
||||
|
@ -17,6 +17,8 @@
|
||||
|
||||
#include "hist.h"
|
||||
#include "util.h"
|
||||
#include "sort.h"
|
||||
#include "machine.h"
|
||||
#include "callchain.h"
|
||||
|
||||
__thread struct callchain_cursor callchain_cursor;
|
||||
@ -531,3 +533,24 @@ int callchain_cursor_append(struct callchain_cursor *cursor,
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int sample__resolve_callchain(struct perf_sample *sample, struct symbol **parent,
|
||||
struct perf_evsel *evsel, struct addr_location *al,
|
||||
int max_stack)
|
||||
{
|
||||
if (sample->callchain == NULL)
|
||||
return 0;
|
||||
|
||||
if (symbol_conf.use_callchain || sort__has_parent) {
|
||||
return machine__resolve_callchain(al->machine, evsel, al->thread,
|
||||
sample, parent, al, max_stack);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int hist_entry__append_callchain(struct hist_entry *he, struct perf_sample *sample)
|
||||
{
|
||||
if (!symbol_conf.use_callchain)
|
||||
return 0;
|
||||
return callchain_append(he->callchain, &callchain_cursor, sample->period);
|
||||
}
|
||||
|
@ -145,10 +145,16 @@ static inline void callchain_cursor_advance(struct callchain_cursor *cursor)
|
||||
}
|
||||
|
||||
struct option;
|
||||
struct hist_entry;
|
||||
|
||||
int record_parse_callchain(const char *arg, struct record_opts *opts);
|
||||
int record_parse_callchain_opt(const struct option *opt, const char *arg, int unset);
|
||||
int record_callchain_opt(const struct option *opt, const char *arg, int unset);
|
||||
|
||||
int sample__resolve_callchain(struct perf_sample *sample, struct symbol **parent,
|
||||
struct perf_evsel *evsel, struct addr_location *al,
|
||||
int max_stack);
|
||||
int hist_entry__append_callchain(struct hist_entry *he, struct perf_sample *sample);
|
||||
|
||||
extern const char record_callchain_help[];
|
||||
#endif /* __PERF_CALLCHAIN_H */
|
||||
|
@ -627,7 +627,7 @@ void perf_evsel__config(struct perf_evsel *evsel, struct record_opts *opts)
|
||||
if (opts->sample_address)
|
||||
perf_evsel__set_sample_bit(evsel, DATA_SRC);
|
||||
|
||||
if (opts->no_delay) {
|
||||
if (opts->no_buffering) {
|
||||
attr->watermark = 0;
|
||||
attr->wakeup_events = 1;
|
||||
}
|
||||
|
@ -181,21 +181,21 @@ void hists__output_recalc_col_len(struct hists *hists, int max_rows)
|
||||
}
|
||||
}
|
||||
|
||||
static void hist_entry__add_cpumode_period(struct hist_entry *he,
|
||||
unsigned int cpumode, u64 period)
|
||||
static void he_stat__add_cpumode_period(struct he_stat *he_stat,
|
||||
unsigned int cpumode, u64 period)
|
||||
{
|
||||
switch (cpumode) {
|
||||
case PERF_RECORD_MISC_KERNEL:
|
||||
he->stat.period_sys += period;
|
||||
he_stat->period_sys += period;
|
||||
break;
|
||||
case PERF_RECORD_MISC_USER:
|
||||
he->stat.period_us += period;
|
||||
he_stat->period_us += period;
|
||||
break;
|
||||
case PERF_RECORD_MISC_GUEST_KERNEL:
|
||||
he->stat.period_guest_sys += period;
|
||||
he_stat->period_guest_sys += period;
|
||||
break;
|
||||
case PERF_RECORD_MISC_GUEST_USER:
|
||||
he->stat.period_guest_us += period;
|
||||
he_stat->period_guest_us += period;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@ -222,10 +222,10 @@ static void he_stat__add_stat(struct he_stat *dest, struct he_stat *src)
|
||||
dest->weight += src->weight;
|
||||
}
|
||||
|
||||
static void hist_entry__decay(struct hist_entry *he)
|
||||
static void he_stat__decay(struct he_stat *he_stat)
|
||||
{
|
||||
he->stat.period = (he->stat.period * 7) / 8;
|
||||
he->stat.nr_events = (he->stat.nr_events * 7) / 8;
|
||||
he_stat->period = (he_stat->period * 7) / 8;
|
||||
he_stat->nr_events = (he_stat->nr_events * 7) / 8;
|
||||
/* XXX need decay for weight too? */
|
||||
}
|
||||
|
||||
@ -236,7 +236,7 @@ static bool hists__decay_entry(struct hists *hists, struct hist_entry *he)
|
||||
if (prev_period == 0)
|
||||
return true;
|
||||
|
||||
hist_entry__decay(he);
|
||||
he_stat__decay(&he->stat);
|
||||
|
||||
if (!he->filtered)
|
||||
hists->stats.total_period -= prev_period - he->stat.period;
|
||||
@ -402,7 +402,7 @@ static struct hist_entry *add_hist_entry(struct hists *hists,
|
||||
rb_link_node(&he->rb_node_in, parent, p);
|
||||
rb_insert_color(&he->rb_node_in, hists->entries_in);
|
||||
out:
|
||||
hist_entry__add_cpumode_period(he, al->cpumode, period);
|
||||
he_stat__add_cpumode_period(&he->stat, al->cpumode, period);
|
||||
return he;
|
||||
}
|
||||
|
||||
|
@ -1314,8 +1314,6 @@ static int machine__resolve_callchain_sample(struct machine *machine,
|
||||
*root_al = al;
|
||||
callchain_cursor_reset(&callchain_cursor);
|
||||
}
|
||||
if (!symbol_conf.use_callchain)
|
||||
break;
|
||||
}
|
||||
|
||||
err = callchain_cursor_append(&callchain_cursor,
|
||||
|
@ -129,7 +129,7 @@ static struct a2l_data *addr2line_init(const char *path)
|
||||
|
||||
out:
|
||||
if (a2l) {
|
||||
zfree((void **)&a2l->input);
|
||||
zfree((char **)&a2l->input);
|
||||
free(a2l);
|
||||
}
|
||||
bfd_close(abfd);
|
||||
@ -140,7 +140,7 @@ static void addr2line_cleanup(struct a2l_data *a2l)
|
||||
{
|
||||
if (a2l->abfd)
|
||||
bfd_close(a2l->abfd);
|
||||
zfree((void **)&a2l->input);
|
||||
zfree((char **)&a2l->input);
|
||||
zfree(&a2l->syms);
|
||||
free(a2l);
|
||||
}
|
||||
|
@ -39,7 +39,7 @@ struct rb_node *strlist__node_new(struct rblist *rblist, const void *entry)
|
||||
static void str_node__delete(struct str_node *snode, bool dupstr)
|
||||
{
|
||||
if (dupstr)
|
||||
zfree((void **)&snode->s);
|
||||
zfree((char **)&snode->s);
|
||||
free(snode);
|
||||
}
|
||||
|
||||
|
@ -34,8 +34,8 @@ int trace_event__init(struct trace_event *t)
|
||||
|
||||
void trace_event__cleanup(struct trace_event *t)
|
||||
{
|
||||
traceevent_unload_plugins(t->plugin_list, t->pevent);
|
||||
pevent_free(t->pevent);
|
||||
traceevent_unload_plugins(t->plugin_list);
|
||||
}
|
||||
|
||||
static struct event_format*
|
||||
|
Loading…
Reference in New Issue
Block a user