summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichal Rostecki <mrostecki@opensuse.org>2019-05-29 14:31:09 -0400
committerAlexei Starovoitov <ast@kernel.org>2019-05-31 20:03:39 -0400
commitcfd4921049269ee6765b4a1cb820b95d0df5dda5 (patch)
tree7c5a15cd500f3fd35f8357672f97fd0ab8b0e74e
parent5fac1718e706d94a7078addee9075cfaea00ca8c (diff)
libbpf: Return btf_fd for load_sk_storage_btf
Before this change, function load_sk_storage_btf expected that libbpf__probe_raw_btf was returning a BTF descriptor, but in fact it was returning an information about whether the probe was successful (0 or 1). load_sk_storage_btf was using that value as an argument of the close function, which was resulting in closing stdout and thus terminating the process which called that function. That bug was visible in bpftool. `bpftool feature` subcommand was always exiting too early (because of closed stdout) and it didn't display all requested probes. `bpftool -j feature` or `bpftool -p feature` were not returning a valid json object. This change renames the libbpf__probe_raw_btf function to libbpf__load_raw_btf, which now returns a BTF descriptor, as expected in load_sk_storage_btf. v2: - Fix typo in the commit message. v3: - Simplify BTF descriptor handling in bpf_object__probe_btf_* functions. - Rename libbpf__probe_raw_btf function to libbpf__load_raw_btf and return a BTF descriptor. v4: - Fix typo in the commit message. Fixes: d7c4b3980c18 ("libbpf: detect supported kernel BTF features and sanitize BTF") Signed-off-by: Michal Rostecki <mrostecki@opensuse.org> Acked-by: Andrii Nakryiko <andriin@fb.com> Acked-by: Song Liu <songliubraving@fb.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org>
-rw-r--r--tools/lib/bpf/libbpf.c28
-rw-r--r--tools/lib/bpf/libbpf_internal.h4
-rw-r--r--tools/lib/bpf/libbpf_probes.c13
3 files changed, 22 insertions, 23 deletions
diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c
index 197b574406b3..5d046cc7b207 100644
--- a/tools/lib/bpf/libbpf.c
+++ b/tools/lib/bpf/libbpf.c
@@ -1645,14 +1645,16 @@ static int bpf_object__probe_btf_func(struct bpf_object *obj)
1645 /* FUNC x */ /* [3] */ 1645 /* FUNC x */ /* [3] */
1646 BTF_TYPE_ENC(5, BTF_INFO_ENC(BTF_KIND_FUNC, 0, 0), 2), 1646 BTF_TYPE_ENC(5, BTF_INFO_ENC(BTF_KIND_FUNC, 0, 0), 2),
1647 }; 1647 };
1648 int res; 1648 int btf_fd;
1649 1649
1650 res = libbpf__probe_raw_btf((char *)types, sizeof(types), 1650 btf_fd = libbpf__load_raw_btf((char *)types, sizeof(types),
1651 strs, sizeof(strs)); 1651 strs, sizeof(strs));
1652 if (res < 0) 1652 if (btf_fd >= 0) {
1653 return res;
1654 if (res > 0)
1655 obj->caps.btf_func = 1; 1653 obj->caps.btf_func = 1;
1654 close(btf_fd);
1655 return 1;
1656 }
1657
1656 return 0; 1658 return 0;
1657} 1659}
1658 1660
@@ -1670,14 +1672,16 @@ static int bpf_object__probe_btf_datasec(struct bpf_object *obj)
1670 BTF_TYPE_ENC(3, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4), 1672 BTF_TYPE_ENC(3, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4),
1671 BTF_VAR_SECINFO_ENC(2, 0, 4), 1673 BTF_VAR_SECINFO_ENC(2, 0, 4),
1672 }; 1674 };
1673 int res; 1675 int btf_fd;
1674 1676
1675 res = libbpf__probe_raw_btf((char *)types, sizeof(types), 1677 btf_fd = libbpf__load_raw_btf((char *)types, sizeof(types),
1676 strs, sizeof(strs)); 1678 strs, sizeof(strs));
1677 if (res < 0) 1679 if (btf_fd >= 0) {
1678 return res;
1679 if (res > 0)
1680 obj->caps.btf_datasec = 1; 1680 obj->caps.btf_datasec = 1;
1681 close(btf_fd);
1682 return 1;
1683 }
1684
1681 return 0; 1685 return 0;
1682} 1686}
1683 1687
diff --git a/tools/lib/bpf/libbpf_internal.h b/tools/lib/bpf/libbpf_internal.h
index f3025b4d90e1..dfab8012185c 100644
--- a/tools/lib/bpf/libbpf_internal.h
+++ b/tools/lib/bpf/libbpf_internal.h
@@ -34,7 +34,7 @@ do { \
34#define pr_info(fmt, ...) __pr(LIBBPF_INFO, fmt, ##__VA_ARGS__) 34#define pr_info(fmt, ...) __pr(LIBBPF_INFO, fmt, ##__VA_ARGS__)
35#define pr_debug(fmt, ...) __pr(LIBBPF_DEBUG, fmt, ##__VA_ARGS__) 35#define pr_debug(fmt, ...) __pr(LIBBPF_DEBUG, fmt, ##__VA_ARGS__)
36 36
37int libbpf__probe_raw_btf(const char *raw_types, size_t types_len, 37int libbpf__load_raw_btf(const char *raw_types, size_t types_len,
38 const char *str_sec, size_t str_len); 38 const char *str_sec, size_t str_len);
39 39
40#endif /* __LIBBPF_LIBBPF_INTERNAL_H */ 40#endif /* __LIBBPF_LIBBPF_INTERNAL_H */
diff --git a/tools/lib/bpf/libbpf_probes.c b/tools/lib/bpf/libbpf_probes.c
index 5e2aa83f637a..6635a31a7a16 100644
--- a/tools/lib/bpf/libbpf_probes.c
+++ b/tools/lib/bpf/libbpf_probes.c
@@ -133,8 +133,8 @@ bool bpf_probe_prog_type(enum bpf_prog_type prog_type, __u32 ifindex)
133 return errno != EINVAL && errno != EOPNOTSUPP; 133 return errno != EINVAL && errno != EOPNOTSUPP;
134} 134}
135 135
136int libbpf__probe_raw_btf(const char *raw_types, size_t types_len, 136int libbpf__load_raw_btf(const char *raw_types, size_t types_len,
137 const char *str_sec, size_t str_len) 137 const char *str_sec, size_t str_len)
138{ 138{
139 struct btf_header hdr = { 139 struct btf_header hdr = {
140 .magic = BTF_MAGIC, 140 .magic = BTF_MAGIC,
@@ -157,14 +157,9 @@ int libbpf__probe_raw_btf(const char *raw_types, size_t types_len,
157 memcpy(raw_btf + hdr.hdr_len + hdr.type_len, str_sec, hdr.str_len); 157 memcpy(raw_btf + hdr.hdr_len + hdr.type_len, str_sec, hdr.str_len);
158 158
159 btf_fd = bpf_load_btf(raw_btf, btf_len, NULL, 0, false); 159 btf_fd = bpf_load_btf(raw_btf, btf_len, NULL, 0, false);
160 if (btf_fd < 0) {
161 free(raw_btf);
162 return 0;
163 }
164 160
165 close(btf_fd);
166 free(raw_btf); 161 free(raw_btf);
167 return 1; 162 return btf_fd;
168} 163}
169 164
170static int load_sk_storage_btf(void) 165static int load_sk_storage_btf(void)
@@ -190,7 +185,7 @@ static int load_sk_storage_btf(void)
190 BTF_MEMBER_ENC(23, 2, 32),/* struct bpf_spin_lock l; */ 185 BTF_MEMBER_ENC(23, 2, 32),/* struct bpf_spin_lock l; */
191 }; 186 };
192 187
193 return libbpf__probe_raw_btf((char *)types, sizeof(types), 188 return libbpf__load_raw_btf((char *)types, sizeof(types),
194 strs, sizeof(strs)); 189 strs, sizeof(strs));
195} 190}
196 191