mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Wang Nan <wangnan0@huawei.com>
To: <paulus@samba.org>, <a.p.zijlstra@chello.nl>, <mingo@redhat.com>,
	<acme@kernel.org>, <namhyung@kernel.org>, <jolsa@kernel.org>,
	<adrian.hunter@intel.com>, <dsahern@gmail.com>,
	<ast@plumgrid.com>, <daniel@iogearbox.net>,
	<brendan.d.gregg@gmail.com>, <masami.hiramatsu.pt@hitachi.com>
Cc: <linux-kernel@vger.kernel.org>, <lizefan@huawei.com>,
	<pi3orama@163.com>, <wangnan0@huawei.com>
Subject: [RFC PATCH v2 26/37] tools perf: Add new 'perf bpf' command.
Date: Fri, 15 May 2015 07:51:19 +0000	[thread overview]
Message-ID: <1431676290-1230-27-git-send-email-wangnan0@huawei.com> (raw)
In-Reply-To: <1431676290-1230-1-git-send-email-wangnan0@huawei.com>

Adding new 'perf bpf' command to provide eBPF program management
operations. This patch only creates basic 'perf bpf'. Subcommands will
be introduced in following patches.

To utilize existing code of usage_with_options() while enable
subcommand list get output after 'Usage ...' indicator, this patch
add a usage_with_options_noexit() function, which does similar thing
except exiting, allows caller print more information before quit.

In this patch, 'perf bpf' command won't be built if doesn't find
libelf.

Signed-off-by: Wang Nan <wangnan0@huawei.com>
---
 tools/perf/Build                      |  1 +
 tools/perf/Documentation/perf-bpf.txt | 18 ++++++++
 tools/perf/builtin-bpf.c              | 85 +++++++++++++++++++++++++++++++++++
 tools/perf/builtin.h                  |  1 +
 tools/perf/command-list.txt           |  1 +
 tools/perf/perf.c                     |  3 ++
 tools/perf/util/parse-options.c       |  8 +++-
 tools/perf/util/parse-options.h       |  2 +
 8 files changed, 118 insertions(+), 1 deletion(-)
 create mode 100644 tools/perf/Documentation/perf-bpf.txt
 create mode 100644 tools/perf/builtin-bpf.c

diff --git a/tools/perf/Build b/tools/perf/Build
index b77370e..c3c6cc3 100644
--- a/tools/perf/Build
+++ b/tools/perf/Build
@@ -19,6 +19,7 @@ perf-y += builtin-kvm.o
 perf-y += builtin-inject.o
 perf-y += builtin-mem.o
 perf-y += builtin-data.o
+perf-$(CONFIG_LIBELF) += builtin-bpf.o
 
 perf-$(CONFIG_AUDIT) += builtin-trace.o
 perf-$(CONFIG_LIBELF) += builtin-probe.o
diff --git a/tools/perf/Documentation/perf-bpf.txt b/tools/perf/Documentation/perf-bpf.txt
new file mode 100644
index 0000000..0e8b590
--- /dev/null
+++ b/tools/perf/Documentation/perf-bpf.txt
@@ -0,0 +1,18 @@
+perf-bpf(1)
+==============
+
+NAME
+----
+perf-bpf - Management of eBPF programs.
+
+SYNOPSIS
+--------
+[verse]
+'perf bpf' [<common options>] <command> [<options>]",
+
+DESCRIPTION
+-----------
+Management of eBPF programs.
+
+OPTIONS
+-------
diff --git a/tools/perf/builtin-bpf.c b/tools/perf/builtin-bpf.c
new file mode 100644
index 0000000..a8858e2
--- /dev/null
+++ b/tools/perf/builtin-bpf.c
@@ -0,0 +1,85 @@
+/*
+ * builtin-bpf.c
+ *
+ * Copyright (C) 2015, Wang Nan <wangnan0@huawei.com>
+ * Copyright (C) 2015, Huawei Inc.
+ *
+ * Released under the GPL v2. (and only v2, not any later version)
+ *
+ * Builtin bpf command: management of bpf programs.
+ */
+#include "builtin.h"
+#include "perf.h"
+#include "debug.h"
+#include "parse-options.h"
+
+typedef int (*bpf_cmd_fn_t)(int argc, const char **argv, const char *prefix);
+
+struct bpf_cmd {
+	const char	*name;
+	const char	*summary;
+	bpf_cmd_fn_t	fn;
+};
+
+static struct bpf_cmd bpf_cmds[];
+
+#define for_each_cmd(cmd) \
+	for (cmd = bpf_cmds; cmd && cmd->name; cmd++)
+
+struct option bpf_options[] = {
+	OPT_INCR('v', "verbose", &verbose, "be more verbose "
+					   "(show debug information)"),
+	OPT_END()
+};
+
+static const char *bpf_usage[] = {
+	"perf bpf [<command options>] <command> [<options>]",
+	NULL
+};
+
+static void print_usage(void)
+{
+	struct bpf_cmd *cmd;
+
+	usage_with_options_noexit(bpf_usage, bpf_options);
+	printf("\tAvailable commands:\n");
+	for_each_cmd(cmd)
+		printf("\t %s\t- %s\n", cmd->name, cmd->summary);
+	exit(129);
+}
+
+static const char * const bpf_subcommands[] = { NULL };
+
+static struct bpf_cmd bpf_cmds[] = {
+	{ .name = NULL, },
+};
+
+int cmd_bpf(int argc, const char **argv,
+	    const char *prefix __maybe_unused)
+{
+	struct bpf_cmd *cmd;
+	const char *cmdstr;
+
+	/* No command specified. */
+	if (argc < 2)
+		goto usage;
+
+	argc = parse_options_subcommand(argc, argv, bpf_options, bpf_subcommands, bpf_usage,
+			     PARSE_OPT_STOP_AT_NON_OPTION);
+	if (argc < 1)
+		goto usage;
+
+	cmdstr = argv[0];
+
+	for_each_cmd(cmd) {
+		if (strcmp(cmd->name, cmdstr))
+			continue;
+
+		return cmd->fn(argc, argv, prefix);
+	}
+
+	pr_err("Unknown command %s\n", cmdstr);
+usage:
+	print_usage();
+	return -1;
+}
diff --git a/tools/perf/builtin.h b/tools/perf/builtin.h
index 3688ad2..c2c4a0d 100644
--- a/tools/perf/builtin.h
+++ b/tools/perf/builtin.h
@@ -38,6 +38,7 @@ extern int cmd_trace(int argc, const char **argv, const char *prefix);
 extern int cmd_inject(int argc, const char **argv, const char *prefix);
 extern int cmd_mem(int argc, const char **argv, const char *prefix);
 extern int cmd_data(int argc, const char **argv, const char *prefix);
+extern int cmd_bpf(int argc, const char **argv, const char *prefix);
 
 extern int find_scripts(char **scripts_array, char **scripts_path_array);
 #endif
diff --git a/tools/perf/command-list.txt b/tools/perf/command-list.txt
index 00fcaf8..1000463 100644
--- a/tools/perf/command-list.txt
+++ b/tools/perf/command-list.txt
@@ -5,6 +5,7 @@
 perf-annotate			mainporcelain common
 perf-archive			mainporcelain common
 perf-bench			mainporcelain common
+perf-bpf			mainporcelain full
 perf-buildid-cache		mainporcelain common
 perf-buildid-list		mainporcelain common
 perf-data			mainporcelain common
diff --git a/tools/perf/perf.c b/tools/perf/perf.c
index b857fcb..eff1a55 100644
--- a/tools/perf/perf.c
+++ b/tools/perf/perf.c
@@ -64,6 +64,9 @@ static struct cmd_struct commands[] = {
 	{ "inject",	cmd_inject,	0 },
 	{ "mem",	cmd_mem,	0 },
 	{ "data",	cmd_data,	0 },
+#ifdef HAVE_LIBELF_SUPPORT
+	{ "bpf",	cmd_bpf,	0 },
+#endif
 };
 
 struct pager_config {
diff --git a/tools/perf/util/parse-options.c b/tools/perf/util/parse-options.c
index 01626be..09e48a2 100644
--- a/tools/perf/util/parse-options.c
+++ b/tools/perf/util/parse-options.c
@@ -672,9 +672,15 @@ int usage_with_options_internal(const char * const *usagestr,
 void usage_with_options(const char * const *usagestr,
 			const struct option *opts)
 {
+	usage_with_options_noexit(usagestr, opts);
+	exit(129);
+}
+
+void usage_with_options_noexit(const char * const *usagestr,
+			       const struct option *opts)
+{
 	exit_browser(false);
 	usage_with_options_internal(usagestr, opts, 0);
-	exit(129);
 }
 
 int parse_options_usage(const char * const *usagestr,
diff --git a/tools/perf/util/parse-options.h b/tools/perf/util/parse-options.h
index 59561fd..41194db 100644
--- a/tools/perf/util/parse-options.h
+++ b/tools/perf/util/parse-options.h
@@ -156,6 +156,8 @@ extern int parse_options_subcommand(int argc, const char **argv,
 
 extern NORETURN void usage_with_options(const char * const *usagestr,
                                         const struct option *options);
+extern void usage_with_options_noexit(const char * const *usagestr,
+				      const struct option *options);
 
 /*----- incremantal advanced APIs -----*/
 
-- 
1.8.3.4


  parent reply	other threads:[~2015-05-15  7:52 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-05-15  7:50 [RFC PATCH v2 00/37] perf tools: introduce 'perf bpf' command to load eBPF programs Wang Nan
2015-05-15  7:50 ` [RFC PATCH v2 01/37] tools perf: set vmlinux_path__nr_entries to 0 in vmlinux_path__exit Wang Nan
2015-05-15  7:50 ` [RFC PATCH v2 02/37] tools lib traceevent: install libtraceevent.a into libdir Wang Nan
2015-05-15  7:50 ` [RFC PATCH v2 03/37] tools build: Allow other override features to check Wang Nan
2015-05-15  7:50 ` [RFC PATCH v2 04/37] tools include: add __aligned_u64 to types.h Wang Nan
2015-05-20 12:23   ` [tip:perf/core] " tip-bot for Wang Nan
2015-05-15  7:50 ` [RFC PATCH v2 05/37] tools lib bpf: introduce 'bpf' library to tools Wang Nan
2015-05-15  7:50 ` [RFC PATCH v2 06/37] tools lib bpf: allow set printing function Wang Nan
2015-05-15  7:51 ` [RFC PATCH v2 07/37] tools lib bpf: defines basic interface Wang Nan
2015-05-15  7:51 ` [RFC PATCH v2 08/37] tools lib bpf: open eBPF object file and do basic validation Wang Nan
2015-05-15  7:51 ` [RFC PATCH v2 09/37] tools lib bpf: check swap according to EHDR Wang Nan
2015-05-15  7:51 ` [RFC PATCH v2 10/37] tools lib bpf: iterater over elf sections to collect information Wang Nan
2015-05-15  7:51 ` [RFC PATCH v2 11/37] tools lib bpf: collect version and license from ELF Wang Nan
2015-05-15  7:51 ` [RFC PATCH v2 12/37] tools lib bpf: collect map definitions Wang Nan
2015-05-15  7:51 ` [RFC PATCH v2 13/37] tools lib bpf: collect config section in object Wang Nan
2015-05-15  7:51 ` [RFC PATCH v2 14/37] tools lib bpf: collect symbol table in object files Wang Nan
2015-05-15  7:51 ` [RFC PATCH v2 15/37] tools lib bpf: collect bpf programs from " Wang Nan
2015-05-15  7:51 ` [RFC PATCH v2 16/37] tools lib bpf: collect relocation sections from object file Wang Nan
2015-05-15  7:51 ` [RFC PATCH v2 17/37] tools lib bpf: collect relocation instructions for each program Wang Nan
2015-05-15  7:51 ` [RFC PATCH v2 18/37] tools lib bpf: clean elf memory after loading Wang Nan
2015-05-15  7:51 ` [RFC PATCH v2 19/37] tools lib bpf: add bpf.c/h for common bpf operations Wang Nan
2015-05-15  7:51 ` [RFC PATCH v2 20/37] tools lib bpf: create maps needed by object file Wang Nan
2015-05-15  7:51 ` [RFC PATCH v2 21/37] tools lib bpf: relocation programs Wang Nan
2015-05-15  7:51 ` [RFC PATCH v2 22/37] tools lib bpf: introduce bpf_load_program to bpf.c Wang Nan
2015-05-15  7:51 ` [RFC PATCH v2 23/37] tools lib bpf: load bpf programs in object file into kernel Wang Nan
2015-05-15  7:51 ` [RFC PATCH v2 24/37] tools lib bpf: accessors of bpf_program Wang Nan
2015-05-15  7:51 ` [RFC PATCH v2 25/37] tools lib bpf: accessors for struct bpf_object Wang Nan
2015-05-15  7:51 ` Wang Nan [this message]
2015-05-15  7:51 ` [RFC PATCH v2 27/37] tools perf: make perf depend on libbpf Wang Nan
2015-05-15  7:51 ` [RFC PATCH v2 28/37] tools perf: add 'perf bpf record' subcommand Wang Nan
2015-05-15  7:51 ` [RFC PATCH v2 29/37] tools perf: add bpf-loader and open elf object files Wang Nan
2015-05-15  7:51 ` [RFC PATCH v2 30/37] tools perf: collect all bpf programs Wang Nan
2015-05-15  7:51 ` [RFC PATCH v2 31/37] tools perf: config probe points of eBPF programs during prepartion Wang Nan
2015-05-15  7:51 ` [RFC PATCH v2 32/37] tools perf bpf: probe at kprobe points Wang Nan
2015-05-15  7:51 ` [RFC PATCH v2 33/37] tools perf bpf: load eBPF object into kernel Wang Nan
2015-05-15  7:51 ` [RFC PATCH v2 34/37] tools perf: add a bpf_wrapper global flag Wang Nan
2015-05-15  7:51 ` [RFC PATCH v2 35/37] tools perf: add bpf_fd field to evsel and introduce new event syntax Wang Nan
2015-05-15  7:51 ` [RFC PATCH v2 36/37] tools perf: generate event argv Wang Nan
2015-05-15  7:51 ` [RFC PATCH v2 37/37] tools perf bpf: passes generated arguments to cmd_record Wang Nan
2015-05-15  8:03 ` [RFC PATCH v2 00/37] perf tools: introduce 'perf bpf' command to load eBPF programs Ingo Molnar
2015-05-15  8:40   ` Wangnan (F)
2015-05-15  8:48     ` Ingo Molnar
2015-05-15  9:42       ` Wangnan (F)

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1431676290-1230-27-git-send-email-wangnan0@huawei.com \
    --to=wangnan0@huawei.com \
    --cc=a.p.zijlstra@chello.nl \
    --cc=acme@kernel.org \
    --cc=adrian.hunter@intel.com \
    --cc=ast@plumgrid.com \
    --cc=brendan.d.gregg@gmail.com \
    --cc=daniel@iogearbox.net \
    --cc=dsahern@gmail.com \
    --cc=jolsa@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=lizefan@huawei.com \
    --cc=masami.hiramatsu.pt@hitachi.com \
    --cc=mingo@redhat.com \
    --cc=namhyung@kernel.org \
    --cc=paulus@samba.org \
    --cc=pi3orama@163.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®