* [PATCH dwarves v3 0/2] btf: support BTF_KIND_ENUM64
@ 2022-06-29 7:12 Yonghong Song
2022-06-29 7:12 ` [PATCH dwarves v3 1/2] libbpf: Sync with latest libbpf repo Yonghong Song
` (3 more replies)
0 siblings, 4 replies; 10+ messages in thread
From: Yonghong Song @ 2022-06-29 7:12 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo, dwarves
Cc: Alexei Starovoitov, Andrii Nakryiko, bpf, Daniel Borkmann, kernel-team
Add support for enum64. For 64-bit enumerator value,
previously, the value is truncated into 32bit, e.g.,
for the following enum in linux uapi bpf.h,
enum {
BPF_F_INDEX_MASK = 0xffffffffULL,
BPF_F_CURRENT_CPU = BPF_F_INDEX_MASK,
/* BPF_FUNC_perf_event_output for sk_buff input context. */
BPF_F_CTXLEN_MASK = (0xfffffULL << 32),
};
BPF_F_CTXLEN_MASK will be encoded with 0 with BTF_KIND_ENUM
after pahole dwarf-to-btf conversion.
With this patch, the BPF_F_CTXLEN_MASK will be encoded properly
with BTF_KIND_ENUM64.
This patch is on top of tmp.master since tmp.master has not
been sync'ed with master branch yet.
Changelogs:
v2 -> v3:
- pass struct type/conf_load pointers to btf_encoder__add_enum[_value]
to make code easier to understand.
v1 -> v2:
- Add flag --skip_encoding_btf_enum64 to disable newly-added functionality.
Yonghong Song (2):
libbpf: Sync with latest libbpf repo
btf: Support BTF_KIND_ENUM64
btf_encoder.c | 67 +++++++++++++++++++++++++++++++++++------------
btf_encoder.h | 2 +-
dwarf_loader.c | 12 +++++++++
dwarves.h | 4 ++-
dwarves_fprintf.c | 6 ++++-
lib/bpf | 2 +-
pahole.c | 10 ++++++-
7 files changed, 81 insertions(+), 22 deletions(-)
--
2.30.2
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH dwarves v3 1/2] libbpf: Sync with latest libbpf repo
2022-06-29 7:12 [PATCH dwarves v3 0/2] btf: support BTF_KIND_ENUM64 Yonghong Song
@ 2022-06-29 7:12 ` Yonghong Song
2022-06-29 7:12 ` [PATCH dwarves v3 2/2] btf: Support BTF_KIND_ENUM64 Yonghong Song
` (2 subsequent siblings)
3 siblings, 0 replies; 10+ messages in thread
From: Yonghong Song @ 2022-06-29 7:12 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo, dwarves
Cc: Alexei Starovoitov, Andrii Nakryiko, bpf, Daniel Borkmann, kernel-team
Sync up to commit
645500dd7d2d ci: blacklist mptcp test on s390x
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 87dff0a..645500d 160000
--- a/lib/bpf
+++ b/lib/bpf
@@ -1 +1 @@
-Subproject commit 87dff0a2c775c5943ca9233e69c81a25f2ed1a77
+Subproject commit 645500dd7d2d6b5bb76e4c0375d597d4f0c4814e
--
2.30.2
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH dwarves v3 2/2] btf: Support BTF_KIND_ENUM64
2022-06-29 7:12 [PATCH dwarves v3 0/2] btf: support BTF_KIND_ENUM64 Yonghong Song
2022-06-29 7:12 ` [PATCH dwarves v3 1/2] libbpf: Sync with latest libbpf repo Yonghong Song
@ 2022-06-29 7:12 ` Yonghong Song
2022-06-29 19:12 ` Arnaldo Carvalho de Melo
2022-06-29 13:16 ` [PATCH dwarves v3 0/2] btf: support BTF_KIND_ENUM64 Arnaldo Carvalho de Melo
2022-06-29 21:44 ` Arnaldo Carvalho de Melo
3 siblings, 1 reply; 10+ messages in thread
From: Yonghong Song @ 2022-06-29 7:12 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo, dwarves
Cc: Alexei Starovoitov, Andrii Nakryiko, bpf, Daniel Borkmann, kernel-team
BTF_KIND_ENUM64 is supported with latest libbpf, which
supports 64-bit enum values. Latest libbpf also supports
signedness for enum values. Add enum64 support in
dwarf-to-btf conversion.
The following is an example of new encoding which covers
signed/unsigned enum64/enum variations.
$cat t.c
enum { /* signed, enum64 */
A = -1,
B = 0xffffffff,
} g1;
enum { /* unsigned, enum64 */
C = 1,
D = 0xfffffffff,
} g2;
enum { /* signed, enum */
E = -1,
F = 0xfffffff,
} g3;
enum { /* unsigned, enum */
G = 1,
H = 0xfffffff,
} g4;
$ clang -g -c t.c
$ pahole -JV t.o
btf_encoder__new: 't.o' doesn't have '.data..percpu' section
Found 0 per-CPU variables!
File t.o:
[1] ENUM64 (anon) size=8
A val=-1
B val=4294967295
[2] INT long size=8 nr_bits=64 encoding=SIGNED
[3] ENUM64 (anon) size=8
C val=1
D val=68719476735
[4] INT unsigned long size=8 nr_bits=64 encoding=(none)
[5] ENUM (anon) size=4
E val=-1
F val=268435455
[6] INT int size=4 nr_bits=32 encoding=SIGNED
[7] ENUM (anon) size=4
G val=1
H val=268435455
[8] INT unsigned int size=4 nr_bits=32 encoding=(none)
With the flag to skip enum64 encoding,
$ pahole -JV t.o --skip_encoding_btf_enum64
btf_encoder__new: 't.o' doesn't have '.data..percpu' section
Found 0 per-CPU variables!
File t.o:
[1] ENUM (anon) size=8
A val=4294967295
B val=4294967295
[2] INT long size=8 nr_bits=64 encoding=SIGNED
[3] ENUM (anon) size=8
C val=1
D val=4294967295
[4] INT unsigned long size=8 nr_bits=64 encoding=(none)
[5] ENUM (anon) size=4
E val=4294967295
F val=268435455
[6] INT int size=4 nr_bits=32 encoding=SIGNED
[7] ENUM (anon) size=4
G val=1
H val=268435455
[8] INT unsigned int size=4 nr_bits=32 encoding=(none)
In the above btf encoding without enum64, all enum types
with the same type size as the corresponding enum64. All these
enum types have unsigned type (kflag = 0) which is required
before kernel enum64 support.
Acked-by: Andrii Nakryiko <andrii@kernel.org>
Signed-off-by: Yonghong Song <yhs@fb.com>
---
btf_encoder.c | 67 +++++++++++++++++++++++++++++++++++------------
btf_encoder.h | 2 +-
dwarf_loader.c | 12 +++++++++
dwarves.h | 4 ++-
dwarves_fprintf.c | 6 ++++-
pahole.c | 10 ++++++-
6 files changed, 80 insertions(+), 21 deletions(-)
diff --git a/btf_encoder.c b/btf_encoder.c
index 9e708e4..daa8e3b 100644
--- a/btf_encoder.c
+++ b/btf_encoder.c
@@ -144,6 +144,7 @@ static const char * const btf_kind_str[NR_BTF_KINDS] = {
[BTF_KIND_FLOAT] = "FLOAT",
[BTF_KIND_DECL_TAG] = "DECL_TAG",
[BTF_KIND_TYPE_TAG] = "TYPE_TAG",
+ [BTF_KIND_ENUM64] = "ENUM64",
};
static const char *btf__printable_name(const struct btf *btf, uint32_t offset)
@@ -490,34 +491,64 @@ static int32_t btf_encoder__add_struct(struct btf_encoder *encoder, uint8_t kind
return id;
}
-static int32_t btf_encoder__add_enum(struct btf_encoder *encoder, const char *name, uint32_t bit_size)
+static int32_t btf_encoder__add_enum(struct btf_encoder *encoder, const char *name, struct type *etype,
+ struct conf_load *conf_load)
{
struct btf *btf = encoder->btf;
const struct btf_type *t;
int32_t id, size;
+ bool is_enum32;
- size = BITS_ROUNDUP_BYTES(bit_size);
- id = btf__add_enum(btf, name, size);
+ size = BITS_ROUNDUP_BYTES(etype->size);
+ is_enum32 = size <= 4 || conf_load->skip_encoding_btf_enum64;
+ if (is_enum32)
+ id = btf__add_enum(btf, name, size);
+ else
+ id = btf__add_enum64(btf, name, size, etype->is_signed_enum);
if (id > 0) {
t = btf__type_by_id(btf, id);
btf_encoder__log_type(encoder, t, false, true, "size=%u", t->size);
} else {
- btf__log_err(btf, BTF_KIND_ENUM, name, true,
+ btf__log_err(btf, is_enum32 ? BTF_KIND_ENUM : BTF_KIND_ENUM64, name, true,
"size=%u Error emitting BTF type", size);
}
return id;
}
-static int btf_encoder__add_enum_val(struct btf_encoder *encoder, const char *name, int32_t value)
+static int btf_encoder__add_enum_val(struct btf_encoder *encoder, const char *name, int64_t value,
+ struct type *etype, struct conf_load *conf_load)
{
- int err = btf__add_enum_value(encoder->btf, name, value);
+ const char *fmt_str;
+ int err;
+
+ /* If enum64 is not allowed, generate enum32 with unsigned int value. In enum64-supported
+ * libbpf library, btf__add_enum_value() will set the kflag (sign bit) in common_type
+ * if the value is negative.
+ */
+ if (conf_load->skip_encoding_btf_enum64)
+ err = btf__add_enum_value(encoder->btf, name, (uint32_t)value);
+ else if (etype->size > 32)
+ err = btf__add_enum64_value(encoder->btf, name, value);
+ else
+ err = btf__add_enum_value(encoder->btf, name, value);
if (!err) {
- if (encoder->verbose)
- printf("\t%s val=%d\n", name, value);
+ if (encoder->verbose) {
+ if (conf_load->skip_encoding_btf_enum64) {
+ printf("\t%s val=%u\n", name, (uint32_t)value);
+ } else {
+ fmt_str = etype->is_signed_enum ? "\t%s val=%lld\n" : "\t%s val=%llu\n";
+ printf(fmt_str, name, (unsigned long long)value);
+ }
+ }
} else {
- fprintf(stderr, "\t%s val=%d Error emitting BTF enum value\n",
- name, value);
+ if (conf_load->skip_encoding_btf_enum64) {
+ fprintf(stderr, "\t%s val=%u Error emitting BTF enum value\n", name, (uint32_t)value);
+ } else {
+ fmt_str = etype->is_signed_enum ? "\t%s val=%lld Error emitting BTF enum value\n"
+ : "\t%s val=%llu Error emitting BTF enum value\n";
+ fprintf(stderr, fmt_str, name, (unsigned long long)value);
+ }
}
return err;
}
@@ -844,27 +875,29 @@ static uint32_t array_type__nelems(struct tag *tag)
return nelem;
}
-static int32_t btf_encoder__add_enum_type(struct btf_encoder *encoder, struct tag *tag)
+static int32_t btf_encoder__add_enum_type(struct btf_encoder *encoder, struct tag *tag,
+ struct conf_load *conf_load)
{
struct type *etype = tag__type(tag);
struct enumerator *pos;
const char *name = type__name(etype);
int32_t type_id;
- type_id = btf_encoder__add_enum(encoder, name, etype->size);
+ type_id = btf_encoder__add_enum(encoder, name, etype, conf_load);
if (type_id < 0)
return type_id;
type__for_each_enumerator(etype, pos) {
name = enumerator__name(pos);
- if (btf_encoder__add_enum_val(encoder, name, pos->value))
+ if (btf_encoder__add_enum_val(encoder, name, pos->value, etype, conf_load))
return -1;
}
return type_id;
}
-static int btf_encoder__encode_tag(struct btf_encoder *encoder, struct tag *tag, uint32_t type_id_off)
+static int btf_encoder__encode_tag(struct btf_encoder *encoder, struct tag *tag, uint32_t type_id_off,
+ struct conf_load *conf_load)
{
/* single out type 0 as it represents special type "void" */
uint32_t ref_type_id = tag->type == 0 ? 0 : type_id_off + tag->type;
@@ -903,7 +936,7 @@ static int btf_encoder__encode_tag(struct btf_encoder *encoder, struct tag *tag,
encoder->need_index_type = true;
return btf_encoder__add_array(encoder, ref_type_id, encoder->array_index_id, array_type__nelems(tag));
case DW_TAG_enumeration_type:
- return btf_encoder__add_enum_type(encoder, tag);
+ return btf_encoder__add_enum_type(encoder, tag, conf_load);
case DW_TAG_subroutine_type:
return btf_encoder__add_func_proto(encoder, tag__ftype(tag), type_id_off);
default:
@@ -1422,7 +1455,7 @@ void btf_encoder__delete(struct btf_encoder *encoder)
free(encoder);
}
-int btf_encoder__encode_cu(struct btf_encoder *encoder, struct cu *cu)
+int btf_encoder__encode_cu(struct btf_encoder *encoder, struct cu *cu, struct conf_load *conf_load)
{
uint32_t type_id_off = btf__type_cnt(encoder->btf) - 1;
struct llvm_annotation *annot;
@@ -1446,7 +1479,7 @@ int btf_encoder__encode_cu(struct btf_encoder *encoder, struct cu *cu)
}
cu__for_each_type(cu, core_id, pos) {
- btf_type_id = btf_encoder__encode_tag(encoder, pos, type_id_off);
+ btf_type_id = btf_encoder__encode_tag(encoder, pos, type_id_off, conf_load);
if (btf_type_id < 0 ||
tag__check_id_drift(pos, core_id, btf_type_id, type_id_off)) {
diff --git a/btf_encoder.h b/btf_encoder.h
index 339fae2..a65120c 100644
--- a/btf_encoder.h
+++ b/btf_encoder.h
@@ -21,7 +21,7 @@ void btf_encoder__delete(struct btf_encoder *encoder);
int btf_encoder__encode(struct btf_encoder *encoder);
-int btf_encoder__encode_cu(struct btf_encoder *encoder, struct cu *cu);
+int btf_encoder__encode_cu(struct btf_encoder *encoder, struct cu *cu, struct conf_load *conf_load);
void btf_encoders__add(struct list_head *encoders, struct btf_encoder *encoder);
diff --git a/dwarf_loader.c b/dwarf_loader.c
index a0d964b..4767602 100644
--- a/dwarf_loader.c
+++ b/dwarf_loader.c
@@ -632,6 +632,18 @@ static void type__init(struct type *type, Dwarf_Die *die, struct cu *cu, struct
type->resized = 0;
type->nr_members = 0;
type->nr_static_members = 0;
+ type->is_signed_enum = 0;
+
+ Dwarf_Attribute attr;
+ if (dwarf_attr(die, DW_AT_type, &attr) != NULL) {
+ Dwarf_Die type_die;
+ if (dwarf_formref_die(&attr, &type_die) != NULL) {
+ uint64_t encoding = attr_numeric(&type_die, DW_AT_encoding);
+
+ if (encoding == DW_ATE_signed || encoding == DW_ATE_signed_char)
+ type->is_signed_enum = 1;
+ }
+ }
}
static struct type *type__new(Dwarf_Die *die, struct cu *cu, struct conf_load *conf)
diff --git a/dwarves.h b/dwarves.h
index 4d0e4b6..bec9f08 100644
--- a/dwarves.h
+++ b/dwarves.h
@@ -65,6 +65,7 @@ struct conf_load {
bool skip_encoding_btf_decl_tag;
bool skip_missing;
bool skip_encoding_btf_type_tag;
+ bool skip_encoding_btf_enum64;
uint8_t hashtable_bits;
uint8_t max_hashtable_bits;
uint16_t kabi_prefix_len;
@@ -1046,6 +1047,7 @@ struct type {
uint8_t definition_emitted:1;
uint8_t fwd_decl_emitted:1;
uint8_t resized:1;
+ uint8_t is_signed_enum:1;
};
void __type__init(struct type *type);
@@ -1365,7 +1367,7 @@ static inline struct string_type *tag__string_type(const struct tag *tag)
struct enumerator {
struct tag tag;
const char *name;
- uint32_t value;
+ uint64_t value;
struct tag_cu type_enum; // To cache the type_enum searches
};
diff --git a/dwarves_fprintf.c b/dwarves_fprintf.c
index 2cec584..ce64c79 100644
--- a/dwarves_fprintf.c
+++ b/dwarves_fprintf.c
@@ -437,7 +437,11 @@ size_t enumeration__fprintf(const struct tag *tag, const struct conf_fprintf *co
type__for_each_enumerator(type, pos) {
printed += fprintf(fp, "%.*s\t%-*s = ", indent, tabs,
max_entry_name_len, enumerator__name(pos));
- printed += fprintf(fp, conf->hex_fmt ? "%#x" : "%u", pos->value);
+ if (conf->hex_fmt)
+ printed += fprintf(fp, "%#llx", (unsigned long long)pos->value);
+ else
+ printed += fprintf(fp, type->is_signed_enum ? "%lld" : "%llu",
+ (unsigned long long)pos->value);
printed += fprintf(fp, ",\n");
}
diff --git a/pahole.c b/pahole.c
index 78caa08..e87d9a4 100644
--- a/pahole.c
+++ b/pahole.c
@@ -1220,6 +1220,7 @@ ARGP_PROGRAM_VERSION_HOOK_DEF = dwarves_print_version;
#define ARGP_compile 334
#define ARGP_languages 335
#define ARGP_languages_exclude 336
+#define ARGP_skip_encoding_btf_enum64 337
static const struct argp_option pahole__options[] = {
{
@@ -1622,6 +1623,11 @@ static const struct argp_option pahole__options[] = {
.arg = "LANGUAGES",
.doc = "Don't consider compilation units written in these languages"
},
+ {
+ .name = "skip_encoding_btf_enum64",
+ .key = ARGP_skip_encoding_btf_enum64,
+ .doc = "Do not encode ENUM64sin BTF."
+ },
{
.name = NULL,
}
@@ -1787,6 +1793,8 @@ static error_t pahole__options_parser(int key, char *arg,
/* fallthru */
case ARGP_languages:
languages.str = arg; break;
+ case ARGP_skip_encoding_btf_enum64:
+ conf_load.skip_encoding_btf_enum64 = true; break;
default:
return ARGP_ERR_UNKNOWN;
}
@@ -3067,7 +3075,7 @@ static enum load_steal_kind pahole_stealer(struct cu *cu,
encoder = btf_encoder;
}
- if (btf_encoder__encode_cu(encoder, cu)) {
+ if (btf_encoder__encode_cu(encoder, cu, conf_load)) {
fprintf(stderr, "Encountered error while encoding BTF.\n");
exit(1);
}
--
2.30.2
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH dwarves v3 0/2] btf: support BTF_KIND_ENUM64
2022-06-29 7:12 [PATCH dwarves v3 0/2] btf: support BTF_KIND_ENUM64 Yonghong Song
2022-06-29 7:12 ` [PATCH dwarves v3 1/2] libbpf: Sync with latest libbpf repo Yonghong Song
2022-06-29 7:12 ` [PATCH dwarves v3 2/2] btf: Support BTF_KIND_ENUM64 Yonghong Song
@ 2022-06-29 13:16 ` Arnaldo Carvalho de Melo
2022-06-29 21:44 ` Arnaldo Carvalho de Melo
3 siblings, 0 replies; 10+ messages in thread
From: Arnaldo Carvalho de Melo @ 2022-06-29 13:16 UTC (permalink / raw)
To: Yonghong Song
Cc: Arnaldo Carvalho de Melo, dwarves, Alexei Starovoitov,
Andrii Nakryiko, bpf, Daniel Borkmann, kernel-team
Em Wed, Jun 29, 2022 at 12:12:13AM -0700, Yonghong Song escreveu:
> Add support for enum64. For 64-bit enumerator value,
> previously, the value is truncated into 32bit, e.g.,
> for the following enum in linux uapi bpf.h,
> enum {
> BPF_F_INDEX_MASK = 0xffffffffULL,
> BPF_F_CURRENT_CPU = BPF_F_INDEX_MASK,
> /* BPF_FUNC_perf_event_output for sk_buff input context. */
> BPF_F_CTXLEN_MASK = (0xfffffULL << 32),
> };
>
> BPF_F_CTXLEN_MASK will be encoded with 0 with BTF_KIND_ENUM
> after pahole dwarf-to-btf conversion.
> With this patch, the BPF_F_CTXLEN_MASK will be encoded properly
> with BTF_KIND_ENUM64.
>
> This patch is on top of tmp.master since tmp.master has not
> been sync'ed with master branch yet.
>
> Changelogs:
> v2 -> v3:
> - pass struct type/conf_load pointers to btf_encoder__add_enum[_value]
> to make code easier to understand.
Yeah, that is more clear indeed.
- Arnaldo
> v1 -> v2:
> - Add flag --skip_encoding_btf_enum64 to disable newly-added functionality.
>
> Yonghong Song (2):
> libbpf: Sync with latest libbpf repo
> btf: Support BTF_KIND_ENUM64
>
> btf_encoder.c | 67 +++++++++++++++++++++++++++++++++++------------
> btf_encoder.h | 2 +-
> dwarf_loader.c | 12 +++++++++
> dwarves.h | 4 ++-
> dwarves_fprintf.c | 6 ++++-
> lib/bpf | 2 +-
> pahole.c | 10 ++++++-
> 7 files changed, 81 insertions(+), 22 deletions(-)
>
> --
> 2.30.2
--
- Arnaldo
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH dwarves v3 2/2] btf: Support BTF_KIND_ENUM64
2022-06-29 7:12 ` [PATCH dwarves v3 2/2] btf: Support BTF_KIND_ENUM64 Yonghong Song
@ 2022-06-29 19:12 ` Arnaldo Carvalho de Melo
2022-06-29 20:00 ` Arnaldo Carvalho de Melo
0 siblings, 1 reply; 10+ messages in thread
From: Arnaldo Carvalho de Melo @ 2022-06-29 19:12 UTC (permalink / raw)
To: Yonghong Song
Cc: Arnaldo Carvalho de Melo, dwarves, Alexei Starovoitov,
Andrii Nakryiko, bpf, Daniel Borkmann, kernel-team
Em Wed, Jun 29, 2022 at 12:12:24AM -0700, Yonghong Song escreveu:
> BTF_KIND_ENUM64 is supported with latest libbpf, which
> supports 64-bit enum values. Latest libbpf also supports
> signedness for enum values. Add enum64 support in
> dwarf-to-btf conversion.
>
> The following is an example of new encoding which covers
> signed/unsigned enum64/enum variations.
So, testing this with torvalds/master I'm getting:
FAILED: load BTF from vmlinux: Invalid argument
make[1]: *** [/var/home/acme/git/linux/Makefile:1164: vmlinux] Error 255
make[1]: *** Deleting file 'vmlinux'
make[1]: Leaving directory '/var/home/acme/git/build/v5.19-rc4+'
make: *** [Makefile:219: __sub-make] Error 2
real 8m12.396s
user 183m18.009s
sys 44m27.085s
⬢[acme@toolbox linux]$ find . -name "*.c" | xargs grep "load BTF from vmlinux"
⬢[acme@toolbox linux]$ find . -name "*.c" | xargs grep "load BTF from"
./tools/bpf/bpftool/btf.c: p_err("failed to load BTF from %s: %s",
./tools/bpf/resolve_btfids/main.c: pr_err("FAILED: load BTF from %s: %s\n",
./tools/testing/selftests/bpf/prog_tests/resolve_btfids.c: "Failed to load BTF from btf_data.o\n"))
⬢[acme@toolbox linux]$ vim ./tools/bpf/resolve_btfids/main.c
Which is:
btf = btf__parse_split(obj->btf ?: obj->path, base_btf);
err = libbpf_get_error(btf);
if (err) {
pr_err("FAILED: load BTF from %s: %s\n",
obj->btf ?: obj->path, strerror(-err));
goto out;
}
I.e. tools/lib/bpf in torvalds/master doesn´t support BTF_KIND_ENUM64,
right? So to build it with a new pahole one needs to ask for
--skip_encoding_btf_enum64? How to do this automagically? I.e. its a
matter of checking if the in-kernel libbpf has support for it and if not
use --skip_encoding_btf_enum64?
I'm now going to try with bpf-next/master
- Arnaldo
> $cat t.c
> enum { /* signed, enum64 */
> A = -1,
> B = 0xffffffff,
> } g1;
> enum { /* unsigned, enum64 */
> C = 1,
> D = 0xfffffffff,
> } g2;
> enum { /* signed, enum */
> E = -1,
> F = 0xfffffff,
> } g3;
> enum { /* unsigned, enum */
> G = 1,
> H = 0xfffffff,
> } g4;
> $ clang -g -c t.c
> $ pahole -JV t.o
> btf_encoder__new: 't.o' doesn't have '.data..percpu' section
> Found 0 per-CPU variables!
> File t.o:
> [1] ENUM64 (anon) size=8
> A val=-1
> B val=4294967295
> [2] INT long size=8 nr_bits=64 encoding=SIGNED
> [3] ENUM64 (anon) size=8
> C val=1
> D val=68719476735
> [4] INT unsigned long size=8 nr_bits=64 encoding=(none)
> [5] ENUM (anon) size=4
> E val=-1
> F val=268435455
> [6] INT int size=4 nr_bits=32 encoding=SIGNED
> [7] ENUM (anon) size=4
> G val=1
> H val=268435455
> [8] INT unsigned int size=4 nr_bits=32 encoding=(none)
>
> With the flag to skip enum64 encoding,
>
> $ pahole -JV t.o --skip_encoding_btf_enum64
> btf_encoder__new: 't.o' doesn't have '.data..percpu' section
> Found 0 per-CPU variables!
> File t.o:
> [1] ENUM (anon) size=8
> A val=4294967295
> B val=4294967295
> [2] INT long size=8 nr_bits=64 encoding=SIGNED
> [3] ENUM (anon) size=8
> C val=1
> D val=4294967295
> [4] INT unsigned long size=8 nr_bits=64 encoding=(none)
> [5] ENUM (anon) size=4
> E val=4294967295
> F val=268435455
> [6] INT int size=4 nr_bits=32 encoding=SIGNED
> [7] ENUM (anon) size=4
> G val=1
> H val=268435455
> [8] INT unsigned int size=4 nr_bits=32 encoding=(none)
>
> In the above btf encoding without enum64, all enum types
> with the same type size as the corresponding enum64. All these
> enum types have unsigned type (kflag = 0) which is required
> before kernel enum64 support.
>
> Acked-by: Andrii Nakryiko <andrii@kernel.org>
> Signed-off-by: Yonghong Song <yhs@fb.com>
> ---
> btf_encoder.c | 67 +++++++++++++++++++++++++++++++++++------------
> btf_encoder.h | 2 +-
> dwarf_loader.c | 12 +++++++++
> dwarves.h | 4 ++-
> dwarves_fprintf.c | 6 ++++-
> pahole.c | 10 ++++++-
> 6 files changed, 80 insertions(+), 21 deletions(-)
>
> diff --git a/btf_encoder.c b/btf_encoder.c
> index 9e708e4..daa8e3b 100644
> --- a/btf_encoder.c
> +++ b/btf_encoder.c
> @@ -144,6 +144,7 @@ static const char * const btf_kind_str[NR_BTF_KINDS] = {
> [BTF_KIND_FLOAT] = "FLOAT",
> [BTF_KIND_DECL_TAG] = "DECL_TAG",
> [BTF_KIND_TYPE_TAG] = "TYPE_TAG",
> + [BTF_KIND_ENUM64] = "ENUM64",
> };
>
> static const char *btf__printable_name(const struct btf *btf, uint32_t offset)
> @@ -490,34 +491,64 @@ static int32_t btf_encoder__add_struct(struct btf_encoder *encoder, uint8_t kind
> return id;
> }
>
> -static int32_t btf_encoder__add_enum(struct btf_encoder *encoder, const char *name, uint32_t bit_size)
> +static int32_t btf_encoder__add_enum(struct btf_encoder *encoder, const char *name, struct type *etype,
> + struct conf_load *conf_load)
> {
> struct btf *btf = encoder->btf;
> const struct btf_type *t;
> int32_t id, size;
> + bool is_enum32;
>
> - size = BITS_ROUNDUP_BYTES(bit_size);
> - id = btf__add_enum(btf, name, size);
> + size = BITS_ROUNDUP_BYTES(etype->size);
> + is_enum32 = size <= 4 || conf_load->skip_encoding_btf_enum64;
> + if (is_enum32)
> + id = btf__add_enum(btf, name, size);
> + else
> + id = btf__add_enum64(btf, name, size, etype->is_signed_enum);
> if (id > 0) {
> t = btf__type_by_id(btf, id);
> btf_encoder__log_type(encoder, t, false, true, "size=%u", t->size);
> } else {
> - btf__log_err(btf, BTF_KIND_ENUM, name, true,
> + btf__log_err(btf, is_enum32 ? BTF_KIND_ENUM : BTF_KIND_ENUM64, name, true,
> "size=%u Error emitting BTF type", size);
> }
> return id;
> }
>
> -static int btf_encoder__add_enum_val(struct btf_encoder *encoder, const char *name, int32_t value)
> +static int btf_encoder__add_enum_val(struct btf_encoder *encoder, const char *name, int64_t value,
> + struct type *etype, struct conf_load *conf_load)
> {
> - int err = btf__add_enum_value(encoder->btf, name, value);
> + const char *fmt_str;
> + int err;
> +
> + /* If enum64 is not allowed, generate enum32 with unsigned int value. In enum64-supported
> + * libbpf library, btf__add_enum_value() will set the kflag (sign bit) in common_type
> + * if the value is negative.
> + */
> + if (conf_load->skip_encoding_btf_enum64)
> + err = btf__add_enum_value(encoder->btf, name, (uint32_t)value);
> + else if (etype->size > 32)
> + err = btf__add_enum64_value(encoder->btf, name, value);
> + else
> + err = btf__add_enum_value(encoder->btf, name, value);
>
> if (!err) {
> - if (encoder->verbose)
> - printf("\t%s val=%d\n", name, value);
> + if (encoder->verbose) {
> + if (conf_load->skip_encoding_btf_enum64) {
> + printf("\t%s val=%u\n", name, (uint32_t)value);
> + } else {
> + fmt_str = etype->is_signed_enum ? "\t%s val=%lld\n" : "\t%s val=%llu\n";
> + printf(fmt_str, name, (unsigned long long)value);
> + }
> + }
> } else {
> - fprintf(stderr, "\t%s val=%d Error emitting BTF enum value\n",
> - name, value);
> + if (conf_load->skip_encoding_btf_enum64) {
> + fprintf(stderr, "\t%s val=%u Error emitting BTF enum value\n", name, (uint32_t)value);
> + } else {
> + fmt_str = etype->is_signed_enum ? "\t%s val=%lld Error emitting BTF enum value\n"
> + : "\t%s val=%llu Error emitting BTF enum value\n";
> + fprintf(stderr, fmt_str, name, (unsigned long long)value);
> + }
> }
> return err;
> }
> @@ -844,27 +875,29 @@ static uint32_t array_type__nelems(struct tag *tag)
> return nelem;
> }
>
> -static int32_t btf_encoder__add_enum_type(struct btf_encoder *encoder, struct tag *tag)
> +static int32_t btf_encoder__add_enum_type(struct btf_encoder *encoder, struct tag *tag,
> + struct conf_load *conf_load)
> {
> struct type *etype = tag__type(tag);
> struct enumerator *pos;
> const char *name = type__name(etype);
> int32_t type_id;
>
> - type_id = btf_encoder__add_enum(encoder, name, etype->size);
> + type_id = btf_encoder__add_enum(encoder, name, etype, conf_load);
> if (type_id < 0)
> return type_id;
>
> type__for_each_enumerator(etype, pos) {
> name = enumerator__name(pos);
> - if (btf_encoder__add_enum_val(encoder, name, pos->value))
> + if (btf_encoder__add_enum_val(encoder, name, pos->value, etype, conf_load))
> return -1;
> }
>
> return type_id;
> }
>
> -static int btf_encoder__encode_tag(struct btf_encoder *encoder, struct tag *tag, uint32_t type_id_off)
> +static int btf_encoder__encode_tag(struct btf_encoder *encoder, struct tag *tag, uint32_t type_id_off,
> + struct conf_load *conf_load)
> {
> /* single out type 0 as it represents special type "void" */
> uint32_t ref_type_id = tag->type == 0 ? 0 : type_id_off + tag->type;
> @@ -903,7 +936,7 @@ static int btf_encoder__encode_tag(struct btf_encoder *encoder, struct tag *tag,
> encoder->need_index_type = true;
> return btf_encoder__add_array(encoder, ref_type_id, encoder->array_index_id, array_type__nelems(tag));
> case DW_TAG_enumeration_type:
> - return btf_encoder__add_enum_type(encoder, tag);
> + return btf_encoder__add_enum_type(encoder, tag, conf_load);
> case DW_TAG_subroutine_type:
> return btf_encoder__add_func_proto(encoder, tag__ftype(tag), type_id_off);
> default:
> @@ -1422,7 +1455,7 @@ void btf_encoder__delete(struct btf_encoder *encoder)
> free(encoder);
> }
>
> -int btf_encoder__encode_cu(struct btf_encoder *encoder, struct cu *cu)
> +int btf_encoder__encode_cu(struct btf_encoder *encoder, struct cu *cu, struct conf_load *conf_load)
> {
> uint32_t type_id_off = btf__type_cnt(encoder->btf) - 1;
> struct llvm_annotation *annot;
> @@ -1446,7 +1479,7 @@ int btf_encoder__encode_cu(struct btf_encoder *encoder, struct cu *cu)
> }
>
> cu__for_each_type(cu, core_id, pos) {
> - btf_type_id = btf_encoder__encode_tag(encoder, pos, type_id_off);
> + btf_type_id = btf_encoder__encode_tag(encoder, pos, type_id_off, conf_load);
>
> if (btf_type_id < 0 ||
> tag__check_id_drift(pos, core_id, btf_type_id, type_id_off)) {
> diff --git a/btf_encoder.h b/btf_encoder.h
> index 339fae2..a65120c 100644
> --- a/btf_encoder.h
> +++ b/btf_encoder.h
> @@ -21,7 +21,7 @@ void btf_encoder__delete(struct btf_encoder *encoder);
>
> int btf_encoder__encode(struct btf_encoder *encoder);
>
> -int btf_encoder__encode_cu(struct btf_encoder *encoder, struct cu *cu);
> +int btf_encoder__encode_cu(struct btf_encoder *encoder, struct cu *cu, struct conf_load *conf_load);
>
> void btf_encoders__add(struct list_head *encoders, struct btf_encoder *encoder);
>
> diff --git a/dwarf_loader.c b/dwarf_loader.c
> index a0d964b..4767602 100644
> --- a/dwarf_loader.c
> +++ b/dwarf_loader.c
> @@ -632,6 +632,18 @@ static void type__init(struct type *type, Dwarf_Die *die, struct cu *cu, struct
> type->resized = 0;
> type->nr_members = 0;
> type->nr_static_members = 0;
> + type->is_signed_enum = 0;
> +
> + Dwarf_Attribute attr;
> + if (dwarf_attr(die, DW_AT_type, &attr) != NULL) {
> + Dwarf_Die type_die;
> + if (dwarf_formref_die(&attr, &type_die) != NULL) {
> + uint64_t encoding = attr_numeric(&type_die, DW_AT_encoding);
> +
> + if (encoding == DW_ATE_signed || encoding == DW_ATE_signed_char)
> + type->is_signed_enum = 1;
> + }
> + }
> }
>
> static struct type *type__new(Dwarf_Die *die, struct cu *cu, struct conf_load *conf)
> diff --git a/dwarves.h b/dwarves.h
> index 4d0e4b6..bec9f08 100644
> --- a/dwarves.h
> +++ b/dwarves.h
> @@ -65,6 +65,7 @@ struct conf_load {
> bool skip_encoding_btf_decl_tag;
> bool skip_missing;
> bool skip_encoding_btf_type_tag;
> + bool skip_encoding_btf_enum64;
> uint8_t hashtable_bits;
> uint8_t max_hashtable_bits;
> uint16_t kabi_prefix_len;
> @@ -1046,6 +1047,7 @@ struct type {
> uint8_t definition_emitted:1;
> uint8_t fwd_decl_emitted:1;
> uint8_t resized:1;
> + uint8_t is_signed_enum:1;
> };
>
> void __type__init(struct type *type);
> @@ -1365,7 +1367,7 @@ static inline struct string_type *tag__string_type(const struct tag *tag)
> struct enumerator {
> struct tag tag;
> const char *name;
> - uint32_t value;
> + uint64_t value;
> struct tag_cu type_enum; // To cache the type_enum searches
> };
>
> diff --git a/dwarves_fprintf.c b/dwarves_fprintf.c
> index 2cec584..ce64c79 100644
> --- a/dwarves_fprintf.c
> +++ b/dwarves_fprintf.c
> @@ -437,7 +437,11 @@ size_t enumeration__fprintf(const struct tag *tag, const struct conf_fprintf *co
> type__for_each_enumerator(type, pos) {
> printed += fprintf(fp, "%.*s\t%-*s = ", indent, tabs,
> max_entry_name_len, enumerator__name(pos));
> - printed += fprintf(fp, conf->hex_fmt ? "%#x" : "%u", pos->value);
> + if (conf->hex_fmt)
> + printed += fprintf(fp, "%#llx", (unsigned long long)pos->value);
> + else
> + printed += fprintf(fp, type->is_signed_enum ? "%lld" : "%llu",
> + (unsigned long long)pos->value);
> printed += fprintf(fp, ",\n");
> }
>
> diff --git a/pahole.c b/pahole.c
> index 78caa08..e87d9a4 100644
> --- a/pahole.c
> +++ b/pahole.c
> @@ -1220,6 +1220,7 @@ ARGP_PROGRAM_VERSION_HOOK_DEF = dwarves_print_version;
> #define ARGP_compile 334
> #define ARGP_languages 335
> #define ARGP_languages_exclude 336
> +#define ARGP_skip_encoding_btf_enum64 337
>
> static const struct argp_option pahole__options[] = {
> {
> @@ -1622,6 +1623,11 @@ static const struct argp_option pahole__options[] = {
> .arg = "LANGUAGES",
> .doc = "Don't consider compilation units written in these languages"
> },
> + {
> + .name = "skip_encoding_btf_enum64",
> + .key = ARGP_skip_encoding_btf_enum64,
> + .doc = "Do not encode ENUM64sin BTF."
> + },
> {
> .name = NULL,
> }
> @@ -1787,6 +1793,8 @@ static error_t pahole__options_parser(int key, char *arg,
> /* fallthru */
> case ARGP_languages:
> languages.str = arg; break;
> + case ARGP_skip_encoding_btf_enum64:
> + conf_load.skip_encoding_btf_enum64 = true; break;
> default:
> return ARGP_ERR_UNKNOWN;
> }
> @@ -3067,7 +3075,7 @@ static enum load_steal_kind pahole_stealer(struct cu *cu,
> encoder = btf_encoder;
> }
>
> - if (btf_encoder__encode_cu(encoder, cu)) {
> + if (btf_encoder__encode_cu(encoder, cu, conf_load)) {
> fprintf(stderr, "Encountered error while encoding BTF.\n");
> exit(1);
> }
> --
> 2.30.2
--
- Arnaldo
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH dwarves v3 2/2] btf: Support BTF_KIND_ENUM64
2022-06-29 19:12 ` Arnaldo Carvalho de Melo
@ 2022-06-29 20:00 ` Arnaldo Carvalho de Melo
0 siblings, 0 replies; 10+ messages in thread
From: Arnaldo Carvalho de Melo @ 2022-06-29 20:00 UTC (permalink / raw)
To: Yonghong Song
Cc: Arnaldo Carvalho de Melo, dwarves, Alexei Starovoitov,
Andrii Nakryiko, bpf, Daniel Borkmann, kernel-team
Em Wed, Jun 29, 2022 at 04:12:19PM -0300, Arnaldo Carvalho de Melo escreveu:
> Em Wed, Jun 29, 2022 at 12:12:24AM -0700, Yonghong Song escreveu:
> > BTF_KIND_ENUM64 is supported with latest libbpf, which
> > supports 64-bit enum values. Latest libbpf also supports
> > signedness for enum values. Add enum64 support in
> > dwarf-to-btf conversion.
> >
> > The following is an example of new encoding which covers
> > signed/unsigned enum64/enum variations.
>
> So, testing this with torvalds/master I'm getting:
>
> FAILED: load BTF from vmlinux: Invalid argument
> make[1]: *** [/var/home/acme/git/linux/Makefile:1164: vmlinux] Error 255
> make[1]: *** Deleting file 'vmlinux'
> make[1]: Leaving directory '/var/home/acme/git/build/v5.19-rc4+'
> make: *** [Makefile:219: __sub-make] Error 2
>
> real 8m12.396s
> user 183m18.009s
> sys 44m27.085s
> ⬢[acme@toolbox linux]$ find . -name "*.c" | xargs grep "load BTF from vmlinux"
> ⬢[acme@toolbox linux]$ find . -name "*.c" | xargs grep "load BTF from"
> ./tools/bpf/bpftool/btf.c: p_err("failed to load BTF from %s: %s",
> ./tools/bpf/resolve_btfids/main.c: pr_err("FAILED: load BTF from %s: %s\n",
> ./tools/testing/selftests/bpf/prog_tests/resolve_btfids.c: "Failed to load BTF from btf_data.o\n"))
> ⬢[acme@toolbox linux]$ vim ./tools/bpf/resolve_btfids/main.c
>
> Which is:
>
> btf = btf__parse_split(obj->btf ?: obj->path, base_btf);
> err = libbpf_get_error(btf);
> if (err) {
> pr_err("FAILED: load BTF from %s: %s\n",
> obj->btf ?: obj->path, strerror(-err));
> goto out;
> }
>
> I.e. tools/lib/bpf in torvalds/master doesn´t support BTF_KIND_ENUM64,
> right? So to build it with a new pahole one needs to ask for
> --skip_encoding_btf_enum64? How to do this automagically? I.e. its a
> matter of checking if the in-kernel libbpf has support for it and if not
> use --skip_encoding_btf_enum64?
>
> I'm now going to try with bpf-next/master
Yeah, works with bpf-next:
⬢[acme@toolbox bpf-next]$ pdwtags -F btf ../build/bpf-next/vmlinux | grep -A5 -B5 BPF_F_CTXLEN_MASK
/* 28548 */
enum {
BPF_F_INDEX_MASK = 4294967295,
BPF_F_CURRENT_CPU = 4294967295,
BPF_F_CTXLEN_MASK = 4503595332403200,
} __attribute__((__packed__)); /* size: 8 */
/* 28549 */
enum {
BPF_F_GET_BRANCH_RECORDS_SIZE = 1,
⬢[acme@toolbox bpf-next]$
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH dwarves v3 0/2] btf: support BTF_KIND_ENUM64
2022-06-29 7:12 [PATCH dwarves v3 0/2] btf: support BTF_KIND_ENUM64 Yonghong Song
` (2 preceding siblings ...)
2022-06-29 13:16 ` [PATCH dwarves v3 0/2] btf: support BTF_KIND_ENUM64 Arnaldo Carvalho de Melo
@ 2022-06-29 21:44 ` Arnaldo Carvalho de Melo
2022-06-30 2:33 ` Yonghong Song
2022-07-11 9:16 ` Jiri Olsa
3 siblings, 2 replies; 10+ messages in thread
From: Arnaldo Carvalho de Melo @ 2022-06-29 21:44 UTC (permalink / raw)
To: Yonghong Song
Cc: Arnaldo Carvalho de Melo, dwarves, Alexei Starovoitov,
Andrii Nakryiko, bpf, Daniel Borkmann, kernel-team
Em Wed, Jun 29, 2022 at 12:12:13AM -0700, Yonghong Song escreveu:
> Add support for enum64. For 64-bit enumerator value,
> previously, the value is truncated into 32bit, e.g.,
> for the following enum in linux uapi bpf.h,
> enum {
> BPF_F_INDEX_MASK = 0xffffffffULL,
> BPF_F_CURRENT_CPU = BPF_F_INDEX_MASK,
> /* BPF_FUNC_perf_event_output for sk_buff input context. */
> BPF_F_CTXLEN_MASK = (0xfffffULL << 32),
> };
Applied, added the entry for skip generating enums to the man page,
added support to the pahole BTF loader, used the new pahole to build
bpf-next/master, all seems ok, pushing to next on git.kernel.org so that
the libbpf github CI can give it a go.
To build with torvalds/master one has to add --skip_encoding_btf_enum64,
I think, haven't tested with it, without it isn't working, libbpf
complains at that btfids tool.
Please check/test what is in there now:
git://git.kernel.org/pub/scm/devel/pahole/pahole.git next
https://git.kernel.org/pub/scm/devel/pahole/pahole.git/log/?h=next
Unless someone screams I plan pushing out a new release, update fedora
packages, etc early next week its overdue by now.
- Arnaldo
> BPF_F_CTXLEN_MASK will be encoded with 0 with BTF_KIND_ENUM
> after pahole dwarf-to-btf conversion.
> With this patch, the BPF_F_CTXLEN_MASK will be encoded properly
> with BTF_KIND_ENUM64.
>
> This patch is on top of tmp.master since tmp.master has not
> been sync'ed with master branch yet.
>
> Changelogs:
> v2 -> v3:
> - pass struct type/conf_load pointers to btf_encoder__add_enum[_value]
> to make code easier to understand.
> v1 -> v2:
> - Add flag --skip_encoding_btf_enum64 to disable newly-added functionality.
>
> Yonghong Song (2):
> libbpf: Sync with latest libbpf repo
> btf: Support BTF_KIND_ENUM64
>
> btf_encoder.c | 67 +++++++++++++++++++++++++++++++++++------------
> btf_encoder.h | 2 +-
> dwarf_loader.c | 12 +++++++++
> dwarves.h | 4 ++-
> dwarves_fprintf.c | 6 ++++-
> lib/bpf | 2 +-
> pahole.c | 10 ++++++-
> 7 files changed, 81 insertions(+), 22 deletions(-)
>
> --
> 2.30.2
--
- Arnaldo
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH dwarves v3 0/2] btf: support BTF_KIND_ENUM64
2022-06-29 21:44 ` Arnaldo Carvalho de Melo
@ 2022-06-30 2:33 ` Yonghong Song
2022-07-11 9:16 ` Jiri Olsa
1 sibling, 0 replies; 10+ messages in thread
From: Yonghong Song @ 2022-06-30 2:33 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo
Cc: Arnaldo Carvalho de Melo, dwarves, Alexei Starovoitov,
Andrii Nakryiko, bpf, Daniel Borkmann, kernel-team
On 6/29/22 2:44 PM, Arnaldo Carvalho de Melo wrote:
> Em Wed, Jun 29, 2022 at 12:12:13AM -0700, Yonghong Song escreveu:
>> Add support for enum64. For 64-bit enumerator value,
>> previously, the value is truncated into 32bit, e.g.,
>> for the following enum in linux uapi bpf.h,
>> enum {
>> BPF_F_INDEX_MASK = 0xffffffffULL,
>> BPF_F_CURRENT_CPU = BPF_F_INDEX_MASK,
>> /* BPF_FUNC_perf_event_output for sk_buff input context. */
>> BPF_F_CTXLEN_MASK = (0xfffffULL << 32),
>> };
>
> Applied, added the entry for skip generating enums to the man page,
> added support to the pahole BTF loader, used the new pahole to build
> bpf-next/master, all seems ok, pushing to next on git.kernel.org so that
> the libbpf github CI can give it a go.
>
> To build with torvalds/master one has to add --skip_encoding_btf_enum64,
> I think, haven't tested with it, without it isn't working, libbpf
> complains at that btfids tool.
The patch to support enum64 in btf_laoder looks good to me too.
Thanks for checking and additional testing!
>
> Please check/test what is in there now:
>
> git://git.kernel.org/pub/scm/devel/pahole/pahole.git next
> https://git.kernel.org/pub/scm/devel/pahole/pahole.git/log/?h=next
>
> Unless someone screams I plan pushing out a new release, update fedora
> packages, etc early next week its overdue by now.
>
> - Arnaldo
>
>> BPF_F_CTXLEN_MASK will be encoded with 0 with BTF_KIND_ENUM
>> after pahole dwarf-to-btf conversion.
>> With this patch, the BPF_F_CTXLEN_MASK will be encoded properly
>> with BTF_KIND_ENUM64.
>>
>> This patch is on top of tmp.master since tmp.master has not
>> been sync'ed with master branch yet.
>>
>> Changelogs:
>> v2 -> v3:
>> - pass struct type/conf_load pointers to btf_encoder__add_enum[_value]
>> to make code easier to understand.
>> v1 -> v2:
>> - Add flag --skip_encoding_btf_enum64 to disable newly-added functionality.
>>
>> Yonghong Song (2):
>> libbpf: Sync with latest libbpf repo
>> btf: Support BTF_KIND_ENUM64
>>
>> btf_encoder.c | 67 +++++++++++++++++++++++++++++++++++------------
>> btf_encoder.h | 2 +-
>> dwarf_loader.c | 12 +++++++++
>> dwarves.h | 4 ++-
>> dwarves_fprintf.c | 6 ++++-
>> lib/bpf | 2 +-
>> pahole.c | 10 ++++++-
>> 7 files changed, 81 insertions(+), 22 deletions(-)
>>
>> --
>> 2.30.2
>
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH dwarves v3 0/2] btf: support BTF_KIND_ENUM64
2022-06-29 21:44 ` Arnaldo Carvalho de Melo
2022-06-30 2:33 ` Yonghong Song
@ 2022-07-11 9:16 ` Jiri Olsa
2022-07-11 9:37 ` Jiri Olsa
1 sibling, 1 reply; 10+ messages in thread
From: Jiri Olsa @ 2022-07-11 9:16 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 Wed, Jun 29, 2022 at 06:44:52PM -0300, Arnaldo Carvalho de Melo wrote:
> Em Wed, Jun 29, 2022 at 12:12:13AM -0700, Yonghong Song escreveu:
> > Add support for enum64. For 64-bit enumerator value,
> > previously, the value is truncated into 32bit, e.g.,
> > for the following enum in linux uapi bpf.h,
> > enum {
> > BPF_F_INDEX_MASK = 0xffffffffULL,
> > BPF_F_CURRENT_CPU = BPF_F_INDEX_MASK,
> > /* BPF_FUNC_perf_event_output for sk_buff input context. */
> > BPF_F_CTXLEN_MASK = (0xfffffULL << 32),
> > };
>
> Applied, added the entry for skip generating enums to the man page,
> added support to the pahole BTF loader, used the new pahole to build
> bpf-next/master, all seems ok, pushing to next on git.kernel.org so that
> the libbpf github CI can give it a go.
>
> To build with torvalds/master one has to add --skip_encoding_btf_enum64,
> I think, haven't tested with it, without it isn't working, libbpf
> complains at that btfids tool.
>
> Please check/test what is in there now:
>
> git://git.kernel.org/pub/scm/devel/pahole/pahole.git next
> https://git.kernel.org/pub/scm/devel/pahole/pahole.git/log/?h=next
>
> Unless someone screams I plan pushing out a new release, update fedora
> packages, etc early next week its overdue by now.
I used this new pahole in kernel build and it looks ok,
but I'm getting following warning:
BTFIDS vmlinux
WARN: resolve_btfids: unresolved symbol mptcp_sock
might be specific to my .config, I'll check and let you know
jirka
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH dwarves v3 0/2] btf: support BTF_KIND_ENUM64
2022-07-11 9:16 ` Jiri Olsa
@ 2022-07-11 9:37 ` Jiri Olsa
0 siblings, 0 replies; 10+ messages in thread
From: Jiri Olsa @ 2022-07-11 9:37 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 Mon, Jul 11, 2022 at 11:16:21AM +0200, Jiri Olsa wrote:
> On Wed, Jun 29, 2022 at 06:44:52PM -0300, Arnaldo Carvalho de Melo wrote:
> > Em Wed, Jun 29, 2022 at 12:12:13AM -0700, Yonghong Song escreveu:
> > > Add support for enum64. For 64-bit enumerator value,
> > > previously, the value is truncated into 32bit, e.g.,
> > > for the following enum in linux uapi bpf.h,
> > > enum {
> > > BPF_F_INDEX_MASK = 0xffffffffULL,
> > > BPF_F_CURRENT_CPU = BPF_F_INDEX_MASK,
> > > /* BPF_FUNC_perf_event_output for sk_buff input context. */
> > > BPF_F_CTXLEN_MASK = (0xfffffULL << 32),
> > > };
> >
> > Applied, added the entry for skip generating enums to the man page,
> > added support to the pahole BTF loader, used the new pahole to build
> > bpf-next/master, all seems ok, pushing to next on git.kernel.org so that
> > the libbpf github CI can give it a go.
> >
> > To build with torvalds/master one has to add --skip_encoding_btf_enum64,
> > I think, haven't tested with it, without it isn't working, libbpf
> > complains at that btfids tool.
> >
> > Please check/test what is in there now:
> >
> > git://git.kernel.org/pub/scm/devel/pahole/pahole.git next
> > https://git.kernel.org/pub/scm/devel/pahole/pahole.git/log/?h=next
> >
> > Unless someone screams I plan pushing out a new release, update fedora
> > packages, etc early next week its overdue by now.
>
> I used this new pahole in kernel build and it looks ok,
> but I'm getting following warning:
>
> BTFIDS vmlinux
> WARN: resolve_btfids: unresolved symbol mptcp_sock
>
> might be specific to my .config, I'll check and let you know
ok I have only FWD declaration of mptcp_sock struct, that's why it
can't get resolved.. when I enabled CONFIG_MPTCP it goes away
so no problem with pahole ;-)
Tested-by: Jiri Olsa <jolsa@kernel.org>
the problem is with the btf_sock_ids array that carries mptcp_sock
BTF id even when the CONFIG_MPTCP option is not enabled
I'll follow up on that in separate email
thanks,
jirka
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2022-07-11 10:24 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-06-29 7:12 [PATCH dwarves v3 0/2] btf: support BTF_KIND_ENUM64 Yonghong Song
2022-06-29 7:12 ` [PATCH dwarves v3 1/2] libbpf: Sync with latest libbpf repo Yonghong Song
2022-06-29 7:12 ` [PATCH dwarves v3 2/2] btf: Support BTF_KIND_ENUM64 Yonghong Song
2022-06-29 19:12 ` Arnaldo Carvalho de Melo
2022-06-29 20:00 ` Arnaldo Carvalho de Melo
2022-06-29 13:16 ` [PATCH dwarves v3 0/2] btf: support BTF_KIND_ENUM64 Arnaldo Carvalho de Melo
2022-06-29 21:44 ` Arnaldo Carvalho de Melo
2022-06-30 2:33 ` Yonghong Song
2022-07-11 9:16 ` Jiri Olsa
2022-07-11 9:37 ` Jiri Olsa
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).