lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <1430391165-30267-16-git-send-email-wangnan0@huawei.com>
Date:	Thu, 30 Apr 2015 10:52:38 +0000
From:	Wang Nan <wangnan0@...wei.com>
To:	<ast@...mgrid.com>, <davem@...emloft.net>, <acme@...nel.org>,
	<mingo@...hat.com>, <a.p.zijlstra@...llo.nl>,
	<masami.hiramatsu.pt@...achi.com>, <jolsa@...nel.org>
CC:	<lizefan@...nel.org>, <linux-kernel@...r.kernel.org>,
	<pi3orama@....com>, <hekuang@...wei.com>
Subject: [RFC PATCH 15/22] perf bpf: config eBPF programs using config section.

This patch uses bpf_perf_prog_config() to config perf programs using
config section. In bpf_obj_config(), splits config section into lines
and parse config string line by line.

This patch and previous patch should config all eBPF programs. This
patch also makes bpf_obj_validate() to check programs with no config,
and disable further processing if found one.

Since all programs are configed, obj->config_str us useless. Free it
after configuration done.

Signed-off-by: Wang Nan <wangnan0@...wei.com>
---
 tools/perf/util/bpf-loader.c | 56 ++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 52 insertions(+), 4 deletions(-)

diff --git a/tools/perf/util/bpf-loader.c b/tools/perf/util/bpf-loader.c
index b2871fc..6a1c800 100644
--- a/tools/perf/util/bpf-loader.c
+++ b/tools/perf/util/bpf-loader.c
@@ -476,11 +476,22 @@ out:
 
 static int bpf_obj_validate(struct bpf_obj *obj)
 {
+	struct bpf_perf_prog *prog;
+
 	if (obj->kern_version == 0) {
 		pr_err("bpf: %s doesn't provide kernel version\n",
 			obj->path);
 		return -EINVAL;
 	}
+
+	list_for_each_entry(prog, &obj->progs_list, list) {
+		if (!prog->pev) {
+			pr_err("bpf: program %s doesn't have config.\n",
+				prog->name);
+			return -EINVAL;
+
+		}
+	}
 	return 0;
 }
 
@@ -635,7 +646,9 @@ static int bpf_perf_prog_config(struct bpf_obj *obj,
 static int bpf_obj_config(struct bpf_obj *obj)
 {
 	struct bpf_perf_prog *prog;
-	int err;
+	char *config_str = obj->config_str;
+	char *pend;
+	int err = 0;
 
 	/* try to config progs based on their names */
 	list_for_each_entry(prog, &obj->progs_list, list) {
@@ -644,7 +657,42 @@ static int bpf_obj_config(struct bpf_obj *obj)
 			return err;
 	}
 
-	return 0;
+	/* return if no 'config' section provided */
+	if (!config_str)
+		return 0;
+
+	/* config progs use obj->config_str */
+	pend = config_str + strlen(config_str);
+	while (config_str < pend) {
+		char *ptr;
+
+		/* skip blank lines */
+		if (*config_str == '\n') {
+			config_str ++;
+			continue;
+		}
+
+		ptr = strpbrk(config_str, "\n");
+		if (ptr)
+			*ptr = '\0';
+		err = bpf_perf_prog_config(obj, NULL, config_str);
+		if (err) {
+			pr_err("bpf config: '%s' is not a valid "
+			       "config string: err %d\n",
+			       config_str, err);
+			goto out;
+		}
+
+		if (!ptr)
+			break;
+		config_str = ptr + 1;
+	}
+out:
+	if (obj->config_str) {
+		free(obj->config_str);
+		obj->config_str = NULL;
+	}
+	return err;
 }
 
 int bpf__load(const char *path)
@@ -671,10 +719,10 @@ int bpf__load(const char *path)
 		goto out;
 	if ((err = bpf_obj_elf_collect(obj)))
 		goto out;
-	if ((err = bpf_obj_validate(obj)))
-		goto out;
 	if ((err = bpf_obj_config(obj)))
 		goto out;
+	if ((err = bpf_obj_validate(obj)))
+		goto out;
 
 	list_add(&obj->list, &bpf_obj_list);
 	return 0;
-- 
1.8.3.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ