dwarves.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH dwarves v2 0/4] btf: support btf_type_tag attribute
@ 2021-11-23  4:56 Yonghong Song
  2021-11-23  4:56 ` [PATCH dwarves v2 1/4] libbpf: sync with latest libbpf repo Yonghong Song
                   ` (4 more replies)
  0 siblings, 5 replies; 11+ messages in thread
From: Yonghong Song @ 2021-11-23  4:56 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo, dwarves
  Cc: Alexei Starovoitov, Andrii Nakryiko, bpf, Daniel Borkmann, kernel-team

btf_type_tag is a new llvm type attribute which is used similar
to kernel __user/__rcu attributes. The format of btf_type_tag looks like
  __attribute__((btf_type_tag("tag1")))
For the case where the attribute applied to a pointee like
  #define __tag1 __attribute__((btf_type_tag("tag1")))
  #define __tag2 __attribute__((btf_type_tag("tag2")))
  int __tag1 * __tag1 __tag2 *g;
the information will be encoded in dwarf.

In BTF, the attribute is encoded as a new kind
BTF_KIND_TYPE_TAG and latest bpf-next supports it.

The patch added support in pahole, specifically
converts llvm dwarf btf_type_tag attributes to
BTF types. Please see individual patches for details.

Changelog:
  v1 -> v2:
     - reorg an if condition to reduce nesting level.
     - add more comments to explain how to chain type tag types.

Yonghong Song (4):
  libbpf: sync with latest libbpf repo
  dutil: move DW_TAG_LLVM_annotation definition to dutil.h
  dwarf_loader: support btf_type_tag attribute
  btf_encoder: support btf_type_tag attribute

 btf_encoder.c  |   7 +++
 dutil.h        |   4 ++
 dwarf_loader.c | 140 ++++++++++++++++++++++++++++++++++++++++++++++---
 dwarves.h      |  38 +++++++++++++-
 lib/bpf        |   2 +-
 pahole.c       |   8 +++
 6 files changed, 190 insertions(+), 9 deletions(-)

-- 
2.30.2


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH dwarves v2 1/4] libbpf: sync with latest libbpf repo
  2021-11-23  4:56 [PATCH dwarves v2 0/4] btf: support btf_type_tag attribute Yonghong Song
@ 2021-11-23  4:56 ` Yonghong Song
  2021-11-23  4:56 ` [PATCH dwarves v2 2/4] dutil: move DW_TAG_LLVM_annotation definition to dutil.h Yonghong Song
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 11+ messages in thread
From: Yonghong Song @ 2021-11-23  4:56 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo, dwarves
  Cc: Alexei Starovoitov, Andrii Nakryiko, bpf, Daniel Borkmann, kernel-team

Sync up to commit 94a49850c5ee ("Makefile: enforce gnu89 standard").
This is needed to support BTF_KIND_TYPE_TAG.

Signed-off-by: Yonghong Song <yhs@fb.com>
---
 lib/bpf | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/bpf b/lib/bpf
index f05791d..94a4985 160000
--- a/lib/bpf
+++ b/lib/bpf
@@ -1 +1 @@
-Subproject commit f05791d8cfcbbf9092b4099b9d011bb72e241ef8
+Subproject commit 94a49850c5ee61ea02dfcbabf48013391e8cecdf
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH dwarves v2 2/4] dutil: move DW_TAG_LLVM_annotation definition to dutil.h
  2021-11-23  4:56 [PATCH dwarves v2 0/4] btf: support btf_type_tag attribute Yonghong Song
  2021-11-23  4:56 ` [PATCH dwarves v2 1/4] libbpf: sync with latest libbpf repo Yonghong Song
@ 2021-11-23  4:56 ` Yonghong Song
  2021-11-23  4:56 ` [PATCH dwarves v2 3/4] dwarf_loader: support btf_type_tag attribute Yonghong Song
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 11+ messages in thread
From: Yonghong Song @ 2021-11-23  4:56 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo, dwarves
  Cc: Alexei Starovoitov, Andrii Nakryiko, bpf, Daniel Borkmann, kernel-team

Move DW_TAG_LLVM_annotation definition from dwarf_load.c to
dutil.h as it will be used later for btf_encoder.c.
There is no functionality change for this patch.

Signed-off-by: Yonghong Song <yhs@fb.com>
---
 dutil.h        | 4 ++++
 dwarf_loader.c | 4 ----
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/dutil.h b/dutil.h
index 25691ea..e45bba0 100644
--- a/dutil.h
+++ b/dutil.h
@@ -31,6 +31,10 @@
 
 #define roundup(x,y) ((((x) + ((y) - 1)) / (y)) * (y))
 
+#ifndef DW_TAG_LLVM_annotation
+#define DW_TAG_LLVM_annotation 0x6000
+#endif
+
 static inline __attribute__((const)) bool is_power_of_2(unsigned long n)
 {
         return (n != 0 && ((n & (n - 1)) == 0));
diff --git a/dwarf_loader.c b/dwarf_loader.c
index cf005da..1b07a62 100644
--- a/dwarf_loader.c
+++ b/dwarf_loader.c
@@ -52,10 +52,6 @@
 #define DW_OP_addrx 0xa1
 #endif
 
-#ifndef DW_TAG_LLVM_annotation
-#define DW_TAG_LLVM_annotation 0x6000
-#endif
-
 static pthread_mutex_t libdw__lock = PTHREAD_MUTEX_INITIALIZER;
 
 static uint32_t hashtags__bits = 12;
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH dwarves v2 3/4] dwarf_loader: support btf_type_tag attribute
  2021-11-23  4:56 [PATCH dwarves v2 0/4] btf: support btf_type_tag attribute Yonghong Song
  2021-11-23  4:56 ` [PATCH dwarves v2 1/4] libbpf: sync with latest libbpf repo Yonghong Song
  2021-11-23  4:56 ` [PATCH dwarves v2 2/4] dutil: move DW_TAG_LLVM_annotation definition to dutil.h Yonghong Song
@ 2021-11-23  4:56 ` Yonghong Song
  2021-11-23  4:56 ` [PATCH dwarves v2 4/4] btf_encoder: " Yonghong Song
  2021-11-23 18:32 ` [PATCH dwarves v2 0/4] btf: " Andrii Nakryiko
  4 siblings, 0 replies; 11+ messages in thread
From: Yonghong Song @ 2021-11-23  4:56 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo, dwarves
  Cc: Alexei Starovoitov, Andrii Nakryiko, bpf, Daniel Borkmann, kernel-team

LLVM patches ([1] for clang, [2] and [3] for BPF backend)
added support for btf_type_tag attributes. The following is
an example:
  [$ ~] cat t.c
  #define __tag1 __attribute__((btf_type_tag("tag1")))
  #define __tag2 __attribute__((btf_type_tag("tag2")))
  int __tag1 * __tag1 __tag2 *g __attribute__((section(".data..percpu")));
  [$ ~] clang -O2 -g -c t.c
  [$ ~] llvm-dwarfdump --debug-info t.o
  t.o:    file format elf64-x86-64
  ...
  0x0000001e:   DW_TAG_variable
                  DW_AT_name      ("g")
                  DW_AT_type      (0x00000033 "int **")
                  DW_AT_external  (true)
                  DW_AT_decl_file ("/home/yhs/t.c")
                  DW_AT_decl_line (3)
                  DW_AT_location  (DW_OP_addr 0x0)
  0x00000033:   DW_TAG_pointer_type
                  DW_AT_type      (0x0000004b "int *")
  0x00000038:     DW_TAG_LLVM_annotation
                    DW_AT_name    ("btf_type_tag")
                    DW_AT_const_value     ("tag1")
  0x00000041:     DW_TAG_LLVM_annotation
                    DW_AT_name    ("btf_type_tag")
                    DW_AT_const_value     ("tag2")
  0x0000004a:     NULL
  0x0000004b:   DW_TAG_pointer_type
                  DW_AT_type      (0x0000005a "int")
  0x00000050:     DW_TAG_LLVM_annotation
                    DW_AT_name    ("btf_type_tag")
                    DW_AT_const_value     ("tag1")
  0x00000059:     NULL
  0x0000005a:   DW_TAG_base_type
                  DW_AT_name      ("int")
                  DW_AT_encoding  (DW_ATE_signed)
                  DW_AT_byte_size (0x04)
  0x00000061:   NULL

From the above example, you can see that DW_TAG_pointer_type
may contain one or more DW_TAG_LLVM_annotation btf_type_tag tags.
If DW_TAG_LLVM_annotation tags are present inside
DW_TAG_pointer_type, for BTF encoding, pahole will need
to follow [3] to generate a type chain like
  var -> ptr -> tag2 -> tag1 -> ptr -> tag1 -> int

This patch implemented dwarf_loader support. If a pointer type
contains DW_TAG_LLVM_annotation tags, a new type
btf_type_tag_ptr_type will be created which will store
the pointer tag itself and all DW_TAG_LLVM_annotation tags.
During recoding stage, the type chain will be formed properly
based on the above example.

An option "--skip_encoding_btf_type_tag" is added to disable
this new functionality.

  [1] https://reviews.llvm.org/D111199
  [2] https://reviews.llvm.org/D113222
  [3] https://reviews.llvm.org/D113496
---
 dwarf_loader.c | 136 +++++++++++++++++++++++++++++++++++++++++++++++--
 dwarves.h      |  33 +++++++++++-
 pahole.c       |   8 +++
 3 files changed, 173 insertions(+), 4 deletions(-)

diff --git a/dwarf_loader.c b/dwarf_loader.c
index 1b07a62..e30b03c 100644
--- a/dwarf_loader.c
+++ b/dwarf_loader.c
@@ -1206,6 +1206,89 @@ static struct tag *die__create_new_tag(Dwarf_Die *die, struct cu *cu)
 	return tag;
 }
 
+static struct btf_type_tag_ptr_type *die__create_new_btf_type_tag_ptr_type(Dwarf_Die *die, struct cu *cu)
+{
+	struct btf_type_tag_ptr_type *tag;
+
+	tag  = tag__alloc_with_spec(cu, sizeof(struct btf_type_tag_ptr_type));
+	if (tag == NULL)
+		return NULL;
+
+	tag__init(&tag->tag, cu, die);
+	tag->tag.has_btf_type_tag = true;
+	INIT_LIST_HEAD(&tag->tags);
+	return tag;
+}
+
+static struct btf_type_tag_type *die__create_new_btf_type_tag_type(Dwarf_Die *die, struct cu *cu,
+								   struct conf_load *conf)
+{
+	struct btf_type_tag_type *tag;
+
+	tag  = tag__alloc_with_spec(cu, sizeof(struct btf_type_tag_type));
+	if (tag == NULL)
+		return NULL;
+
+	tag__init(&tag->tag, cu, die);
+	tag->value = attr_string(die, DW_AT_const_value, conf);
+	return tag;
+}
+
+static struct tag *die__create_new_pointer_tag(Dwarf_Die *die, struct cu *cu,
+					       struct conf_load *conf)
+{
+	struct btf_type_tag_ptr_type *tag = NULL;
+	struct btf_type_tag_type *annot;
+	Dwarf_Die *cdie, child;
+	const char *name;
+	uint32_t id;
+
+	/* If no child tags or skipping btf_type_tag encoding, just create a new tag
+	 * and return
+	 */
+	if (!dwarf_haschildren(die) || dwarf_child(die, &child) != 0 ||
+	    conf->skip_encoding_btf_type_tag)
+		return tag__new(die, cu);
+
+	/* Otherwise, check DW_TAG_LLVM_annotation child tags */
+	cdie = &child;
+	do {
+		if (dwarf_tag(cdie) != DW_TAG_LLVM_annotation)
+			continue;
+
+		/* Only check btf_type_tag annotations */
+		name = attr_string(cdie, DW_AT_name, conf);
+		if (strcmp(name, "btf_type_tag") != 0)
+			continue;
+
+		if (tag == NULL) {
+			/* Create a btf_type_tag_ptr type. */
+			tag = die__create_new_btf_type_tag_ptr_type(die, cu);
+			if (!tag)
+				return NULL;
+		}
+
+		/* Create a btf_type_tag type for this annotation. */
+		annot = die__create_new_btf_type_tag_type(cdie, cu, conf);
+		if (annot == NULL)
+			return NULL;
+
+		if (cu__table_add_tag(cu, &annot->tag, &id) < 0)
+			return NULL;
+
+		struct dwarf_tag *dtag = annot->tag.priv;
+		dtag->small_id = id;
+		cu__hash(cu, &annot->tag);
+
+		/* For a list of DW_TAG_LLVM_annotation like tag1 -> tag2 -> tag3,
+		 * the tag->tags contains tag3 -> tag2 -> tag1.
+		 */
+		list_add(&annot->node, &tag->tags);
+	} while (dwarf_siblingof(cdie, cdie) == 0);
+
+	return tag ? &tag->tag : tag__new(die, cu);
+}
+
 static struct tag *die__create_new_ptr_to_member_type(Dwarf_Die *die,
 						      struct cu *cu)
 {
@@ -1903,12 +1986,13 @@ static struct tag *__die__process_tag(Dwarf_Die *die, struct cu *cu,
 	case DW_TAG_const_type:
 	case DW_TAG_imported_declaration:
 	case DW_TAG_imported_module:
-	case DW_TAG_pointer_type:
 	case DW_TAG_reference_type:
 	case DW_TAG_restrict_type:
 	case DW_TAG_unspecified_type:
 	case DW_TAG_volatile_type:
 		tag = die__create_new_tag(die, cu);		break;
+	case DW_TAG_pointer_type:
+		tag = die__create_new_pointer_tag(die, cu, conf);	break;
 	case DW_TAG_ptr_to_member_type:
 		tag = die__create_new_ptr_to_member_type(die, cu); break;
 	case DW_TAG_enumeration_type:
@@ -2192,6 +2276,45 @@ static void lexblock__recode_dwarf_types(struct lexblock *tag, struct cu *cu)
 	}
 }
 
+static void dwarf_cu__recode_btf_type_tag_ptr(struct btf_type_tag_ptr_type *tag,
+					      uint32_t pointee_type)
+{
+	struct btf_type_tag_type *annot;
+	struct dwarf_tag *annot_dtag;
+	struct tag *prev_tag;
+
+	/* Given source like
+	 *   int tag1 tag2 tag3 *p;
+	 * the tag->tags contains tag3 -> tag2 -> tag1, the final type chain looks like:
+	 *   pointer -> tag3 -> tag2 -> tag1 -> pointee
+	 *
+	 * Basically it means
+	 *   - '*' applies to "int tag1 tag2 tag3"
+	 *   - tag3 applies to "int tag1 tag2"
+	 *   - tag2 applies to "int tag1"
+	 *   - tag1 applies to "int"
+	 *
+	 * This also makes final source code (format c) easier as we can do
+	 *   emit for "tag3 -> tag2 -> tag1 -> int"
+	 *   emit '*'
+	 *
+	 * For 'tag3 -> tag2 -> tag1 -> int":
+	 *   emit for "tag2 -> tag1 -> int"
+	 *   emit tag3
+	 *
+	 * Eventually we can get the source code like
+	 *   int tag1 tag2 tag3 *p;
+	 * and this matches the user/kernel code.
+	 */
+	prev_tag = &tag->tag;
+	list_for_each_entry(annot, &tag->tags, node) {
+		annot_dtag = annot->tag.priv;
+		prev_tag->type = annot_dtag->small_id;
+		prev_tag = &annot->tag;
+	}
+	prev_tag->type = pointee_type;
+}
+
 static int tag__recode_dwarf_type(struct tag *tag, struct cu *cu)
 {
 	struct dwarf_tag *dtag = tag->priv;
@@ -2301,7 +2424,10 @@ static int tag__recode_dwarf_type(struct tag *tag, struct cu *cu)
 	}
 
 	if (dtag->type.off == 0) {
-		tag->type = 0; /* void */
+		if (tag->tag != DW_TAG_pointer_type || !tag->has_btf_type_tag)
+			tag->type = 0; /* void */
+		else
+			dwarf_cu__recode_btf_type_tag_ptr(tag__btf_type_tag_ptr(tag), 0);
 		return 0;
 	}
 
@@ -2313,7 +2439,11 @@ check_type:
 		return 0;
 	}
 out:
-	tag->type = dtype->small_id;
+	if (tag->tag != DW_TAG_pointer_type || !tag->has_btf_type_tag)
+		tag->type = dtype->small_id;
+	else
+		dwarf_cu__recode_btf_type_tag_ptr(tag__btf_type_tag_ptr(tag), dtype->small_id);
+
 	return 0;
 }
 
diff --git a/dwarves.h b/dwarves.h
index 0d3e204..4425d3c 100644
--- a/dwarves.h
+++ b/dwarves.h
@@ -63,6 +63,7 @@ struct conf_load {
 	bool			ptr_table_stats;
 	bool			skip_encoding_btf_decl_tag;
 	bool			skip_missing;
+	bool			skip_encoding_btf_type_tag;
 	uint8_t			hashtable_bits;
 	uint8_t			max_hashtable_bits;
 	uint16_t		kabi_prefix_len;
@@ -413,6 +414,7 @@ struct tag {
 	uint16_t	 tag;
 	bool		 visited;
 	bool		 top_level;
+	bool		 has_btf_type_tag;
 	uint16_t	 recursivity_level;
 	void		 *priv;
 };
@@ -533,7 +535,8 @@ static inline int tag__is_tag_type(const struct tag *tag)
 	       tag->tag == DW_TAG_restrict_type ||
 	       tag->tag == DW_TAG_subroutine_type ||
 	       tag->tag == DW_TAG_unspecified_type ||
-	       tag->tag == DW_TAG_volatile_type;
+	       tag->tag == DW_TAG_volatile_type ||
+	       tag->tag == DW_TAG_LLVM_annotation;
 }
 
 static inline const char *tag__decl_file(const struct tag *tag,
@@ -606,6 +609,34 @@ struct llvm_annotation {
 	struct list_head	node;
 };
 
+/** struct btf_type_tag_type - representing a btf_type_tag annotation
+ *
+ * @tag   - DW_TAG_LLVM_annotation tag
+ * @value - btf_type_tag value string
+ * @node  - list_head node
+ */
+struct btf_type_tag_type {
+	struct tag		tag;
+	const char		*value;
+	struct list_head	node;
+};
+
+/** The struct btf_type_tag_ptr_type - type containing both pointer type and
+ *  its btf_type_tag annotations
+ *
+ * @tag  - pointer type tag
+ * @tags - btf_type_tag annotations for the pointer type
+ */
+struct btf_type_tag_ptr_type {
+	struct tag		tag;
+	struct list_head 	tags;
+};
+
+static inline struct btf_type_tag_ptr_type *tag__btf_type_tag_ptr(struct tag *tag)
+{
+	return (struct btf_type_tag_ptr_type *)tag;
+}
+
 /** struct namespace - base class for enums, structs, unions, typedefs, etc
  *
  * @tags - class_member, enumerators, etc
diff --git a/pahole.c b/pahole.c
index 5fc1cca..f3a51cb 100644
--- a/pahole.c
+++ b/pahole.c
@@ -1126,6 +1126,7 @@ ARGP_PROGRAM_VERSION_HOOK_DEF = dwarves_print_version;
 #define ARGP_devel_stats	   330
 #define ARGP_skip_encoding_btf_decl_tag 331
 #define ARGP_skip_missing          332
+#define ARGP_skip_encoding_btf_type_tag 333
 
 static const struct argp_option pahole__options[] = {
 	{
@@ -1506,6 +1507,11 @@ static const struct argp_option pahole__options[] = {
 		.key  = ARGP_skip_missing,
 		.doc = "skip missing types passed to -C rather than stop",
 	},
+	{
+		.name = "skip_encoding_btf_type_tag",
+		.key  = ARGP_skip_encoding_btf_type_tag,
+		.doc  = "Do not encode TAGs in BTF."
+	},
 	{
 		.name = NULL,
 	}
@@ -1658,6 +1664,8 @@ static error_t pahole__options_parser(int key, char *arg,
 		conf_load.skip_encoding_btf_decl_tag = true;	break;
 	case ARGP_skip_missing:
 		conf_load.skip_missing = true;          break;
+	case ARGP_skip_encoding_btf_type_tag:
+		conf_load.skip_encoding_btf_type_tag = true;	break;
 	default:
 		return ARGP_ERR_UNKNOWN;
 	}
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH dwarves v2 4/4] btf_encoder: support btf_type_tag attribute
  2021-11-23  4:56 [PATCH dwarves v2 0/4] btf: support btf_type_tag attribute Yonghong Song
                   ` (2 preceding siblings ...)
  2021-11-23  4:56 ` [PATCH dwarves v2 3/4] dwarf_loader: support btf_type_tag attribute Yonghong Song
@ 2021-11-23  4:56 ` Yonghong Song
  2021-11-23 18:32 ` [PATCH dwarves v2 0/4] btf: " Andrii Nakryiko
  4 siblings, 0 replies; 11+ messages in thread
From: Yonghong Song @ 2021-11-23  4:56 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo, dwarves
  Cc: Alexei Starovoitov, Andrii Nakryiko, bpf, Daniel Borkmann, kernel-team

The following is an example.
  [$ ~] cat t.c
  #define __tag1 __attribute__((btf_type_tag("tag1")))
  #define __tag2 __attribute__((btf_type_tag("tag2")))
  int __tag1 * __tag1 __tag2 *g __attribute__((section(".data..percpu")));
  [$ ~] clang -O2 -g -c t.c
  [$ ~] pahole -JV t.o
  Found per-CPU symbol 'g' at address 0x0
  Found 1 per-CPU variables!
  File t.o:
  [1] TYPE_TAG tag1 type_id=5
  [2] TYPE_TAG tag2 type_id=1
  [3] PTR (anon) type_id=2
  [4] TYPE_TAG tag1 type_id=6
  [5] PTR (anon) type_id=4
  [6] INT int size=4 nr_bits=32 encoding=SIGNED
  search cu 't.c' for percpu global variables.
  Variable 'g' from CU 't.c' at address 0x0 encoded
  [7] VAR g type=3 linkage=1
  [8] DATASEC .data..percpu size=8 vlen=1
          type=7 offset=0 size=8
  [$ ~]

You can see for the source
  int __tag1 * __tag1 __tag2 *g __attribute__((section(".data..percpu")));
the following type chain is generated:
  var -> ptr -> tag2 -> tag1 -> ptr -> tag1 -> int

The following shows pahole option "--skip_encoding_btf_type_tag"
can prevent BTF_KIND_TYPE_TAG generation.
  [$ ~] pahole -JV t.o --skip_encoding_btf_type_tag
  Found per-CPU symbol 'g' at address 0x0
  Found 1 per-CPU variables!
  File t.o:
  [1] PTR (anon) type_id=2
  [2] PTR (anon) type_id=3
  [3] INT int size=4 nr_bits=32 encoding=SIGNED
  search cu 't.c' for percpu global variables.
  Variable 'g' from CU 't.c' at address 0x0 encoded
  [4] VAR g type=1 linkage=1
  [5] DATASEC .data..percpu size=8 vlen=1
          type=4 offset=0 size=8
  [$ ~]

Signed-off-by: Yonghong Song <yhs@fb.com>
---
 btf_encoder.c | 7 +++++++
 dwarves.h     | 5 +++++
 2 files changed, 12 insertions(+)

diff --git a/btf_encoder.c b/btf_encoder.c
index 117656e..9d015f3 100644
--- a/btf_encoder.c
+++ b/btf_encoder.c
@@ -143,6 +143,7 @@ static const char * const btf_kind_str[NR_BTF_KINDS] = {
 	[BTF_KIND_DATASEC]      = "DATASEC",
 	[BTF_KIND_FLOAT]        = "FLOAT",
 	[BTF_KIND_DECL_TAG]     = "DECL_TAG",
+	[BTF_KIND_TYPE_TAG]     = "TYPE_TAG",
 };
 
 static const char *btf__printable_name(const struct btf *btf, uint32_t offset)
@@ -393,6 +394,9 @@ static int32_t btf_encoder__add_ref_type(struct btf_encoder *encoder, uint16_t k
 	case BTF_KIND_TYPEDEF:
 		id = btf__add_typedef(btf, name, type);
 		break;
+	case BTF_KIND_TYPE_TAG:
+		id = btf__add_type_tag(btf, name, type);
+		break;
 	case BTF_KIND_FWD:
 		id = btf__add_fwd(btf, name, kind_flag);
 		break;
@@ -862,6 +866,9 @@ static int btf_encoder__encode_tag(struct btf_encoder *encoder, struct tag *tag,
 	case DW_TAG_typedef:
 		name = namespace__name(tag__namespace(tag));
 		return btf_encoder__add_ref_type(encoder, BTF_KIND_TYPEDEF, ref_type_id, name, false);
+	case DW_TAG_LLVM_annotation:
+		name = tag__btf_type_tag(tag)->value;
+		return btf_encoder__add_ref_type(encoder, BTF_KIND_TYPE_TAG, ref_type_id, name, false);
 	case DW_TAG_structure_type:
 	case DW_TAG_union_type:
 	case DW_TAG_class_type:
diff --git a/dwarves.h b/dwarves.h
index 4425d3c..52d162d 100644
--- a/dwarves.h
+++ b/dwarves.h
@@ -637,6 +637,11 @@ static inline struct btf_type_tag_ptr_type *tag__btf_type_tag_ptr(struct tag *ta
 	return (struct btf_type_tag_ptr_type *)tag;
 }
 
+static inline struct btf_type_tag_type *tag__btf_type_tag(struct tag *tag)
+{
+	return (struct btf_type_tag_type *)tag;
+}
+
 /** struct namespace - base class for enums, structs, unions, typedefs, etc
  *
  * @tags - class_member, enumerators, etc
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH dwarves v2 0/4] btf: support btf_type_tag attribute
  2021-11-23  4:56 [PATCH dwarves v2 0/4] btf: support btf_type_tag attribute Yonghong Song
                   ` (3 preceding siblings ...)
  2021-11-23  4:56 ` [PATCH dwarves v2 4/4] btf_encoder: " Yonghong Song
@ 2021-11-23 18:32 ` Andrii Nakryiko
  2021-11-23 23:36   ` Arnaldo Carvalho de Melo
  4 siblings, 1 reply; 11+ messages in thread
From: Andrii Nakryiko @ 2021-11-23 18:32 UTC (permalink / raw)
  To: Yonghong Song
  Cc: Arnaldo Carvalho de Melo, dwarves, Alexei Starovoitov,
	Andrii Nakryiko, bpf, Daniel Borkmann, Kernel Team

On Mon, Nov 22, 2021 at 8:56 PM Yonghong Song <yhs@fb.com> wrote:
>
> btf_type_tag is a new llvm type attribute which is used similar
> to kernel __user/__rcu attributes. The format of btf_type_tag looks like
>   __attribute__((btf_type_tag("tag1")))
> For the case where the attribute applied to a pointee like
>   #define __tag1 __attribute__((btf_type_tag("tag1")))
>   #define __tag2 __attribute__((btf_type_tag("tag2")))
>   int __tag1 * __tag1 __tag2 *g;
> the information will be encoded in dwarf.
>
> In BTF, the attribute is encoded as a new kind
> BTF_KIND_TYPE_TAG and latest bpf-next supports it.
>
> The patch added support in pahole, specifically
> converts llvm dwarf btf_type_tag attributes to
> BTF types. Please see individual patches for details.
>
> Changelog:
>   v1 -> v2:
>      - reorg an if condition to reduce nesting level.
>      - add more comments to explain how to chain type tag types.
>
> Yonghong Song (4):
>   libbpf: sync with latest libbpf repo
>   dutil: move DW_TAG_LLVM_annotation definition to dutil.h
>   dwarf_loader: support btf_type_tag attribute
>   btf_encoder: support btf_type_tag attribute
>

I thought that v1 was already applied, but either way LGTM. I'm not
super familiar with the DWARF loader parts, so I mostly just read it
very superficially :)

Acked-by: Andrii Nakryiko <andrii@kernel.org>


>  btf_encoder.c  |   7 +++
>  dutil.h        |   4 ++
>  dwarf_loader.c | 140 ++++++++++++++++++++++++++++++++++++++++++++++---
>  dwarves.h      |  38 +++++++++++++-
>  lib/bpf        |   2 +-
>  pahole.c       |   8 +++
>  6 files changed, 190 insertions(+), 9 deletions(-)
>
> --
> 2.30.2
>

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH dwarves v2 0/4] btf: support btf_type_tag attribute
  2021-11-23 18:32 ` [PATCH dwarves v2 0/4] btf: " Andrii Nakryiko
@ 2021-11-23 23:36   ` Arnaldo Carvalho de Melo
  2021-11-24  3:56     ` Yonghong Song
  2021-11-24  4:49     ` Andrii Nakryiko
  0 siblings, 2 replies; 11+ messages in thread
From: Arnaldo Carvalho de Melo @ 2021-11-23 23:36 UTC (permalink / raw)
  To: Andrii Nakryiko
  Cc: Yonghong Song, Arnaldo Carvalho de Melo, dwarves,
	Alexei Starovoitov, Andrii Nakryiko, bpf, Daniel Borkmann,
	Kernel Team

Em Tue, Nov 23, 2021 at 10:32:18AM -0800, Andrii Nakryiko escreveu:
> On Mon, Nov 22, 2021 at 8:56 PM Yonghong Song <yhs@fb.com> wrote:
> >
> > btf_type_tag is a new llvm type attribute which is used similar
> > to kernel __user/__rcu attributes. The format of btf_type_tag looks like
> >   __attribute__((btf_type_tag("tag1")))
> > For the case where the attribute applied to a pointee like
> >   #define __tag1 __attribute__((btf_type_tag("tag1")))
> >   #define __tag2 __attribute__((btf_type_tag("tag2")))
> >   int __tag1 * __tag1 __tag2 *g;
> > the information will be encoded in dwarf.
> >
> > In BTF, the attribute is encoded as a new kind
> > BTF_KIND_TYPE_TAG and latest bpf-next supports it.
> >
> > The patch added support in pahole, specifically
> > converts llvm dwarf btf_type_tag attributes to
> > BTF types. Please see individual patches for details.
> >
> > Changelog:
> >   v1 -> v2:
> >      - reorg an if condition to reduce nesting level.
> >      - add more comments to explain how to chain type tag types.
> >
> > Yonghong Song (4):
> >   libbpf: sync with latest libbpf repo
> >   dutil: move DW_TAG_LLVM_annotation definition to dutil.h
> >   dwarf_loader: support btf_type_tag attribute
> >   btf_encoder: support btf_type_tag attribute
> >
> 
> I thought that v1 was already applied, but either way LGTM. I'm not

To the next branch, and the libbpf pahole CI is failing, since a few
days, can you please take a look?

> super familiar with the DWARF loader parts, so I mostly just read it
> very superficially :)

I replaced the patches that changed, re-added the S-o-B for Yonghong and
tested it with llvm-project HEAD.

> Acked-by: Andrii Nakryiko <andrii@kernel.org>

Adding it to the csets.

Thanks!

- Arnaldo
 
> 
> >  btf_encoder.c  |   7 +++
> >  dutil.h        |   4 ++
> >  dwarf_loader.c | 140 ++++++++++++++++++++++++++++++++++++++++++++++---
> >  dwarves.h      |  38 +++++++++++++-
> >  lib/bpf        |   2 +-
> >  pahole.c       |   8 +++
> >  6 files changed, 190 insertions(+), 9 deletions(-)
> >
> > --
> > 2.30.2
> >

-- 

- Arnaldo

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH dwarves v2 0/4] btf: support btf_type_tag attribute
  2021-11-23 23:36   ` Arnaldo Carvalho de Melo
@ 2021-11-24  3:56     ` Yonghong Song
  2021-11-24  4:49     ` Andrii Nakryiko
  1 sibling, 0 replies; 11+ messages in thread
From: Yonghong Song @ 2021-11-24  3:56 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo, Andrii Nakryiko
  Cc: Arnaldo Carvalho de Melo, dwarves, Alexei Starovoitov,
	Andrii Nakryiko, bpf, Daniel Borkmann, Kernel Team



On 11/23/21 3:36 PM, Arnaldo Carvalho de Melo wrote:
> Em Tue, Nov 23, 2021 at 10:32:18AM -0800, Andrii Nakryiko escreveu:
>> On Mon, Nov 22, 2021 at 8:56 PM Yonghong Song <yhs@fb.com> wrote:
>>>
>>> btf_type_tag is a new llvm type attribute which is used similar
>>> to kernel __user/__rcu attributes. The format of btf_type_tag looks like
>>>    __attribute__((btf_type_tag("tag1")))
>>> For the case where the attribute applied to a pointee like
>>>    #define __tag1 __attribute__((btf_type_tag("tag1")))
>>>    #define __tag2 __attribute__((btf_type_tag("tag2")))
>>>    int __tag1 * __tag1 __tag2 *g;
>>> the information will be encoded in dwarf.
>>>
>>> In BTF, the attribute is encoded as a new kind
>>> BTF_KIND_TYPE_TAG and latest bpf-next supports it.
>>>
>>> The patch added support in pahole, specifically
>>> converts llvm dwarf btf_type_tag attributes to
>>> BTF types. Please see individual patches for details.
>>>
>>> Changelog:
>>>    v1 -> v2:
>>>       - reorg an if condition to reduce nesting level.
>>>       - add more comments to explain how to chain type tag types.
>>>
>>> Yonghong Song (4):
>>>    libbpf: sync with latest libbpf repo
>>>    dutil: move DW_TAG_LLVM_annotation definition to dutil.h
>>>    dwarf_loader: support btf_type_tag attribute
>>>    btf_encoder: support btf_type_tag attribute
>>>
>>
>> I thought that v1 was already applied, but either way LGTM. I'm not
> 
> To the next branch, and the libbpf pahole CI is failing, since a few
> days, can you please take a look?
> 
>> super familiar with the DWARF loader parts, so I mostly just read it
>> very superficially :)
> 
> I replaced the patches that changed, re-added the S-o-B for Yonghong and
> tested it with llvm-project HEAD.

Thanks Arnaldo!

> 
>> Acked-by: Andrii Nakryiko <andrii@kernel.org>
> 
> Adding it to the csets.
> 
> Thanks!
> 
> - Arnaldo
>   
>>
>>>   btf_encoder.c  |   7 +++
>>>   dutil.h        |   4 ++
>>>   dwarf_loader.c | 140 ++++++++++++++++++++++++++++++++++++++++++++++---
>>>   dwarves.h      |  38 +++++++++++++-
>>>   lib/bpf        |   2 +-
>>>   pahole.c       |   8 +++
>>>   6 files changed, 190 insertions(+), 9 deletions(-)
>>>
>>> --
>>> 2.30.2
>>>
> 

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH dwarves v2 0/4] btf: support btf_type_tag attribute
  2021-11-23 23:36   ` Arnaldo Carvalho de Melo
  2021-11-24  3:56     ` Yonghong Song
@ 2021-11-24  4:49     ` Andrii Nakryiko
  2021-11-25 21:33       ` Arnaldo Carvalho de Melo
  1 sibling, 1 reply; 11+ messages in thread
From: Andrii Nakryiko @ 2021-11-24  4:49 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: Yonghong Song, Arnaldo Carvalho de Melo, dwarves,
	Alexei Starovoitov, Andrii Nakryiko, bpf, Daniel Borkmann,
	Kernel Team

On Tue, Nov 23, 2021 at 3:36 PM Arnaldo Carvalho de Melo
<acme@kernel.org> wrote:
>
> Em Tue, Nov 23, 2021 at 10:32:18AM -0800, Andrii Nakryiko escreveu:
> > On Mon, Nov 22, 2021 at 8:56 PM Yonghong Song <yhs@fb.com> wrote:
> > >
> > > btf_type_tag is a new llvm type attribute which is used similar
> > > to kernel __user/__rcu attributes. The format of btf_type_tag looks like
> > >   __attribute__((btf_type_tag("tag1")))
> > > For the case where the attribute applied to a pointee like
> > >   #define __tag1 __attribute__((btf_type_tag("tag1")))
> > >   #define __tag2 __attribute__((btf_type_tag("tag2")))
> > >   int __tag1 * __tag1 __tag2 *g;
> > > the information will be encoded in dwarf.
> > >
> > > In BTF, the attribute is encoded as a new kind
> > > BTF_KIND_TYPE_TAG and latest bpf-next supports it.
> > >
> > > The patch added support in pahole, specifically
> > > converts llvm dwarf btf_type_tag attributes to
> > > BTF types. Please see individual patches for details.
> > >
> > > Changelog:
> > >   v1 -> v2:
> > >      - reorg an if condition to reduce nesting level.
> > >      - add more comments to explain how to chain type tag types.
> > >
> > > Yonghong Song (4):
> > >   libbpf: sync with latest libbpf repo
> > >   dutil: move DW_TAG_LLVM_annotation definition to dutil.h
> > >   dwarf_loader: support btf_type_tag attribute
> > >   btf_encoder: support btf_type_tag attribute
> > >
> >
> > I thought that v1 was already applied, but either way LGTM. I'm not
>
> To the next branch, and the libbpf pahole CI is failing, since a few
> days, can you please take a look?

We've had Clang regression which Yonghong fixed very quickly, but then
we were blocked on Clang nightly builds being broken for days. Seems
like we got a new Clang today, so hopefully libbpf CI will be back to
green again.

>
> > super familiar with the DWARF loader parts, so I mostly just read it
> > very superficially :)
>
> I replaced the patches that changed, re-added the S-o-B for Yonghong and
> tested it with llvm-project HEAD.
>
> > Acked-by: Andrii Nakryiko <andrii@kernel.org>
>
> Adding it to the csets.
>
> Thanks!
>
> - Arnaldo
>
> >
> > >  btf_encoder.c  |   7 +++
> > >  dutil.h        |   4 ++
> > >  dwarf_loader.c | 140 ++++++++++++++++++++++++++++++++++++++++++++++---
> > >  dwarves.h      |  38 +++++++++++++-
> > >  lib/bpf        |   2 +-
> > >  pahole.c       |   8 +++
> > >  6 files changed, 190 insertions(+), 9 deletions(-)
> > >
> > > --
> > > 2.30.2
> > >
>
> --
>
> - Arnaldo

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH dwarves v2 0/4] btf: support btf_type_tag attribute
  2021-11-24  4:49     ` Andrii Nakryiko
@ 2021-11-25 21:33       ` Arnaldo Carvalho de Melo
  2021-11-26  5:37         ` Yonghong Song
  0 siblings, 1 reply; 11+ messages in thread
From: Arnaldo Carvalho de Melo @ 2021-11-25 21:33 UTC (permalink / raw)
  To: Andrii Nakryiko
  Cc: Yonghong Song, Arnaldo Carvalho de Melo, dwarves,
	Alexei Starovoitov, Andrii Nakryiko, bpf, Daniel Borkmann,
	Kernel Team

Em Tue, Nov 23, 2021 at 08:49:17PM -0800, Andrii Nakryiko escreveu:
> On Tue, Nov 23, 2021 at 3:36 PM Arnaldo Carvalho de Melo
> <acme@kernel.org> wrote:
> >
> > Em Tue, Nov 23, 2021 at 10:32:18AM -0800, Andrii Nakryiko escreveu:
> > > On Mon, Nov 22, 2021 at 8:56 PM Yonghong Song <yhs@fb.com> wrote:
> > > >
> > > > btf_type_tag is a new llvm type attribute which is used similar
> > > > to kernel __user/__rcu attributes. The format of btf_type_tag looks like
> > > >   __attribute__((btf_type_tag("tag1")))
> > > > For the case where the attribute applied to a pointee like
> > > >   #define __tag1 __attribute__((btf_type_tag("tag1")))
> > > >   #define __tag2 __attribute__((btf_type_tag("tag2")))
> > > >   int __tag1 * __tag1 __tag2 *g;
> > > > the information will be encoded in dwarf.
> > > >
> > > > In BTF, the attribute is encoded as a new kind
> > > > BTF_KIND_TYPE_TAG and latest bpf-next supports it.
> > > >
> > > > The patch added support in pahole, specifically
> > > > converts llvm dwarf btf_type_tag attributes to
> > > > BTF types. Please see individual patches for details.
> > > >
> > > > Changelog:
> > > >   v1 -> v2:
> > > >      - reorg an if condition to reduce nesting level.
> > > >      - add more comments to explain how to chain type tag types.
> > > >
> > > > Yonghong Song (4):
> > > >   libbpf: sync with latest libbpf repo
> > > >   dutil: move DW_TAG_LLVM_annotation definition to dutil.h
> > > >   dwarf_loader: support btf_type_tag attribute
> > > >   btf_encoder: support btf_type_tag attribute
> > > >
> > >
> > > I thought that v1 was already applied, but either way LGTM. I'm not
> >
> > To the next branch, and the libbpf pahole CI is failing, since a few
> > days, can you please take a look?
> 
> We've had Clang regression which Yonghong fixed very quickly, but then
> we were blocked on Clang nightly builds being broken for days. Seems
> like we got a new Clang today, so hopefully libbpf CI will be back to
> green again.

It is back to green, so I moved next to master, i.e. this series is now
on master.

- Arnaldo
 
> >
> > > super familiar with the DWARF loader parts, so I mostly just read it
> > > very superficially :)
> >
> > I replaced the patches that changed, re-added the S-o-B for Yonghong and
> > tested it with llvm-project HEAD.
> >
> > > Acked-by: Andrii Nakryiko <andrii@kernel.org>
> >
> > Adding it to the csets.
> >
> > Thanks!
> >
> > - Arnaldo
> >
> > >
> > > >  btf_encoder.c  |   7 +++
> > > >  dutil.h        |   4 ++
> > > >  dwarf_loader.c | 140 ++++++++++++++++++++++++++++++++++++++++++++++---
> > > >  dwarves.h      |  38 +++++++++++++-
> > > >  lib/bpf        |   2 +-
> > > >  pahole.c       |   8 +++
> > > >  6 files changed, 190 insertions(+), 9 deletions(-)
> > > >
> > > > --
> > > > 2.30.2
> > > >
> >
> > --
> >
> > - Arnaldo

-- 

- Arnaldo

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH dwarves v2 0/4] btf: support btf_type_tag attribute
  2021-11-25 21:33       ` Arnaldo Carvalho de Melo
@ 2021-11-26  5:37         ` Yonghong Song
  0 siblings, 0 replies; 11+ messages in thread
From: Yonghong Song @ 2021-11-26  5:37 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo, Andrii Nakryiko
  Cc: Arnaldo Carvalho de Melo, dwarves, Alexei Starovoitov,
	Andrii Nakryiko, bpf, Daniel Borkmann, Kernel Team



On 11/25/21 1:33 PM, Arnaldo Carvalho de Melo wrote:
> Em Tue, Nov 23, 2021 at 08:49:17PM -0800, Andrii Nakryiko escreveu:
>> On Tue, Nov 23, 2021 at 3:36 PM Arnaldo Carvalho de Melo
>> <acme@kernel.org> wrote:
>>>
>>> Em Tue, Nov 23, 2021 at 10:32:18AM -0800, Andrii Nakryiko escreveu:
>>>> On Mon, Nov 22, 2021 at 8:56 PM Yonghong Song <yhs@fb.com> wrote:
>>>>>
>>>>> btf_type_tag is a new llvm type attribute which is used similar
>>>>> to kernel __user/__rcu attributes. The format of btf_type_tag looks like
>>>>>    __attribute__((btf_type_tag("tag1")))
>>>>> For the case where the attribute applied to a pointee like
>>>>>    #define __tag1 __attribute__((btf_type_tag("tag1")))
>>>>>    #define __tag2 __attribute__((btf_type_tag("tag2")))
>>>>>    int __tag1 * __tag1 __tag2 *g;
>>>>> the information will be encoded in dwarf.
>>>>>
>>>>> In BTF, the attribute is encoded as a new kind
>>>>> BTF_KIND_TYPE_TAG and latest bpf-next supports it.
>>>>>
>>>>> The patch added support in pahole, specifically
>>>>> converts llvm dwarf btf_type_tag attributes to
>>>>> BTF types. Please see individual patches for details.
>>>>>
>>>>> Changelog:
>>>>>    v1 -> v2:
>>>>>       - reorg an if condition to reduce nesting level.
>>>>>       - add more comments to explain how to chain type tag types.
>>>>>
>>>>> Yonghong Song (4):
>>>>>    libbpf: sync with latest libbpf repo
>>>>>    dutil: move DW_TAG_LLVM_annotation definition to dutil.h
>>>>>    dwarf_loader: support btf_type_tag attribute
>>>>>    btf_encoder: support btf_type_tag attribute
>>>>>
>>>>
>>>> I thought that v1 was already applied, but either way LGTM. I'm not
>>>
>>> To the next branch, and the libbpf pahole CI is failing, since a few
>>> days, can you please take a look?
>>
>> We've had Clang regression which Yonghong fixed very quickly, but then
>> we were blocked on Clang nightly builds being broken for days. Seems
>> like we got a new Clang today, so hopefully libbpf CI will be back to
>> green again.
> 
> It is back to green, so I moved next to master, i.e. this series is now
> on master.

Arnaldo,

Is it possible that we could cut a pahole release in the near future?
My kernel using btf_type_tag patch ([1]) needs a pahole version check. 
In old pahole versions, a warning about pointer type subtags not 
supported will be emitted and btf_type_tag attributes (as pointer type 
subtags) will be ignored.

   [1] https://lore.kernel.org/bpf/20211118184810.1846996-1-yhs@fb.com/

Thanks!

> 
> - Arnaldo
>   
>>>
>>>> super familiar with the DWARF loader parts, so I mostly just read it
>>>> very superficially :)
>>>
>>> I replaced the patches that changed, re-added the S-o-B for Yonghong and
>>> tested it with llvm-project HEAD.
>>>
>>>> Acked-by: Andrii Nakryiko <andrii@kernel.org>
>>>
>>> Adding it to the csets.
>>>
>>> Thanks!
>>>
>>> - Arnaldo
>>>
>>>>
>>>>>   btf_encoder.c  |   7 +++
>>>>>   dutil.h        |   4 ++
>>>>>   dwarf_loader.c | 140 ++++++++++++++++++++++++++++++++++++++++++++++---
>>>>>   dwarves.h      |  38 +++++++++++++-
>>>>>   lib/bpf        |   2 +-
>>>>>   pahole.c       |   8 +++
>>>>>   6 files changed, 190 insertions(+), 9 deletions(-)
>>>>>
>>>>> --
>>>>> 2.30.2
>>>>>
>>>
>>> --
>>>
>>> - Arnaldo
> 

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2021-11-26  5:40 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-11-23  4:56 [PATCH dwarves v2 0/4] btf: support btf_type_tag attribute Yonghong Song
2021-11-23  4:56 ` [PATCH dwarves v2 1/4] libbpf: sync with latest libbpf repo Yonghong Song
2021-11-23  4:56 ` [PATCH dwarves v2 2/4] dutil: move DW_TAG_LLVM_annotation definition to dutil.h Yonghong Song
2021-11-23  4:56 ` [PATCH dwarves v2 3/4] dwarf_loader: support btf_type_tag attribute Yonghong Song
2021-11-23  4:56 ` [PATCH dwarves v2 4/4] btf_encoder: " Yonghong Song
2021-11-23 18:32 ` [PATCH dwarves v2 0/4] btf: " Andrii Nakryiko
2021-11-23 23:36   ` Arnaldo Carvalho de Melo
2021-11-24  3:56     ` Yonghong Song
2021-11-24  4:49     ` Andrii Nakryiko
2021-11-25 21:33       ` Arnaldo Carvalho de Melo
2021-11-26  5:37         ` Yonghong Song

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).