Re: [PATCH bpf-next 08/10] selftests/bpf: Add a C test for btf_type_tag

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 





On 11/11/21 10:55 AM, Andrii Nakryiko wrote:
On Tue, Nov 9, 2021 at 9:21 PM Yonghong Song <yhs@xxxxxx> wrote:

For the C test, compiler the kernel and selftest with clang compiler
by adding LLVM=1 to the make command line since btf_type_tag is
only supported by clang compiler now.

I'm confused. Why does kernel compilation matter at all? And then for
progs/*.c we always compile with Clang anyway (except for unused
gcc_bpf flavor, but that's separate). So what am I missing?

This patch set is tested with additional change with
  #define __user __attribute__((btf_type_tag("user")))
plus pahole hack so I can ensure kernel implementation is
okay with vmlinux + btf_type_tag.
LLVM=1 is needed to test this.

But just for this patch set, you are right, LLVM=1 is not needed.
Will remove it.



The following is the key btf_type_tag usage:
   #define __tag1 __attribute__((btf_type_tag("tag1")))
   #define __tag2 __attribute__((btf_type_tag("tag2")))
   struct btf_type_tag_test {
        int __tag1 * __tag1 __tag2 *p;
   } g;

The bpftool raw dump with related types:
   [4] INT 'int' size=4 bits_offset=0 nr_bits=32 encoding=SIGNED
   [11] STRUCT 'btf_type_tag_test' size=8 vlen=1
           'p' type_id=14 bits_offset=0
   [12] TYPE_TAG 'tag1' type_id=16
   [13] TYPE_TAG 'tag2' type_id=12
   [14] PTR '(anon)' type_id=13
   [15] TYPE_TAG 'tag1' type_id=4
   [16] PTR '(anon)' type_id=15
   [17] VAR 'g' type_id=11, linkage=global

With format C dump, we have
   struct btf_type_tag_test {
         int __attribute__((btf_type_tag("tag1"))) * __attribute__((btf_type_tag("tag1"))) __attribute__((btf_type_tag("tag2"))) *p;
   };
The result C code is identical to the original definition except macro's are gone.

Signed-off-by: Yonghong Song <yhs@xxxxxx>
---
  .../selftests/bpf/prog_tests/btf_tag.c        | 24 +++++++++++++++
  .../selftests/bpf/progs/btf_type_tag.c        | 29 +++++++++++++++++++
  2 files changed, 53 insertions(+)
  create mode 100644 tools/testing/selftests/bpf/progs/btf_type_tag.c

diff --git a/tools/testing/selftests/bpf/prog_tests/btf_tag.c b/tools/testing/selftests/bpf/prog_tests/btf_tag.c
index d15cc7a88182..88d63e23e35f 100644
--- a/tools/testing/selftests/bpf/prog_tests/btf_tag.c
+++ b/tools/testing/selftests/bpf/prog_tests/btf_tag.c
@@ -3,6 +3,12 @@
  #include <test_progs.h>
  #include "btf_decl_tag.skel.h"

+/* struct btf_type_tag_test is referenced in btf_type_tag.skel.h */
+struct btf_type_tag_test {
+        int **p;
+};
+#include "btf_type_tag.skel.h"
+
  static void test_btf_decl_tag(void)
  {
         struct btf_decl_tag *skel;
@@ -19,8 +25,26 @@ static void test_btf_decl_tag(void)
         btf_decl_tag__destroy(skel);
  }

+static void test_btf_type_tag(void)
+{
+       struct btf_type_tag *skel;
+
+       skel = btf_type_tag__open_and_load();
+       if (!ASSERT_OK_PTR(skel, "btf_type_tag"))
+               return;
+
+       if (skel->rodata->skip_tests) {
+               printf("%s:SKIP: btf_type_tag attribute not supported", __func__);
+               test__skip();
+       }
+
+       btf_type_tag__destroy(skel);
+}
+
  void test_btf_tag(void)
  {
         if (test__start_subtest("btf_decl_tag"))
                 test_btf_decl_tag();
+       if (test__start_subtest("btf_type_tag"))
+               test_btf_type_tag();
  }
diff --git a/tools/testing/selftests/bpf/progs/btf_type_tag.c b/tools/testing/selftests/bpf/progs/btf_type_tag.c
new file mode 100644
index 000000000000..0e18c777862c
--- /dev/null
+++ b/tools/testing/selftests/bpf/progs/btf_type_tag.c
@@ -0,0 +1,29 @@
+// SPDX-License-Identifier: GPL-2.0
+/* Copyright (c) 2021 Facebook */
+#include "vmlinux.h"
+#include <bpf/bpf_helpers.h>
+#include <bpf/bpf_tracing.h>
+
+#ifndef __has_attribute
+#define __has_attribute(x) 0
+#endif

is this necessary, doesn't the minimum Clang/GCC version that we
support have __has_attribute already?

No. It is not necessary. I just copy-pasted code from
https://clang.llvm.org/docs/LanguageExtensions.html#has-attribute

We recommend clang >= 11 for kernel. So above is indeed not
needed.


+
+#if __has_attribute(btf_type_tag)
+#define __tag1 __attribute__((btf_type_tag("tag1")))
+#define __tag2 __attribute__((btf_type_tag("tag2")))
+volatile const bool skip_tests = false;
+#else
+#define __tag1
+#define __tag2
+volatile const bool skip_tests = true;
+#endif
+
+struct btf_type_tag_test {
+       int __tag1 * __tag1 __tag2 *p;
+} g;
+
+SEC("fentry/bpf_fentry_test1")
+int BPF_PROG(sub, int x)
+{
+  return 0;
+}
--
2.30.2




[Index of Archives]     [Linux Samsung SoC]     [Linux Rockchip SoC]     [Linux Actions SoC]     [Linux for Synopsys ARC Processors]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]


  Powered by Linux