From: Eduard Zingerman <eddyz87@gmail.com>
To: bpf@vger.kernel.org, ast@kernel.org
Cc: andrii@kernel.org, daniel@iogearbox.net, martin.lau@linux.dev,
kernel-team@fb.com, yonghong.song@linux.dev,
quentin@isovalent.com, alan.maguire@oracle.com,
Eduard Zingerman <eddyz87@gmail.com>
Subject: [RFC v2 3/3] selftests/bpf: verify bpftool emits preserve_static_offset
Date: Tue, 12 Dec 2023 04:31:36 +0200 [thread overview]
Message-ID: <20231212023136.7021-4-eddyz87@gmail.com> (raw)
In-Reply-To: <20231212023136.7021-1-eddyz87@gmail.com>
Extend test_bpftool.py with following test cases:
- Load a small program that has some context types in it's BTF,
verify that "bpftool btf dump file ... format c" emits
preserve_static_offset attribute.
- Load a small program that has no context types in it's BTF,
verify that "bpftool btf dump file ... format c" does not emit
preserve_static_offset attribute.
Signed-off-by: Eduard Zingerman <eddyz87@gmail.com>
---
.../bpf/progs/dummy_no_context_btf.c | 12 ++++
.../selftests/bpf/progs/dummy_sk_buff_user.c | 14 +++++
tools/testing/selftests/bpf/test_bpftool.py | 61 +++++++++++++++++++
3 files changed, 87 insertions(+)
create mode 100644 tools/testing/selftests/bpf/progs/dummy_no_context_btf.c
create mode 100644 tools/testing/selftests/bpf/progs/dummy_sk_buff_user.c
diff --git a/tools/testing/selftests/bpf/progs/dummy_no_context_btf.c b/tools/testing/selftests/bpf/progs/dummy_no_context_btf.c
new file mode 100644
index 000000000000..5a1df4984dce
--- /dev/null
+++ b/tools/testing/selftests/bpf/progs/dummy_no_context_btf.c
@@ -0,0 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
+#include <linux/bpf.h>
+#include <bpf/bpf_helpers.h>
+
+/* A dummy program that does not reference context types in it's BTF */
+SEC("tc")
+__u32 dummy_prog(void *ctx)
+{
+ return 0;
+}
+
+char _license[] SEC("license") = "GPL";
diff --git a/tools/testing/selftests/bpf/progs/dummy_sk_buff_user.c b/tools/testing/selftests/bpf/progs/dummy_sk_buff_user.c
new file mode 100644
index 000000000000..f271881bcbd0
--- /dev/null
+++ b/tools/testing/selftests/bpf/progs/dummy_sk_buff_user.c
@@ -0,0 +1,14 @@
+// SPDX-License-Identifier: GPL-2.0
+#include <linux/bpf.h>
+#include <bpf/bpf_helpers.h>
+
+/* A dummy program that references __sk_buff type in it's BTF,
+ * used by test_bpftool.py.
+ */
+SEC("tc")
+int sk_buff_user(struct __sk_buff *skb)
+{
+ return 0;
+}
+
+char _license[] SEC("license") = "GPL";
diff --git a/tools/testing/selftests/bpf/test_bpftool.py b/tools/testing/selftests/bpf/test_bpftool.py
index 1c2408ee1f5d..3117f431dd92 100644
--- a/tools/testing/selftests/bpf/test_bpftool.py
+++ b/tools/testing/selftests/bpf/test_bpftool.py
@@ -8,6 +8,7 @@ import os
import socket
import subprocess
import unittest
+import io
# Add the source tree of bpftool and /usr/local/sbin to PATH
@@ -25,6 +26,10 @@ class UnprivilegedUserError(Exception):
pass
+class MissingDependencyError(Exception):
+ pass
+
+
def _bpftool(args, json=True):
_args = ["bpftool"]
if json:
@@ -63,12 +68,22 @@ DMESG_EMITTING_HELPERS = [
"bpf_trace_vprintk",
]
+DUMMY_SK_BUFF_USER_OBJ = cur_dir + "/dummy_sk_buff_user.bpf.o"
+DUMMY_NO_CONTEXT_BTF_OBJ = cur_dir + "/dummy_no_context_btf.bpf.o"
+
class TestBpftool(unittest.TestCase):
@classmethod
def setUpClass(cls):
if os.getuid() != 0:
raise UnprivilegedUserError(
"This test suite needs root privileges")
+ objs = [DUMMY_SK_BUFF_USER_OBJ,
+ DUMMY_NO_CONTEXT_BTF_OBJ]
+ for obj in objs:
+ if os.path.exists(obj):
+ continue
+ raise MissingDependencyError(
+ "File " + obj + " does not exist, make sure progs/*.c are compiled")
@default_iface
def test_feature_dev_json(self, iface):
@@ -172,3 +187,49 @@ class TestBpftool(unittest.TestCase):
res = bpftool(["feature", "probe", "macros"])
for pattern in expected_patterns:
self.assertRegex(res, pattern)
+
+ def assertStringsPresent(self, text, patterns):
+ pos = 0
+ for i, pat in enumerate(patterns):
+ m = text.find(pat, pos)
+ if m == -1:
+ with io.StringIO() as msg:
+ print("Can't find expected string:", file=msg)
+ for s in patterns[0:i]:
+ print(" MATCHED: " + s, file=msg)
+ print("NOT MATCHED: " + pat, file=msg)
+ print("", file=msg)
+ print("Searching in:", file=msg)
+ print(text, file=msg)
+ self.fail(msg.getvalue())
+ pos += len(pat)
+
+ # Load a small program that has some context types in it's BTF,
+ # verify that "bpftool btf dump file ... format c" emits
+ # preserve_static_offset attribute.
+ def test_c_dump_preserve_static_offset_present(self):
+ res = bpftool(["btf", "dump", "file", DUMMY_SK_BUFF_USER_OBJ, "format", "c"])
+ self.assertStringsPresent(res, [
+ "#if !defined(BPF_NO_PRESERVE_STATIC_OFFSET) && " +
+ "__has_attribute(preserve_static_offset)",
+ "#pragma clang attribute push " +
+ "(__attribute__((preserve_static_offset)), apply_to = record)",
+ "struct __sk_buff;",
+ "struct bpf_sock;",
+ "#pragma clang attribute pop",
+ "#endif /* BPF_NO_PRESERVE_STATIC_OFFSET */",
+ "#pragma clang attribute push " +
+ "(__attribute__((preserve_access_index)), apply_to = record)",
+ "struct __sk_buff {",
+ ])
+
+ # Load a small program that has no context types in it's BTF,
+ # verify that "bpftool btf dump file ... format c" does not emit
+ # preserve_static_offset attribute.
+ def test_c_dump_no_preserve_static_offset(self):
+ res = bpftool(["btf", "dump", "file", DUMMY_NO_CONTEXT_BTF_OBJ, "format", "c"])
+ self.assertNotRegex(res, "preserve_static_offset")
+ self.assertStringsPresent(res, [
+ "preserve_access_index",
+ "typedef unsigned int __u32;"
+ ])
--
2.42.1
prev parent reply other threads:[~2023-12-12 2:32 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-12-12 2:31 [RFC v2 0/2] use preserve_static_offset in bpf uapi headers Eduard Zingerman
2023-12-12 2:31 ` [RFC v2 1/3] bpf: Mark virtual BPF context structures as preserve_static_offset Eduard Zingerman
2023-12-12 2:31 ` [RFC v2 2/3] bpftool: add attribute preserve_static_offset for context types Eduard Zingerman
2023-12-12 11:39 ` Quentin Monnet
2023-12-12 15:58 ` Eduard Zingerman
2023-12-12 16:07 ` Quentin Monnet
2023-12-13 4:53 ` Yonghong Song
2023-12-12 2:31 ` Eduard Zingerman [this message]
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=20231212023136.7021-4-eddyz87@gmail.com \
--to=eddyz87@gmail.com \
--cc=alan.maguire@oracle.com \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=kernel-team@fb.com \
--cc=martin.lau@linux.dev \
--cc=quentin@isovalent.com \
--cc=yonghong.song@linux.dev \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.