License cleanup: add SPDX GPL-2.0 license identifier to files with no license
Many source files in the tree are missing licensing information, which
makes it harder for compliance tools to determine the correct license.
By default all files without license information are under the default
license of the kernel, which is GPL version 2.
Update the files which contain no license information with the 'GPL-2.0'
SPDX license identifier. The SPDX identifier is a legally binding
shorthand, which can be used instead of the full boiler plate text.
This patch is based on work done by Thomas Gleixner and Kate Stewart and
Philippe Ombredanne.
How this work was done:
Patches were generated and checked against linux-4.14-rc6 for a subset of
the use cases:
- file had no licensing information it it.
- file was a */uapi/* one with no licensing information in it,
- file was a */uapi/* one with existing licensing information,
Further patches will be generated in subsequent months to fix up cases
where non-standard license headers were used, and references to license
had to be inferred by heuristics based on keywords.
The analysis to determine which SPDX License Identifier to be applied to
a file was done in a spreadsheet of side by side results from of the
output of two independent scanners (ScanCode & Windriver) producing SPDX
tag:value files created by Philippe Ombredanne. Philippe prepared the
base worksheet, and did an initial spot review of a few 1000 files.
The 4.13 kernel was the starting point of the analysis with 60,537 files
assessed. Kate Stewart did a file by file comparison of the scanner
results in the spreadsheet to determine which SPDX license identifier(s)
to be applied to the file. She confirmed any determination that was not
immediately clear with lawyers working with the Linux Foundation.
Criteria used to select files for SPDX license identifier tagging was:
- Files considered eligible had to be source code files.
- Make and config files were included as candidates if they contained >5
lines of source
- File already had some variant of a license header in it (even if <5
lines).
All documentation files were explicitly excluded.
The following heuristics were used to determine which SPDX license
identifiers to apply.
- when both scanners couldn't find any license traces, file was
considered to have no license information in it, and the top level
COPYING file license applied.
For non */uapi/* files that summary was:
SPDX license identifier # files
---------------------------------------------------|-------
GPL-2.0 11139
and resulted in the first patch in this series.
If that file was a */uapi/* path one, it was "GPL-2.0 WITH
Linux-syscall-note" otherwise it was "GPL-2.0". Results of that was:
SPDX license identifier # files
---------------------------------------------------|-------
GPL-2.0 WITH Linux-syscall-note 930
and resulted in the second patch in this series.
- if a file had some form of licensing information in it, and was one
of the */uapi/* ones, it was denoted with the Linux-syscall-note if
any GPL family license was found in the file or had no licensing in
it (per prior point). Results summary:
SPDX license identifier # files
---------------------------------------------------|------
GPL-2.0 WITH Linux-syscall-note 270
GPL-2.0+ WITH Linux-syscall-note 169
((GPL-2.0 WITH Linux-syscall-note) OR BSD-2-Clause) 21
((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) 17
LGPL-2.1+ WITH Linux-syscall-note 15
GPL-1.0+ WITH Linux-syscall-note 14
((GPL-2.0+ WITH Linux-syscall-note) OR BSD-3-Clause) 5
LGPL-2.0+ WITH Linux-syscall-note 4
LGPL-2.1 WITH Linux-syscall-note 3
((GPL-2.0 WITH Linux-syscall-note) OR MIT) 3
((GPL-2.0 WITH Linux-syscall-note) AND MIT) 1
and that resulted in the third patch in this series.
- when the two scanners agreed on the detected license(s), that became
the concluded license(s).
- when there was disagreement between the two scanners (one detected a
license but the other didn't, or they both detected different
licenses) a manual inspection of the file occurred.
- In most cases a manual inspection of the information in the file
resulted in a clear resolution of the license that should apply (and
which scanner probably needed to revisit its heuristics).
- When it was not immediately clear, the license identifier was
confirmed with lawyers working with the Linux Foundation.
- If there was any question as to the appropriate license identifier,
the file was flagged for further research and to be revisited later
in time.
In total, over 70 hours of logged manual review was done on the
spreadsheet to determine the SPDX license identifiers to apply to the
source files by Kate, Philippe, Thomas and, in some cases, confirmation
by lawyers working with the Linux Foundation.
Kate also obtained a third independent scan of the 4.13 code base from
FOSSology, and compared selected files where the other two scanners
disagreed against that SPDX file, to see if there was new insights. The
Windriver scanner is based on an older version of FOSSology in part, so
they are related.
Thomas did random spot checks in about 500 files from the spreadsheets
for the uapi headers and agreed with SPDX license identifier in the
files he inspected. For the non-uapi files Thomas did random spot checks
in about 15000 files.
In initial set of patches against 4.14-rc6, 3 files were found to have
copy/paste license identifier errors, and have been fixed to reflect the
correct identifier.
Additionally Philippe spent 10 hours this week doing a detailed manual
inspection and review of the 12,461 patched files from the initial patch
version early this week with:
- a full scancode scan run, collecting the matched texts, detected
license ids and scores
- reviewing anything where there was a license detected (about 500+
files) to ensure that the applied SPDX license was correct
- reviewing anything where there was no detection but the patch license
was not GPL-2.0 WITH Linux-syscall-note to ensure that the applied
SPDX license was correct
This produced a worksheet with 20 files needing minor correction. This
worksheet was then exported into 3 different .csv files for the
different types of files to be modified.
These .csv files were then reviewed by Greg. Thomas wrote a script to
parse the csv files and add the proper SPDX tag to the file, in the
format that the file expected. This script was further refined by Greg
based on the output to detect more types of files automatically and to
distinguish between header and source .c files (which need different
comment types.) Finally Greg ran the script using the .csv files to
generate the patches.
Reviewed-by: Kate Stewart <kstewart@linuxfoundation.org>
Reviewed-by: Philippe Ombredanne <pombredanne@nexb.com>
Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2017-11-01 22:07:57 +08:00
|
|
|
// SPDX-License-Identifier: GPL-2.0
|
2009-06-03 05:37:05 +08:00
|
|
|
/*
|
|
|
|
* perf.c
|
|
|
|
*
|
|
|
|
* Performance analysis utility.
|
|
|
|
*
|
|
|
|
* This is the main hub from which the sub-commands (perf stat,
|
|
|
|
* perf top, perf record, perf report, etc.) are started.
|
|
|
|
*/
|
2009-04-20 21:00:56 +08:00
|
|
|
#include "builtin.h"
|
2009-06-03 05:37:05 +08:00
|
|
|
|
2015-09-09 21:37:01 +08:00
|
|
|
#include "util/env.h"
|
2015-12-15 23:39:39 +08:00
|
|
|
#include <subcmd/exec-cmd.h>
|
2016-06-23 16:55:17 +08:00
|
|
|
#include "util/config.h"
|
2009-04-27 14:02:14 +08:00
|
|
|
#include "util/quote.h"
|
2015-12-15 23:39:39 +08:00
|
|
|
#include <subcmd/run-command.h>
|
2009-07-22 02:16:29 +08:00
|
|
|
#include "util/parse-events.h"
|
2015-12-15 23:39:39 +08:00
|
|
|
#include <subcmd/parse-options.h>
|
perf tools: Enable passing bpf object file to --event
By introducing new rules in tools/perf/util/parse-events.[ly], this
patch enables 'perf record --event bpf_file.o' to select events by an
eBPF object file. It calls parse_events_load_bpf() to load that file,
which uses bpf__prepare_load() and finally calls bpf_object__open() for
the object files.
After applying this patch, commands like:
# perf record --event foo.o sleep
become possible.
However, at this point it is unable to link any useful things onto the
evsel list because the creating of probe points and BPF program
attaching have not been implemented. Before real events are possible to
be extracted, to avoid perf report error because of empty evsel list,
this patch link a dummy evsel. The dummy event related code will be
removed when probing and extracting code is ready.
Commiter notes:
Using it:
$ ls -la foo.o
ls: cannot access foo.o: No such file or directory
$ perf record --event foo.o sleep
libbpf: failed to open foo.o: No such file or directory
event syntax error: 'foo.o'
\___ BPF object file 'foo.o' is invalid
(add -v to see detail)
Run 'perf list' for a list of valid events
Usage: perf record [<options>] [<command>]
or: perf record [<options>] -- <command> [<options>]
-e, --event <event> event selector. use 'perf list' to list available events
$
$ file /tmp/build/perf/perf.o
/tmp/build/perf/perf.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
$ perf record --event /tmp/build/perf/perf.o sleep
libbpf: /tmp/build/perf/perf.o is not an eBPF object file
event syntax error: '/tmp/build/perf/perf.o'
\___ BPF object file '/tmp/build/perf/perf.o' is invalid
(add -v to see detail)
Run 'perf list' for a list of valid events
Usage: perf record [<options>] [<command>]
or: perf record [<options>] -- <command> [<options>]
-e, --event <event> event selector. use 'perf list' to list available events
$
$ file /tmp/foo.o
/tmp/foo.o: ELF 64-bit LSB relocatable, no machine, version 1 (SYSV), not stripped
$ perf record --event /tmp/foo.o sleep 1
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.013 MB perf.data ]
$ perf evlist
/tmp/foo.o
$ perf evlist -v
/tmp/foo.o: type: 1, size: 112, config: 0x9, { sample_period, sample_freq }: 4000, sample_type: IP|TID|TIME|PERIOD, disabled: 1, inherit: 1, mmap: 1, comm: 1, freq: 1, enable_on_exec: 1, task: 1, sample_id_all: 1, exclude_guest: 1, mmap2: 1, comm_exec: 1
$
So, type 1 is PERF_TYPE_SOFTWARE, config 0x9 is PERF_COUNT_SW_DUMMY, ok.
$ perf report --stdio
Error:
The perf.data file has no samples!
# To display the perf.data header info, please use --header/--header-only options.
#
$
Signed-off-by: Wang Nan <wangnan0@huawei.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Alexei Starovoitov <ast@plumgrid.com>
Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
Cc: Daniel Borkmann <daniel@iogearbox.net>
Cc: David Ahern <dsahern@gmail.com>
Cc: He Kuang <hekuang@huawei.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kaixu Xia <xiakaixu@huawei.com>
Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Zefan Li <lizefan@huawei.com>
Cc: pi3orama@163.com
Link: http://lkml.kernel.org/r/1444826502-49291-4-git-send-email-wangnan0@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2015-10-14 20:41:14 +08:00
|
|
|
#include "util/bpf-loader.h"
|
2014-07-17 18:55:00 +08:00
|
|
|
#include "util/debug.h"
|
2017-04-26 02:30:47 +08:00
|
|
|
#include "util/event.h"
|
2016-04-27 21:16:24 +08:00
|
|
|
#include <api/fs/fs.h>
|
2015-09-02 15:56:34 +08:00
|
|
|
#include <api/fs/tracing_path.h>
|
2017-04-18 21:46:11 +08:00
|
|
|
#include <errno.h>
|
2012-09-08 08:43:19 +08:00
|
|
|
#include <pthread.h>
|
2017-04-20 02:49:18 +08:00
|
|
|
#include <signal.h>
|
2016-01-07 19:41:53 +08:00
|
|
|
#include <stdlib.h>
|
|
|
|
#include <time.h>
|
2017-04-20 07:57:47 +08:00
|
|
|
#include <sys/types.h>
|
|
|
|
#include <sys/stat.h>
|
|
|
|
#include <unistd.h>
|
2017-04-17 22:39:06 +08:00
|
|
|
#include <linux/kernel.h>
|
2009-04-20 21:00:56 +08:00
|
|
|
|
|
|
|
const char perf_usage_string[] =
|
2014-07-18 15:11:30 +08:00
|
|
|
"perf [--version] [--help] [OPTIONS] COMMAND [ARGS]";
|
2009-04-20 21:00:56 +08:00
|
|
|
|
|
|
|
const char perf_more_info_string[] =
|
|
|
|
"See 'perf help COMMAND' for more information on a specific command.";
|
|
|
|
|
|
|
|
static int use_pager = -1;
|
2012-10-30 11:56:02 +08:00
|
|
|
const char *input_name;
|
perf tui: Allow disabling the TUI on a per command basis in ~/.perfconfig
Using the same scheme as for git's/perf's pager setup, i.e. if one
doesn't want to, on a newt enabled perf binary, to disable the TUI for
'perf report', its just a matter of doing:
[root@doppio linux-2.6-tip]# printf "[tui]\n\nreport = off\n" >
/root/.perfconfig
[root@doppio linux-2.6-tip]# cat /root/.perfconfig
[tui]
report = off
[root@doppio linux-2.6-tip]#
System wide settings are also possible, by editing /etc/perfconfig, etc,
i.e. the git machinery for config files applies to perf as well, so when
in doubt where to put your settings, consult the git documentation, if
it fails, please let us know.
Suggested-by: Ingo Molnar <mingo@elte.hu>
Discussed-with: Stephane Eranian <eranian@google.com>
Cc: Frédéric Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Stephane Eranian <eranian@google.com>
Cc: Tom Zanussi <tzanussi@gmail.com>
LKML-Reference: <new-submission>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2010-05-21 09:01:10 +08:00
|
|
|
|
2012-08-09 22:31:51 +08:00
|
|
|
struct cmd_struct {
|
|
|
|
const char *cmd;
|
2017-03-27 22:47:20 +08:00
|
|
|
int (*fn)(int, const char **);
|
2012-08-09 22:31:51 +08:00
|
|
|
int option;
|
|
|
|
};
|
|
|
|
|
|
|
|
static struct cmd_struct commands[] = {
|
|
|
|
{ "buildid-cache", cmd_buildid_cache, 0 },
|
|
|
|
{ "buildid-list", cmd_buildid_list, 0 },
|
2015-11-17 21:53:21 +08:00
|
|
|
{ "config", cmd_config, 0 },
|
2016-09-22 23:36:38 +08:00
|
|
|
{ "c2c", cmd_c2c, 0 },
|
2012-08-09 22:31:51 +08:00
|
|
|
{ "diff", cmd_diff, 0 },
|
|
|
|
{ "evlist", cmd_evlist, 0 },
|
|
|
|
{ "help", cmd_help, 0 },
|
2017-01-06 02:33:32 +08:00
|
|
|
{ "kallsyms", cmd_kallsyms, 0 },
|
2012-08-09 22:31:51 +08:00
|
|
|
{ "list", cmd_list, 0 },
|
|
|
|
{ "record", cmd_record, 0 },
|
|
|
|
{ "report", cmd_report, 0 },
|
|
|
|
{ "bench", cmd_bench, 0 },
|
|
|
|
{ "stat", cmd_stat, 0 },
|
|
|
|
{ "timechart", cmd_timechart, 0 },
|
|
|
|
{ "top", cmd_top, 0 },
|
|
|
|
{ "annotate", cmd_annotate, 0 },
|
|
|
|
{ "version", cmd_version, 0 },
|
|
|
|
{ "script", cmd_script, 0 },
|
|
|
|
{ "sched", cmd_sched, 0 },
|
2013-09-30 18:07:11 +08:00
|
|
|
#ifdef HAVE_LIBELF_SUPPORT
|
2012-08-09 22:31:51 +08:00
|
|
|
{ "probe", cmd_probe, 0 },
|
2012-08-06 12:41:21 +08:00
|
|
|
#endif
|
2012-08-09 22:31:51 +08:00
|
|
|
{ "kmem", cmd_kmem, 0 },
|
|
|
|
{ "lock", cmd_lock, 0 },
|
|
|
|
{ "kvm", cmd_kvm, 0 },
|
|
|
|
{ "test", cmd_test, 0 },
|
2013-09-30 18:07:11 +08:00
|
|
|
#ifdef HAVE_LIBAUDIT_SUPPORT
|
2012-09-27 07:05:56 +08:00
|
|
|
{ "trace", cmd_trace, 0 },
|
2012-09-27 19:23:38 +08:00
|
|
|
#endif
|
2012-08-09 22:31:51 +08:00
|
|
|
{ "inject", cmd_inject, 0 },
|
2013-01-24 23:10:38 +08:00
|
|
|
{ "mem", cmd_mem, 0 },
|
2015-02-21 06:16:59 +08:00
|
|
|
{ "data", cmd_data, 0 },
|
2013-03-07 20:45:20 +08:00
|
|
|
{ "ftrace", cmd_ftrace, 0 },
|
2012-08-09 22:31:51 +08:00
|
|
|
};
|
|
|
|
|
2009-04-20 21:00:56 +08:00
|
|
|
struct pager_config {
|
|
|
|
const char *cmd;
|
|
|
|
int val;
|
|
|
|
};
|
|
|
|
|
|
|
|
static int pager_command_config(const char *var, const char *value, void *data)
|
|
|
|
{
|
|
|
|
struct pager_config *c = data;
|
2017-07-21 02:27:39 +08:00
|
|
|
if (strstarts(var, "pager.") && !strcmp(var + 6, c->cmd))
|
2009-04-20 21:00:56 +08:00
|
|
|
c->val = perf_config_bool(var, value);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* returns 0 for "no pager", 1 for "use pager", and -1 for "not specified" */
|
2017-04-20 07:46:41 +08:00
|
|
|
static int check_pager_config(const char *cmd)
|
2009-04-20 21:00:56 +08:00
|
|
|
{
|
2017-01-25 00:44:10 +08:00
|
|
|
int err;
|
2009-04-20 21:00:56 +08:00
|
|
|
struct pager_config c;
|
|
|
|
c.cmd = cmd;
|
|
|
|
c.val = -1;
|
2017-01-25 00:44:10 +08:00
|
|
|
err = perf_config(pager_command_config, &c);
|
|
|
|
return err ?: c.val;
|
2009-04-20 21:00:56 +08:00
|
|
|
}
|
|
|
|
|
2012-11-12 10:50:17 +08:00
|
|
|
static int browser_command_config(const char *var, const char *value, void *data)
|
perf tui: Allow disabling the TUI on a per command basis in ~/.perfconfig
Using the same scheme as for git's/perf's pager setup, i.e. if one
doesn't want to, on a newt enabled perf binary, to disable the TUI for
'perf report', its just a matter of doing:
[root@doppio linux-2.6-tip]# printf "[tui]\n\nreport = off\n" >
/root/.perfconfig
[root@doppio linux-2.6-tip]# cat /root/.perfconfig
[tui]
report = off
[root@doppio linux-2.6-tip]#
System wide settings are also possible, by editing /etc/perfconfig, etc,
i.e. the git machinery for config files applies to perf as well, so when
in doubt where to put your settings, consult the git documentation, if
it fails, please let us know.
Suggested-by: Ingo Molnar <mingo@elte.hu>
Discussed-with: Stephane Eranian <eranian@google.com>
Cc: Frédéric Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Stephane Eranian <eranian@google.com>
Cc: Tom Zanussi <tzanussi@gmail.com>
LKML-Reference: <new-submission>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2010-05-21 09:01:10 +08:00
|
|
|
{
|
|
|
|
struct pager_config *c = data;
|
2017-07-21 02:27:39 +08:00
|
|
|
if (strstarts(var, "tui.") && !strcmp(var + 4, c->cmd))
|
perf tui: Allow disabling the TUI on a per command basis in ~/.perfconfig
Using the same scheme as for git's/perf's pager setup, i.e. if one
doesn't want to, on a newt enabled perf binary, to disable the TUI for
'perf report', its just a matter of doing:
[root@doppio linux-2.6-tip]# printf "[tui]\n\nreport = off\n" >
/root/.perfconfig
[root@doppio linux-2.6-tip]# cat /root/.perfconfig
[tui]
report = off
[root@doppio linux-2.6-tip]#
System wide settings are also possible, by editing /etc/perfconfig, etc,
i.e. the git machinery for config files applies to perf as well, so when
in doubt where to put your settings, consult the git documentation, if
it fails, please let us know.
Suggested-by: Ingo Molnar <mingo@elte.hu>
Discussed-with: Stephane Eranian <eranian@google.com>
Cc: Frédéric Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Stephane Eranian <eranian@google.com>
Cc: Tom Zanussi <tzanussi@gmail.com>
LKML-Reference: <new-submission>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2010-05-21 09:01:10 +08:00
|
|
|
c->val = perf_config_bool(var, value);
|
2017-07-21 02:27:39 +08:00
|
|
|
if (strstarts(var, "gtk.") && !strcmp(var + 4, c->cmd))
|
2012-11-12 10:50:17 +08:00
|
|
|
c->val = perf_config_bool(var, value) ? 2 : 0;
|
perf tui: Allow disabling the TUI on a per command basis in ~/.perfconfig
Using the same scheme as for git's/perf's pager setup, i.e. if one
doesn't want to, on a newt enabled perf binary, to disable the TUI for
'perf report', its just a matter of doing:
[root@doppio linux-2.6-tip]# printf "[tui]\n\nreport = off\n" >
/root/.perfconfig
[root@doppio linux-2.6-tip]# cat /root/.perfconfig
[tui]
report = off
[root@doppio linux-2.6-tip]#
System wide settings are also possible, by editing /etc/perfconfig, etc,
i.e. the git machinery for config files applies to perf as well, so when
in doubt where to put your settings, consult the git documentation, if
it fails, please let us know.
Suggested-by: Ingo Molnar <mingo@elte.hu>
Discussed-with: Stephane Eranian <eranian@google.com>
Cc: Frédéric Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Stephane Eranian <eranian@google.com>
Cc: Tom Zanussi <tzanussi@gmail.com>
LKML-Reference: <new-submission>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2010-05-21 09:01:10 +08:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2012-11-12 10:50:17 +08:00
|
|
|
/*
|
|
|
|
* returns 0 for "no tui", 1 for "use tui", 2 for "use gtk",
|
|
|
|
* and -1 for "not specified"
|
|
|
|
*/
|
|
|
|
static int check_browser_config(const char *cmd)
|
perf tui: Allow disabling the TUI on a per command basis in ~/.perfconfig
Using the same scheme as for git's/perf's pager setup, i.e. if one
doesn't want to, on a newt enabled perf binary, to disable the TUI for
'perf report', its just a matter of doing:
[root@doppio linux-2.6-tip]# printf "[tui]\n\nreport = off\n" >
/root/.perfconfig
[root@doppio linux-2.6-tip]# cat /root/.perfconfig
[tui]
report = off
[root@doppio linux-2.6-tip]#
System wide settings are also possible, by editing /etc/perfconfig, etc,
i.e. the git machinery for config files applies to perf as well, so when
in doubt where to put your settings, consult the git documentation, if
it fails, please let us know.
Suggested-by: Ingo Molnar <mingo@elte.hu>
Discussed-with: Stephane Eranian <eranian@google.com>
Cc: Frédéric Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Stephane Eranian <eranian@google.com>
Cc: Tom Zanussi <tzanussi@gmail.com>
LKML-Reference: <new-submission>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2010-05-21 09:01:10 +08:00
|
|
|
{
|
2017-01-25 00:44:10 +08:00
|
|
|
int err;
|
perf tui: Allow disabling the TUI on a per command basis in ~/.perfconfig
Using the same scheme as for git's/perf's pager setup, i.e. if one
doesn't want to, on a newt enabled perf binary, to disable the TUI for
'perf report', its just a matter of doing:
[root@doppio linux-2.6-tip]# printf "[tui]\n\nreport = off\n" >
/root/.perfconfig
[root@doppio linux-2.6-tip]# cat /root/.perfconfig
[tui]
report = off
[root@doppio linux-2.6-tip]#
System wide settings are also possible, by editing /etc/perfconfig, etc,
i.e. the git machinery for config files applies to perf as well, so when
in doubt where to put your settings, consult the git documentation, if
it fails, please let us know.
Suggested-by: Ingo Molnar <mingo@elte.hu>
Discussed-with: Stephane Eranian <eranian@google.com>
Cc: Frédéric Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Stephane Eranian <eranian@google.com>
Cc: Tom Zanussi <tzanussi@gmail.com>
LKML-Reference: <new-submission>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2010-05-21 09:01:10 +08:00
|
|
|
struct pager_config c;
|
|
|
|
c.cmd = cmd;
|
|
|
|
c.val = -1;
|
2017-01-25 00:44:10 +08:00
|
|
|
err = perf_config(browser_command_config, &c);
|
|
|
|
return err ?: c.val;
|
perf tui: Allow disabling the TUI on a per command basis in ~/.perfconfig
Using the same scheme as for git's/perf's pager setup, i.e. if one
doesn't want to, on a newt enabled perf binary, to disable the TUI for
'perf report', its just a matter of doing:
[root@doppio linux-2.6-tip]# printf "[tui]\n\nreport = off\n" >
/root/.perfconfig
[root@doppio linux-2.6-tip]# cat /root/.perfconfig
[tui]
report = off
[root@doppio linux-2.6-tip]#
System wide settings are also possible, by editing /etc/perfconfig, etc,
i.e. the git machinery for config files applies to perf as well, so when
in doubt where to put your settings, consult the git documentation, if
it fails, please let us know.
Suggested-by: Ingo Molnar <mingo@elte.hu>
Discussed-with: Stephane Eranian <eranian@google.com>
Cc: Frédéric Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Stephane Eranian <eranian@google.com>
Cc: Tom Zanussi <tzanussi@gmail.com>
LKML-Reference: <new-submission>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2010-05-21 09:01:10 +08:00
|
|
|
}
|
|
|
|
|
2010-01-28 07:05:55 +08:00
|
|
|
static void commit_pager_choice(void)
|
|
|
|
{
|
2009-04-20 21:00:56 +08:00
|
|
|
switch (use_pager) {
|
|
|
|
case 0:
|
2015-12-15 23:39:35 +08:00
|
|
|
setenv(PERF_PAGER_ENVIRONMENT, "cat", 1);
|
2009-04-20 21:00:56 +08:00
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
/* setup_pager(); */
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
perf tools: Fix the bash completion problem of 'perf --*'
The perf-completion.sh uses a predefined string '--help --version
--exec-path --html-path --paginate --no-pager --perf-dir --work-tree
--debugfs-dir' for the bash completion of 'perf --*', which has two
problems:
Problem 1: If the options of perf are changed (see handle_options() in
perf.c), the perf-completion.sh has to be changed at the same time. If
not, the bash completion of 'perf --*' and the options which perf
really supports will be inconsistent.
Problem 2: When typing another single character after 'perf --', e.g.
'h', and hit TAB key to get the bash completion of 'perf --h', the
character 'h' disappears at once. This is not what we want, we wish the
bash completion can return '--help --html-path' and then we can
continue to choose one.
To solve this problem, we add '--list-opts' to perf, which now supports
'perf --list-opts' directly, and its result can be used in bash
completion now.
Example:
Before this patch:
$ perf --h <-- hit TAB key after character 'h'
$ perf -- <-- 'h' disappears and no required result
After this patch:
$ perf --h <-- hit TAB key after character 'h'
--help --html-path <-- the required result
Signed-off-by: Yunlong Song <yunlong.song@huawei.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Wang Nan <wangnan0@huawei.com>
Link: http://lkml.kernel.org/r/1425032491-20224-8-git-send-email-yunlong.song@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2015-02-27 18:21:31 +08:00
|
|
|
struct option options[] = {
|
|
|
|
OPT_ARGUMENT("help", "help"),
|
|
|
|
OPT_ARGUMENT("version", "version"),
|
|
|
|
OPT_ARGUMENT("exec-path", "exec-path"),
|
|
|
|
OPT_ARGUMENT("html-path", "html-path"),
|
|
|
|
OPT_ARGUMENT("paginate", "paginate"),
|
|
|
|
OPT_ARGUMENT("no-pager", "no-pager"),
|
|
|
|
OPT_ARGUMENT("debugfs-dir", "debugfs-dir"),
|
|
|
|
OPT_ARGUMENT("buildid-dir", "buildid-dir"),
|
|
|
|
OPT_ARGUMENT("list-cmds", "list-cmds"),
|
|
|
|
OPT_ARGUMENT("list-opts", "list-opts"),
|
|
|
|
OPT_ARGUMENT("debug", "debug"),
|
|
|
|
OPT_END()
|
|
|
|
};
|
|
|
|
|
2010-01-28 07:05:55 +08:00
|
|
|
static int handle_options(const char ***argv, int *argc, int *envchanged)
|
2009-04-20 21:00:56 +08:00
|
|
|
{
|
|
|
|
int handled = 0;
|
|
|
|
|
|
|
|
while (*argc > 0) {
|
|
|
|
const char *cmd = (*argv)[0];
|
|
|
|
if (cmd[0] != '-')
|
|
|
|
break;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* For legacy reasons, the "version" and "help"
|
|
|
|
* commands can be written with "--" prepended
|
|
|
|
* to make them look like flags.
|
|
|
|
*/
|
|
|
|
if (!strcmp(cmd, "--help") || !strcmp(cmd, "--version"))
|
|
|
|
break;
|
|
|
|
|
2015-10-06 02:06:09 +08:00
|
|
|
/*
|
|
|
|
* Shortcut for '-h' and '-v' options to invoke help
|
|
|
|
* and version command.
|
|
|
|
*/
|
|
|
|
if (!strcmp(cmd, "-h")) {
|
|
|
|
(*argv)[0] = "--help";
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!strcmp(cmd, "-v")) {
|
|
|
|
(*argv)[0] = "--version";
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2009-04-20 21:00:56 +08:00
|
|
|
/*
|
|
|
|
* Check remaining flags.
|
|
|
|
*/
|
2017-07-21 02:27:39 +08:00
|
|
|
if (strstarts(cmd, CMD_EXEC_PATH)) {
|
2009-10-13 16:18:16 +08:00
|
|
|
cmd += strlen(CMD_EXEC_PATH);
|
2009-04-20 21:00:56 +08:00
|
|
|
if (*cmd == '=')
|
2015-12-15 23:39:37 +08:00
|
|
|
set_argv_exec_path(cmd + 1);
|
2009-04-20 21:00:56 +08:00
|
|
|
else {
|
2015-12-15 23:39:37 +08:00
|
|
|
puts(get_argv_exec_path());
|
2009-04-20 21:00:56 +08:00
|
|
|
exit(0);
|
|
|
|
}
|
|
|
|
} else if (!strcmp(cmd, "--html-path")) {
|
|
|
|
puts(system_path(PERF_HTML_PATH));
|
|
|
|
exit(0);
|
|
|
|
} else if (!strcmp(cmd, "-p") || !strcmp(cmd, "--paginate")) {
|
|
|
|
use_pager = 1;
|
|
|
|
} else if (!strcmp(cmd, "--no-pager")) {
|
|
|
|
use_pager = 0;
|
|
|
|
if (envchanged)
|
|
|
|
*envchanged = 1;
|
2009-07-22 02:16:29 +08:00
|
|
|
} else if (!strcmp(cmd, "--debugfs-dir")) {
|
|
|
|
if (*argc < 2) {
|
|
|
|
fprintf(stderr, "No directory given for --debugfs-dir.\n");
|
|
|
|
usage(perf_usage_string);
|
|
|
|
}
|
2015-09-02 15:56:33 +08:00
|
|
|
tracing_path_set((*argv)[1]);
|
2009-07-22 02:16:29 +08:00
|
|
|
if (envchanged)
|
|
|
|
*envchanged = 1;
|
|
|
|
(*argv)++;
|
|
|
|
(*argc)--;
|
2014-12-02 03:06:24 +08:00
|
|
|
} else if (!strcmp(cmd, "--buildid-dir")) {
|
|
|
|
if (*argc < 2) {
|
|
|
|
fprintf(stderr, "No directory given for --buildid-dir.\n");
|
|
|
|
usage(perf_usage_string);
|
|
|
|
}
|
|
|
|
set_buildid_dir((*argv)[1]);
|
|
|
|
if (envchanged)
|
|
|
|
*envchanged = 1;
|
|
|
|
(*argv)++;
|
|
|
|
(*argc)--;
|
2017-07-21 02:27:39 +08:00
|
|
|
} else if (strstarts(cmd, CMD_DEBUGFS_DIR)) {
|
2015-09-02 15:56:33 +08:00
|
|
|
tracing_path_set(cmd + strlen(CMD_DEBUGFS_DIR));
|
2015-08-26 21:46:45 +08:00
|
|
|
fprintf(stderr, "dir: %s\n", tracing_path);
|
2009-07-22 02:16:29 +08:00
|
|
|
if (envchanged)
|
|
|
|
*envchanged = 1;
|
2012-08-09 22:31:51 +08:00
|
|
|
} else if (!strcmp(cmd, "--list-cmds")) {
|
|
|
|
unsigned int i;
|
|
|
|
|
|
|
|
for (i = 0; i < ARRAY_SIZE(commands); i++) {
|
|
|
|
struct cmd_struct *p = commands+i;
|
|
|
|
printf("%s ", p->cmd);
|
|
|
|
}
|
2015-02-27 18:21:29 +08:00
|
|
|
putchar('\n');
|
2012-08-09 22:31:51 +08:00
|
|
|
exit(0);
|
perf tools: Fix the bash completion problem of 'perf --*'
The perf-completion.sh uses a predefined string '--help --version
--exec-path --html-path --paginate --no-pager --perf-dir --work-tree
--debugfs-dir' for the bash completion of 'perf --*', which has two
problems:
Problem 1: If the options of perf are changed (see handle_options() in
perf.c), the perf-completion.sh has to be changed at the same time. If
not, the bash completion of 'perf --*' and the options which perf
really supports will be inconsistent.
Problem 2: When typing another single character after 'perf --', e.g.
'h', and hit TAB key to get the bash completion of 'perf --h', the
character 'h' disappears at once. This is not what we want, we wish the
bash completion can return '--help --html-path' and then we can
continue to choose one.
To solve this problem, we add '--list-opts' to perf, which now supports
'perf --list-opts' directly, and its result can be used in bash
completion now.
Example:
Before this patch:
$ perf --h <-- hit TAB key after character 'h'
$ perf -- <-- 'h' disappears and no required result
After this patch:
$ perf --h <-- hit TAB key after character 'h'
--help --html-path <-- the required result
Signed-off-by: Yunlong Song <yunlong.song@huawei.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Wang Nan <wangnan0@huawei.com>
Link: http://lkml.kernel.org/r/1425032491-20224-8-git-send-email-yunlong.song@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2015-02-27 18:21:31 +08:00
|
|
|
} else if (!strcmp(cmd, "--list-opts")) {
|
|
|
|
unsigned int i;
|
|
|
|
|
|
|
|
for (i = 0; i < ARRAY_SIZE(options)-1; i++) {
|
|
|
|
struct option *p = options+i;
|
|
|
|
printf("--%s ", p->long_name);
|
|
|
|
}
|
|
|
|
putchar('\n');
|
|
|
|
exit(0);
|
2014-07-17 18:55:00 +08:00
|
|
|
} else if (!strcmp(cmd, "--debug")) {
|
|
|
|
if (*argc < 2) {
|
|
|
|
fprintf(stderr, "No variable specified for --debug.\n");
|
|
|
|
usage(perf_usage_string);
|
|
|
|
}
|
|
|
|
if (perf_debug_option((*argv)[1]))
|
|
|
|
usage(perf_usage_string);
|
|
|
|
|
|
|
|
(*argv)++;
|
|
|
|
(*argc)--;
|
2009-04-20 21:00:56 +08:00
|
|
|
} else {
|
|
|
|
fprintf(stderr, "Unknown option: %s\n", cmd);
|
|
|
|
usage(perf_usage_string);
|
|
|
|
}
|
|
|
|
|
|
|
|
(*argv)++;
|
|
|
|
(*argc)--;
|
|
|
|
handled++;
|
|
|
|
}
|
|
|
|
return handled;
|
|
|
|
}
|
|
|
|
|
|
|
|
#define RUN_SETUP (1<<0)
|
|
|
|
#define USE_PAGER (1<<1)
|
|
|
|
|
|
|
|
static int run_builtin(struct cmd_struct *p, int argc, const char **argv)
|
|
|
|
{
|
|
|
|
int status;
|
|
|
|
struct stat st;
|
2014-08-14 10:22:32 +08:00
|
|
|
char sbuf[STRERR_BUFSIZE];
|
2009-04-20 21:00:56 +08:00
|
|
|
|
perf tui: Allow disabling the TUI on a per command basis in ~/.perfconfig
Using the same scheme as for git's/perf's pager setup, i.e. if one
doesn't want to, on a newt enabled perf binary, to disable the TUI for
'perf report', its just a matter of doing:
[root@doppio linux-2.6-tip]# printf "[tui]\n\nreport = off\n" >
/root/.perfconfig
[root@doppio linux-2.6-tip]# cat /root/.perfconfig
[tui]
report = off
[root@doppio linux-2.6-tip]#
System wide settings are also possible, by editing /etc/perfconfig, etc,
i.e. the git machinery for config files applies to perf as well, so when
in doubt where to put your settings, consult the git documentation, if
it fails, please let us know.
Suggested-by: Ingo Molnar <mingo@elte.hu>
Discussed-with: Stephane Eranian <eranian@google.com>
Cc: Frédéric Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Stephane Eranian <eranian@google.com>
Cc: Tom Zanussi <tzanussi@gmail.com>
LKML-Reference: <new-submission>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2010-05-21 09:01:10 +08:00
|
|
|
if (use_browser == -1)
|
2012-11-12 10:50:17 +08:00
|
|
|
use_browser = check_browser_config(p->cmd);
|
perf tui: Allow disabling the TUI on a per command basis in ~/.perfconfig
Using the same scheme as for git's/perf's pager setup, i.e. if one
doesn't want to, on a newt enabled perf binary, to disable the TUI for
'perf report', its just a matter of doing:
[root@doppio linux-2.6-tip]# printf "[tui]\n\nreport = off\n" >
/root/.perfconfig
[root@doppio linux-2.6-tip]# cat /root/.perfconfig
[tui]
report = off
[root@doppio linux-2.6-tip]#
System wide settings are also possible, by editing /etc/perfconfig, etc,
i.e. the git machinery for config files applies to perf as well, so when
in doubt where to put your settings, consult the git documentation, if
it fails, please let us know.
Suggested-by: Ingo Molnar <mingo@elte.hu>
Discussed-with: Stephane Eranian <eranian@google.com>
Cc: Frédéric Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Stephane Eranian <eranian@google.com>
Cc: Tom Zanussi <tzanussi@gmail.com>
LKML-Reference: <new-submission>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2010-05-21 09:01:10 +08:00
|
|
|
|
2009-04-20 21:00:56 +08:00
|
|
|
if (use_pager == -1 && p->option & RUN_SETUP)
|
|
|
|
use_pager = check_pager_config(p->cmd);
|
|
|
|
if (use_pager == -1 && p->option & USE_PAGER)
|
|
|
|
use_pager = 1;
|
|
|
|
commit_pager_choice();
|
|
|
|
|
2015-12-08 12:21:46 +08:00
|
|
|
perf_env__set_cmdline(&perf_env, argc, argv);
|
2017-03-27 22:47:20 +08:00
|
|
|
status = p->fn(argc, argv);
|
2016-06-23 22:14:31 +08:00
|
|
|
perf_config__exit();
|
2010-03-23 00:10:25 +08:00
|
|
|
exit_browser(status);
|
2015-09-09 21:37:01 +08:00
|
|
|
perf_env__exit(&perf_env);
|
perf tools: Enable passing bpf object file to --event
By introducing new rules in tools/perf/util/parse-events.[ly], this
patch enables 'perf record --event bpf_file.o' to select events by an
eBPF object file. It calls parse_events_load_bpf() to load that file,
which uses bpf__prepare_load() and finally calls bpf_object__open() for
the object files.
After applying this patch, commands like:
# perf record --event foo.o sleep
become possible.
However, at this point it is unable to link any useful things onto the
evsel list because the creating of probe points and BPF program
attaching have not been implemented. Before real events are possible to
be extracted, to avoid perf report error because of empty evsel list,
this patch link a dummy evsel. The dummy event related code will be
removed when probing and extracting code is ready.
Commiter notes:
Using it:
$ ls -la foo.o
ls: cannot access foo.o: No such file or directory
$ perf record --event foo.o sleep
libbpf: failed to open foo.o: No such file or directory
event syntax error: 'foo.o'
\___ BPF object file 'foo.o' is invalid
(add -v to see detail)
Run 'perf list' for a list of valid events
Usage: perf record [<options>] [<command>]
or: perf record [<options>] -- <command> [<options>]
-e, --event <event> event selector. use 'perf list' to list available events
$
$ file /tmp/build/perf/perf.o
/tmp/build/perf/perf.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
$ perf record --event /tmp/build/perf/perf.o sleep
libbpf: /tmp/build/perf/perf.o is not an eBPF object file
event syntax error: '/tmp/build/perf/perf.o'
\___ BPF object file '/tmp/build/perf/perf.o' is invalid
(add -v to see detail)
Run 'perf list' for a list of valid events
Usage: perf record [<options>] [<command>]
or: perf record [<options>] -- <command> [<options>]
-e, --event <event> event selector. use 'perf list' to list available events
$
$ file /tmp/foo.o
/tmp/foo.o: ELF 64-bit LSB relocatable, no machine, version 1 (SYSV), not stripped
$ perf record --event /tmp/foo.o sleep 1
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.013 MB perf.data ]
$ perf evlist
/tmp/foo.o
$ perf evlist -v
/tmp/foo.o: type: 1, size: 112, config: 0x9, { sample_period, sample_freq }: 4000, sample_type: IP|TID|TIME|PERIOD, disabled: 1, inherit: 1, mmap: 1, comm: 1, freq: 1, enable_on_exec: 1, task: 1, sample_id_all: 1, exclude_guest: 1, mmap2: 1, comm_exec: 1
$
So, type 1 is PERF_TYPE_SOFTWARE, config 0x9 is PERF_COUNT_SW_DUMMY, ok.
$ perf report --stdio
Error:
The perf.data file has no samples!
# To display the perf.data header info, please use --header/--header-only options.
#
$
Signed-off-by: Wang Nan <wangnan0@huawei.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Alexei Starovoitov <ast@plumgrid.com>
Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
Cc: Daniel Borkmann <daniel@iogearbox.net>
Cc: David Ahern <dsahern@gmail.com>
Cc: He Kuang <hekuang@huawei.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kaixu Xia <xiakaixu@huawei.com>
Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Zefan Li <lizefan@huawei.com>
Cc: pi3orama@163.com
Link: http://lkml.kernel.org/r/1444826502-49291-4-git-send-email-wangnan0@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2015-10-14 20:41:14 +08:00
|
|
|
bpf__clear();
|
2010-03-23 00:10:25 +08:00
|
|
|
|
2009-04-20 21:00:56 +08:00
|
|
|
if (status)
|
|
|
|
return status & 0xff;
|
|
|
|
|
|
|
|
/* Somebody closed stdout? */
|
|
|
|
if (fstat(fileno(stdout), &st))
|
|
|
|
return 0;
|
|
|
|
/* Ignore write errors for pipes and sockets.. */
|
|
|
|
if (S_ISFIFO(st.st_mode) || S_ISSOCK(st.st_mode))
|
|
|
|
return 0;
|
|
|
|
|
2013-01-25 02:18:54 +08:00
|
|
|
status = 1;
|
2009-04-20 21:00:56 +08:00
|
|
|
/* Check for ENOSPC and EIO errors.. */
|
2013-01-25 02:18:54 +08:00
|
|
|
if (fflush(stdout)) {
|
2014-08-14 10:22:32 +08:00
|
|
|
fprintf(stderr, "write failure on standard output: %s",
|
tools: Introduce str_error_r()
The tools so far have been using the strerror_r() GNU variant, that
returns a string, be it the buffer passed or something else.
But that, besides being tricky in cases where we expect that the
function using strerror_r() returns the error formatted in a provided
buffer (we have to check if it returned something else and copy that
instead), breaks the build on systems not using glibc, like Alpine
Linux, where musl libc is used.
So, introduce yet another wrapper, str_error_r(), that has the GNU
interface, but uses the portable XSI variant of strerror_r(), so that
users rest asured that the provided buffer is used and it is what is
returned.
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Wang Nan <wangnan0@huawei.com>
Link: http://lkml.kernel.org/n/tip-d4t42fnf48ytlk8rjxs822tf@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2016-07-06 22:56:20 +08:00
|
|
|
str_error_r(errno, sbuf, sizeof(sbuf)));
|
2013-01-25 02:18:54 +08:00
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
if (ferror(stdout)) {
|
|
|
|
fprintf(stderr, "unknown write failure on standard output");
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
if (fclose(stdout)) {
|
2014-08-14 10:22:32 +08:00
|
|
|
fprintf(stderr, "close failed on standard output: %s",
|
tools: Introduce str_error_r()
The tools so far have been using the strerror_r() GNU variant, that
returns a string, be it the buffer passed or something else.
But that, besides being tricky in cases where we expect that the
function using strerror_r() returns the error formatted in a provided
buffer (we have to check if it returned something else and copy that
instead), breaks the build on systems not using glibc, like Alpine
Linux, where musl libc is used.
So, introduce yet another wrapper, str_error_r(), that has the GNU
interface, but uses the portable XSI variant of strerror_r(), so that
users rest asured that the provided buffer is used and it is what is
returned.
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Wang Nan <wangnan0@huawei.com>
Link: http://lkml.kernel.org/n/tip-d4t42fnf48ytlk8rjxs822tf@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2016-07-06 22:56:20 +08:00
|
|
|
str_error_r(errno, sbuf, sizeof(sbuf)));
|
2013-01-25 02:18:54 +08:00
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
status = 0;
|
|
|
|
out:
|
|
|
|
return status;
|
2009-04-20 21:00:56 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void handle_internal_command(int argc, const char **argv)
|
|
|
|
{
|
|
|
|
const char *cmd = argv[0];
|
2009-07-01 18:37:06 +08:00
|
|
|
unsigned int i;
|
2009-04-20 21:00:56 +08:00
|
|
|
|
|
|
|
/* Turn "perf cmd --help" into "perf help cmd" */
|
|
|
|
if (argc > 1 && !strcmp(argv[1], "--help")) {
|
|
|
|
argv[1] = argv[0];
|
|
|
|
argv[0] = cmd = "help";
|
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 0; i < ARRAY_SIZE(commands); i++) {
|
|
|
|
struct cmd_struct *p = commands+i;
|
|
|
|
if (strcmp(p->cmd, cmd))
|
|
|
|
continue;
|
|
|
|
exit(run_builtin(p, argc, argv));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void execv_dashed_external(const char **argv)
|
|
|
|
{
|
2016-02-25 21:14:50 +08:00
|
|
|
char *cmd;
|
2009-04-20 21:00:56 +08:00
|
|
|
const char *tmp;
|
|
|
|
int status;
|
|
|
|
|
2016-02-25 21:14:50 +08:00
|
|
|
if (asprintf(&cmd, "perf-%s", argv[0]) < 0)
|
|
|
|
goto do_die;
|
2009-04-20 21:00:56 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* argv[0] must be the perf command, but the argv array
|
|
|
|
* belongs to the caller, and may be reused in
|
|
|
|
* subsequent loop iterations. Save argv[0] and
|
|
|
|
* restore it on error.
|
|
|
|
*/
|
|
|
|
tmp = argv[0];
|
2016-02-25 21:14:50 +08:00
|
|
|
argv[0] = cmd;
|
2009-04-20 21:00:56 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* if we fail because the command is not found, it is
|
|
|
|
* OK to return. Otherwise, we just pass along the status code.
|
|
|
|
*/
|
|
|
|
status = run_command_v_opt(argv, 0);
|
|
|
|
if (status != -ERR_RUN_COMMAND_EXEC) {
|
2016-02-25 21:14:50 +08:00
|
|
|
if (IS_RUN_COMMAND_ERR(status)) {
|
|
|
|
do_die:
|
2017-04-04 22:36:22 +08:00
|
|
|
pr_err("FATAL: unable to run '%s'", argv[0]);
|
|
|
|
status = -128;
|
2016-02-25 21:14:50 +08:00
|
|
|
}
|
2009-04-20 21:00:56 +08:00
|
|
|
exit(-status);
|
|
|
|
}
|
|
|
|
errno = ENOENT; /* as if we called execvp */
|
|
|
|
|
|
|
|
argv[0] = tmp;
|
2016-02-25 21:14:50 +08:00
|
|
|
zfree(&cmd);
|
2009-04-20 21:00:56 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
static int run_argv(int *argcp, const char ***argv)
|
|
|
|
{
|
2017-03-28 22:19:59 +08:00
|
|
|
/* See if it's an internal command */
|
|
|
|
handle_internal_command(*argcp, *argv);
|
2009-04-20 21:00:56 +08:00
|
|
|
|
2017-03-28 22:19:59 +08:00
|
|
|
/* .. then try the external ones */
|
|
|
|
execv_dashed_external(*argv);
|
|
|
|
return 0;
|
2009-04-20 21:00:56 +08:00
|
|
|
}
|
|
|
|
|
2011-10-13 19:52:46 +08:00
|
|
|
static void pthread__block_sigwinch(void)
|
|
|
|
{
|
|
|
|
sigset_t set;
|
|
|
|
|
|
|
|
sigemptyset(&set);
|
|
|
|
sigaddset(&set, SIGWINCH);
|
|
|
|
pthread_sigmask(SIG_BLOCK, &set, NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
void pthread__unblock_sigwinch(void)
|
|
|
|
{
|
|
|
|
sigset_t set;
|
|
|
|
|
|
|
|
sigemptyset(&set);
|
|
|
|
sigaddset(&set, SIGWINCH);
|
|
|
|
pthread_sigmask(SIG_UNBLOCK, &set, NULL);
|
|
|
|
}
|
|
|
|
|
2016-07-12 22:01:17 +08:00
|
|
|
#ifdef _SC_LEVEL1_DCACHE_LINESIZE
|
|
|
|
#define cache_line_size(cacheline_sizep) *cacheline_sizep = sysconf(_SC_LEVEL1_DCACHE_LINESIZE)
|
|
|
|
#else
|
|
|
|
static void cache_line_size(int *cacheline_sizep)
|
|
|
|
{
|
|
|
|
if (sysfs__read_int("devices/system/cpu/cpu0/cache/index0/coherency_line_size", cacheline_sizep))
|
2016-07-15 21:05:19 +08:00
|
|
|
pr_debug("cannot determine cache line size");
|
2016-07-12 22:01:17 +08:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2009-04-20 21:00:56 +08:00
|
|
|
int main(int argc, const char **argv)
|
|
|
|
{
|
2017-01-25 00:44:10 +08:00
|
|
|
int err;
|
2009-04-20 21:00:56 +08:00
|
|
|
const char *cmd;
|
2014-08-14 10:22:32 +08:00
|
|
|
char sbuf[STRERR_BUFSIZE];
|
2016-04-27 21:16:24 +08:00
|
|
|
int value;
|
2009-04-20 21:00:56 +08:00
|
|
|
|
2015-12-15 23:39:35 +08:00
|
|
|
/* libsubcmd init */
|
|
|
|
exec_cmd_init("perf", PREFIX, PERF_EXEC_PATH, EXEC_PATH_ENVIRONMENT);
|
|
|
|
pager_init(PERF_PAGER_ENVIRONMENT);
|
|
|
|
|
2013-09-13 00:39:35 +08:00
|
|
|
/* The page_size is placed in util object. */
|
2012-10-07 01:57:10 +08:00
|
|
|
page_size = sysconf(_SC_PAGE_SIZE);
|
2016-07-12 22:01:17 +08:00
|
|
|
cache_line_size(&cacheline_size);
|
2012-10-07 01:57:10 +08:00
|
|
|
|
2016-04-27 21:16:24 +08:00
|
|
|
if (sysctl__read_int("kernel/perf_event_max_stack", &value) == 0)
|
|
|
|
sysctl_perf_event_max_stack = value;
|
|
|
|
|
2016-05-17 08:16:54 +08:00
|
|
|
if (sysctl__read_int("kernel/perf_event_max_contexts_per_stack", &value) == 0)
|
|
|
|
sysctl_perf_event_max_contexts_per_stack = value;
|
|
|
|
|
2015-12-15 23:39:37 +08:00
|
|
|
cmd = extract_argv0_path(argv[0]);
|
2009-04-20 21:00:56 +08:00
|
|
|
if (!cmd)
|
|
|
|
cmd = "perf-help";
|
2015-09-02 15:56:33 +08:00
|
|
|
|
2016-01-07 19:41:53 +08:00
|
|
|
srandom(time(NULL));
|
|
|
|
|
2016-06-23 22:14:31 +08:00
|
|
|
perf_config__init();
|
2017-01-25 00:44:10 +08:00
|
|
|
err = perf_config(perf_default_config, NULL);
|
|
|
|
if (err)
|
|
|
|
return err;
|
2016-03-28 01:22:18 +08:00
|
|
|
set_buildid_dir(NULL);
|
2016-02-26 17:31:51 +08:00
|
|
|
|
2015-09-02 15:56:33 +08:00
|
|
|
/* get debugfs/tracefs mount point from /proc/mounts */
|
|
|
|
tracing_path_mount();
|
|
|
|
|
2009-04-20 21:00:56 +08:00
|
|
|
/*
|
|
|
|
* "perf-xxxx" is the same as "perf xxxx", but we obviously:
|
|
|
|
*
|
|
|
|
* - cannot take flags in between the "perf" and the "xxxx".
|
|
|
|
* - cannot execute it externally (since it would just do
|
|
|
|
* the same thing over again)
|
|
|
|
*
|
2017-09-11 19:14:22 +08:00
|
|
|
* So we just directly call the internal command handler. If that one
|
|
|
|
* fails to handle this, then maybe we just run a renamed perf binary
|
|
|
|
* that contains a dash in its name. To handle this scenario, we just
|
|
|
|
* fall through and ignore the "xxxx" part of the command string.
|
2009-04-20 21:00:56 +08:00
|
|
|
*/
|
2017-07-21 02:27:39 +08:00
|
|
|
if (strstarts(cmd, "perf-")) {
|
2009-05-25 20:45:24 +08:00
|
|
|
cmd += 5;
|
2009-04-20 21:00:56 +08:00
|
|
|
argv[0] = cmd;
|
|
|
|
handle_internal_command(argc, argv);
|
2017-09-11 19:14:22 +08:00
|
|
|
/*
|
|
|
|
* If the command is handled, the above function does not
|
|
|
|
* return undo changes and fall through in such a case.
|
|
|
|
*/
|
|
|
|
cmd -= 5;
|
|
|
|
argv[0] = cmd;
|
2009-04-20 21:00:56 +08:00
|
|
|
}
|
2017-07-21 02:27:39 +08:00
|
|
|
if (strstarts(cmd, "trace")) {
|
2014-05-27 03:02:29 +08:00
|
|
|
#ifdef HAVE_LIBAUDIT_SUPPORT
|
perf trace: Add 'trace' alias to 'perf trace'
Make 'perf trace' more accessible by aliasing it to just 'trace':
[root@zoo linux]# trace --duration 15 -a -e futex sleep 1
110.092 (16.188 ms): libvirtd/1166 futex(uaddr: 0x185b344, op: WAIT|PRIV, val: 174293 ) = 0
110.101 (15.903 ms): libvirtd/1171 futex(uaddr: 0x185b3dc, op: WAIT|PRIV, val: 139265 ) = 0
111.594 (15.776 ms): libvirtd/1165 futex(uaddr: 0x185b344, op: WAIT|PRIV, val: 174295 ) = 0
111.610 (15.969 ms): libvirtd/1169 futex(uaddr: 0x185b3dc, op: WAIT|PRIV, val: 139267 ) = 0
113.556 (16.216 ms): libvirtd/1168 futex(uaddr: 0x185b3dc, op: WAIT|PRIV, val: 139269 ) = 0
291.265 (199.508 ms): chromium-brows/15830 futex(uaddr: 0x7fff2986bcb4, op: WAIT_BITSET|PRIV|CLKRT, val: 1, utime: 0x7fff2986bab0, val3: 4294967295) = -1 ETIMEDOUT Connection timed out
360.354 (69.053 ms): chromium-brows/15830 futex(uaddr: 0x7fff2986bcb4, op: WAIT_BITSET|PRIV|CLKRT, val: 1, utime: 0x7fff2986bab0, val3: 4294967295) = -1 ETIMEDOUT Connection timed out
[root@zoo linux]#
I.e. looking for futex calls that take at least 15ms, system wide, during a one
second window. Now to get callchains into 'trace' to figure out what are those
locks :-)
Requested-by: Ingo Molnar <mingo@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-ch4smqz8b5fmgrte7c5e4fuw@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-09-24 22:56:36 +08:00
|
|
|
setup_path();
|
|
|
|
argv[0] = "trace";
|
2017-03-27 22:47:20 +08:00
|
|
|
return cmd_trace(argc, argv);
|
2014-05-27 03:02:29 +08:00
|
|
|
#else
|
|
|
|
fprintf(stderr,
|
|
|
|
"trace command not available: missing audit-libs devel package at build time.\n");
|
|
|
|
goto out;
|
perf trace: Add 'trace' alias to 'perf trace'
Make 'perf trace' more accessible by aliasing it to just 'trace':
[root@zoo linux]# trace --duration 15 -a -e futex sleep 1
110.092 (16.188 ms): libvirtd/1166 futex(uaddr: 0x185b344, op: WAIT|PRIV, val: 174293 ) = 0
110.101 (15.903 ms): libvirtd/1171 futex(uaddr: 0x185b3dc, op: WAIT|PRIV, val: 139265 ) = 0
111.594 (15.776 ms): libvirtd/1165 futex(uaddr: 0x185b344, op: WAIT|PRIV, val: 174295 ) = 0
111.610 (15.969 ms): libvirtd/1169 futex(uaddr: 0x185b3dc, op: WAIT|PRIV, val: 139267 ) = 0
113.556 (16.216 ms): libvirtd/1168 futex(uaddr: 0x185b3dc, op: WAIT|PRIV, val: 139269 ) = 0
291.265 (199.508 ms): chromium-brows/15830 futex(uaddr: 0x7fff2986bcb4, op: WAIT_BITSET|PRIV|CLKRT, val: 1, utime: 0x7fff2986bab0, val3: 4294967295) = -1 ETIMEDOUT Connection timed out
360.354 (69.053 ms): chromium-brows/15830 futex(uaddr: 0x7fff2986bcb4, op: WAIT_BITSET|PRIV|CLKRT, val: 1, utime: 0x7fff2986bab0, val3: 4294967295) = -1 ETIMEDOUT Connection timed out
[root@zoo linux]#
I.e. looking for futex calls that take at least 15ms, system wide, during a one
second window. Now to get callchains into 'trace' to figure out what are those
locks :-)
Requested-by: Ingo Molnar <mingo@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-ch4smqz8b5fmgrte7c5e4fuw@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-09-24 22:56:36 +08:00
|
|
|
#endif
|
2014-05-27 03:02:29 +08:00
|
|
|
}
|
2009-04-20 21:00:56 +08:00
|
|
|
/* Look for flags.. */
|
|
|
|
argv++;
|
|
|
|
argc--;
|
|
|
|
handle_options(&argv, &argc, NULL);
|
|
|
|
commit_pager_choice();
|
perf buildid: add perfconfig option to specify buildid cache dir
This patch adds the ability to specify an alternate directory to store the
buildid cache (buildids, copy of binaries). By default, it is hardcoded to
$HOME/.debug. This directory contains immutable data. The layout of the
directory is such that no conflicts in filenames are possible. A modification
in a file, yields a different buildid and thus a different location in the
subdir hierarchy.
You may want to put the buildid cache elsewhere because of disk space
limitation or simply to share the cache between users. It is also useful for
remote collect vs. local analysis of profiles.
This patch adds a new config option to the perfconfig file. Under the tag
'buildid', there is a dir option. For instance, if you have:
$ cat /etc/perfconfig
[buildid]
dir = /var/cache/perf-buildid
All buildids and binaries are be saved in the directory specified. The perf
record, buildid-list, buildid-cache, report, annotate, and archive commands
will it to pull information out.
The option can be set in the system-wide perfconfig file or in the
$HOME/.perfconfig file.
Cc: David S. Miller <davem@davemloft.net>
Cc: Frédéric Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Tom Zanussi <tzanussi@gmail.com>
LKML-Reference: <4c055fb7.df0ce30a.5f0d.ffffae52@mx.google.com>
Signed-off-by: Stephane Eranian <eranian@google.com>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2010-06-02 03:25:01 +08:00
|
|
|
|
2009-04-20 21:00:56 +08:00
|
|
|
if (argc > 0) {
|
2017-07-21 02:27:39 +08:00
|
|
|
if (strstarts(argv[0], "--"))
|
2009-04-20 21:00:56 +08:00
|
|
|
argv[0] += 2;
|
|
|
|
} else {
|
|
|
|
/* The user didn't specify a command; give them help */
|
2009-03-13 10:20:49 +08:00
|
|
|
printf("\n usage: %s\n\n", perf_usage_string);
|
2009-04-20 21:00:56 +08:00
|
|
|
list_common_cmds_help();
|
2009-03-13 10:20:49 +08:00
|
|
|
printf("\n %s\n\n", perf_more_info_string);
|
2013-01-25 02:18:54 +08:00
|
|
|
goto out;
|
2009-04-20 21:00:56 +08:00
|
|
|
}
|
|
|
|
cmd = argv[0];
|
|
|
|
|
2012-10-31 22:52:47 +08:00
|
|
|
test_attr__init();
|
|
|
|
|
2009-04-20 21:00:56 +08:00
|
|
|
/*
|
|
|
|
* We use PATH to find perf commands, but we prepend some higher
|
2010-01-18 23:02:48 +08:00
|
|
|
* precedence paths: the "--exec-path" option, the PERF_EXEC_PATH
|
2009-04-20 21:00:56 +08:00
|
|
|
* environment, and the $(perfexecdir) from the Makefile at build
|
|
|
|
* time.
|
|
|
|
*/
|
|
|
|
setup_path();
|
2011-10-13 19:52:46 +08:00
|
|
|
/*
|
|
|
|
* Block SIGWINCH notifications so that the thread that wants it can
|
|
|
|
* unblock and get syscalls like select interrupted instead of waiting
|
|
|
|
* forever while the signal goes to some other non interested thread.
|
|
|
|
*/
|
|
|
|
pthread__block_sigwinch();
|
2009-04-20 21:00:56 +08:00
|
|
|
|
2016-02-15 00:03:45 +08:00
|
|
|
perf_debug_setup();
|
|
|
|
|
2009-04-20 21:00:56 +08:00
|
|
|
while (1) {
|
2010-01-28 07:05:55 +08:00
|
|
|
static int done_help;
|
2017-03-28 22:19:59 +08:00
|
|
|
|
|
|
|
run_argv(&argc, &argv);
|
2009-06-06 21:19:13 +08:00
|
|
|
|
2009-04-20 21:00:56 +08:00
|
|
|
if (errno != ENOENT)
|
|
|
|
break;
|
2009-06-06 21:19:13 +08:00
|
|
|
|
2009-04-20 21:00:56 +08:00
|
|
|
if (!done_help) {
|
|
|
|
cmd = argv[0] = help_unknown_cmd(cmd);
|
|
|
|
done_help = 1;
|
|
|
|
} else
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
fprintf(stderr, "Failed to run command '%s': %s\n",
|
tools: Introduce str_error_r()
The tools so far have been using the strerror_r() GNU variant, that
returns a string, be it the buffer passed or something else.
But that, besides being tricky in cases where we expect that the
function using strerror_r() returns the error formatted in a provided
buffer (we have to check if it returned something else and copy that
instead), breaks the build on systems not using glibc, like Alpine
Linux, where musl libc is used.
So, introduce yet another wrapper, str_error_r(), that has the GNU
interface, but uses the portable XSI variant of strerror_r(), so that
users rest asured that the provided buffer is used and it is what is
returned.
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Wang Nan <wangnan0@huawei.com>
Link: http://lkml.kernel.org/n/tip-d4t42fnf48ytlk8rjxs822tf@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2016-07-06 22:56:20 +08:00
|
|
|
cmd, str_error_r(errno, sbuf, sizeof(sbuf)));
|
2013-01-25 02:18:54 +08:00
|
|
|
out:
|
2009-04-20 21:00:56 +08:00
|
|
|
return 1;
|
|
|
|
}
|