diff options
-rw-r--r-- | tools/lib/bpf/libbpf.c | 29 |
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 | ||
269 | static 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 | |||
264 | static int | 280 | static int |
265 | bpf_program__init(void *data, size_t size, char *section_name, int idx, | 281 | bpf_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) |