aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tools/lib/bpf/libbpf.c29
1 files changed, 26 insertions, 3 deletions
diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c
index 97ce9f214002..e827542ffa3a 100644
--- a/tools/lib/bpf/libbpf.c
+++ b/tools/lib/bpf/libbpf.c
@@ -124,6 +124,10 @@ struct bpf_program {
124 char *name; 124 char *name;
125 int prog_ifindex; 125 int prog_ifindex;
126 char *section_name; 126 char *section_name;
127 /* section_name with / replaced by _; makes recursive pinning
128 * in bpf_object__pin_programs easier
129 */
130 char *pin_name;
127 struct bpf_insn *insns; 131 struct bpf_insn *insns;
128 size_t insns_cnt, main_prog_cnt; 132 size_t insns_cnt, main_prog_cnt;
129 enum bpf_prog_type type; 133 enum bpf_prog_type type;
@@ -253,6 +257,7 @@ static void bpf_program__exit(struct bpf_program *prog)
253 bpf_program__unload(prog); 257 bpf_program__unload(prog);
254 zfree(&prog->name); 258 zfree(&prog->name);
255 zfree(&prog->section_name); 259 zfree(&prog->section_name);
260 zfree(&prog->pin_name);
256 zfree(&prog->insns); 261 zfree(&prog->insns);
257 zfree(&prog->reloc_desc); 262 zfree(&prog->reloc_desc);
258 263
@@ -261,6 +266,17 @@ static void bpf_program__exit(struct bpf_program *prog)
261 prog->idx = -1; 266 prog->idx = -1;
262} 267}
263 268
269static char *__bpf_program__pin_name(struct bpf_program *prog)
270{
271 char *name, *p;
272
273 name = p = strdup(prog->section_name);
274 while ((p = strchr(p, '/')))
275 *p = '_';
276
277 return name;
278}
279
264static int 280static int
265bpf_program__init(void *data, size_t size, char *section_name, int idx, 281bpf_program__init(void *data, size_t size, char *section_name, int idx,
266 struct bpf_program *prog) 282 struct bpf_program *prog)
@@ -279,6 +295,13 @@ bpf_program__init(void *data, size_t size, char *section_name, int idx,
279 goto errout; 295 goto errout;
280 } 296 }
281 297
298 prog->pin_name = __bpf_program__pin_name(prog);
299 if (!prog->pin_name) {
300 pr_warning("failed to alloc pin name for prog under section(%d) %s\n",
301 idx, section_name);
302 goto errout;
303 }
304
282 prog->insns = malloc(size); 305 prog->insns = malloc(size);
283 if (!prog->insns) { 306 if (!prog->insns) {
284 pr_warning("failed to alloc insns for prog under section %s\n", 307 pr_warning("failed to alloc insns for prog under section %s\n",
@@ -2006,7 +2029,7 @@ int bpf_object__pin_programs(struct bpf_object *obj, const char *path)
2006 int len; 2029 int len;
2007 2030
2008 len = snprintf(buf, PATH_MAX, "%s/%s", path, 2031 len = snprintf(buf, PATH_MAX, "%s/%s", path,
2009 prog->section_name); 2032 prog->pin_name);
2010 if (len < 0) { 2033 if (len < 0) {
2011 err = -EINVAL; 2034 err = -EINVAL;
2012 goto err_unpin_programs; 2035 goto err_unpin_programs;
@@ -2028,7 +2051,7 @@ err_unpin_programs:
2028 int len; 2051 int len;
2029 2052
2030 len = snprintf(buf, PATH_MAX, "%s/%s", path, 2053 len = snprintf(buf, PATH_MAX, "%s/%s", path,
2031 prog->section_name); 2054 prog->pin_name);
2032 if (len < 0) 2055 if (len < 0)
2033 continue; 2056 continue;
2034 else if (len >= PATH_MAX) 2057 else if (len >= PATH_MAX)
@@ -2053,7 +2076,7 @@ int bpf_object__unpin_programs(struct bpf_object *obj, const char *path)
2053 int len; 2076 int len;
2054 2077
2055 len = snprintf(buf, PATH_MAX, "%s/%s", path, 2078 len = snprintf(buf, PATH_MAX, "%s/%s", path,
2056 prog->section_name); 2079 prog->pin_name);
2057 if (len < 0) 2080 if (len < 0)
2058 return -EINVAL; 2081 return -EINVAL;
2059 else if (len >= PATH_MAX) 2082 else if (len >= PATH_MAX)