Skip to contentSkip to conversation

bpf: Store/dump license string for loaded program

PATCH In review Jiri Olsa 4 participants 12 messages Apr 25, 2018 – Apr 27, 2018

Subsystems (5)
lore
Share & tools
lore

Jiri Olsa

author reviewer
#0 lore raw

v2 cover bpf: Store/dump license string for loaded program

hi,
sending the change to store and dump the license
info for loaded BPF programs. It's important for
us get the license info, when investigating on
screwed up machine.

v2 changes:
- dumping only the GPL compatible bool, without
storing the whole license string

Adding change to bpftool to dump the license GPL
compatible info via:

  # bpftool prog list
  3: kprobe  name func_begin  tag 57cd311f2e27366b license GPL NON compatible
          loaded_at Apr 25/11:20  uid 0
          xlated 16B  not jited  memlock 4096B
  # bpftool prog list
  4: kprobe  name func_begin  tag 57cd311f2e27366b license GPL compatible
          loaded_at Apr 25/11:20  uid 0
          xlated 16B  not jited  memlock 4096B
  # bpftool prog show --json
  [{"id":3,"type":"kprobe","name":"func ... ,"gpl_compatible":false,"loade...

Also available at:
https://git.kernel.org/pub/scm/linux/kernel/git/jolsa/perf.git
bpf/license

thanks,
jirka

---
Jiri Olsa (3):
bpf: Add gpl_compatible flag to struct bpf_prog_info tools bpf: Sync bpf.h uapi header
tools bpftool: Display license GPL compatible in prog show/list

 include/uapi/linux/bpf.h       | 1 +
 kernel/bpf/syscall.c           | 1 +
 tools/bpf/bpftool/prog.c       | 3 +++
 tools/include/uapi/linux/bpf.h | 1 +
 4 files changed, 6 insertions(+)
author reviewer
#1 lore raw

PATCH v2 1/3 bpf: Add gpl_compatible flag to struct bpf_prog_info

Adding gpl_compatible flag to struct bpf_prog_info so it can be dumped via bpf_prog_get_info_by_fd and displayed via bpftool progs dump.

Alexei noticed 4-byte hole in struct bpf_prog_info, so we put the u32 flags field in there, and we can keep adding bit fields in there without breaking user space.

---
 include/uapi/linux/bpf.h | 1 +
 kernel/bpf/syscall.c     | 1 +
 2 files changed, 2 insertions(+)
include/uapi/linux/bpf.h +1 -0
index e6679393b687..da8801860c7d 100644
@@ -1060,6 +1060,7 @@ struct bpf_prog_info {
 	__aligned_u64 map_ids;
 	char name[BPF_OBJ_NAME_LEN];
 	__u32 ifindex;
+	__u32 gpl_compatible:1;
 	__u64 netns_dev;
 	__u64 netns_ino;
 } __attribute__((aligned(8)));
kernel/bpf/syscall.c +1 -0
index fe23dc5a3ec4..7bb4ff1c770a 100644
@@ -1914,6 +1914,7 @@ static int bpf_prog_get_info_by_fd(struct bpf_prog *prog,
 	info.load_time = prog->aux->load_time;
 	info.created_by_uid = from_kuid_munged(current_user_ns(),
 					       prog->aux->user->uid);
+	info.gpl_compatible = prog->gpl_compatible;
 
 	memcpy(info.tag, prog->tag, sizeof(prog->tag));
 	memcpy(info.name, prog->aux->name, sizeof(prog->aux->name));
Signature · 1 line
2.13.6
author reviewer
#2 lore raw

PATCH v2 2/3 tools bpf: Sync bpf.h uapi header

In reply to Jiri Olsa

Syncing the bpf.h uapi header with tools.

---
 tools/include/uapi/linux/bpf.h | 1 +
 1 file changed, 1 insertion(+)
tools/include/uapi/linux/bpf.h +1 -0
index e6679393b687..da8801860c7d 100644
@@ -1060,6 +1060,7 @@ struct bpf_prog_info {
 	__aligned_u64 map_ids;
 	char name[BPF_OBJ_NAME_LEN];
 	__u32 ifindex;
+	__u32 gpl_compatible:1;
 	__u64 netns_dev;
 	__u64 netns_ino;
 } __attribute__((aligned(8)));
Signature · 1 line
2.13.6
author reviewer
#3 lore raw

PATCH v2 3/3 tools bpftool: Display license GPL compatible in prog show/list

In reply to Jiri Olsa

Display the license GPL NON/compatible string in bpftool prog command, like:

  # bpftool prog list
  3: kprobe  name func_begin  tag 57cd311f2e27366b license GPL NON compatible
          loaded_at Apr 25/11:20  uid 0
          xlated 16B  not jited  memlock 4096B
  # bpftool prog list
  4: kprobe  name func_begin  tag 57cd311f2e27366b license GPL compatible
          loaded_at Apr 25/11:20  uid 0
          xlated 16B  not jited  memlock 4096B
  # bpftool prog show --json
  [{"id":3,"type":"kprobe","name":"func ... ,"gpl_compatible":false,"loade...
---
 tools/bpf/bpftool/prog.c | 3 +++
 1 file changed, 3 insertions(+)
tools/bpf/bpftool/prog.c +3 -0
index 548adb9b7317..b8b4341a1342 100644
@@ -235,6 +235,8 @@ static void print_prog_json(struct bpf_prog_info *info, int fd)
 		     info->tag[0], info->tag[1], info->tag[2], info->tag[3],
 		     info->tag[4], info->tag[5], info->tag[6], info->tag[7]);
 
+	jsonw_bool_field(json_wtr, "gpl_compatible", info->gpl_compatible);
+
 	print_dev_json(info->ifindex, info->netns_dev, info->netns_ino);
 
 	if (info->load_time) {
@@ -295,6 +297,7 @@ static void print_prog_plain(struct bpf_prog_info *info, int fd)
 	printf("tag ");
 	fprint_hex(stdout, info->tag, BPF_TAG_SIZE, "");
 	print_dev_plain(info->ifindex, info->netns_dev, info->netns_ino);
+	printf(" license GPL %scompatible", info->gpl_compatible ? "" : "NON ");
 	printf("\n");
 
 	if (info->load_time) {
Signature · 1 line
2.13.6
#4 lore raw

Re: [PATCH 3/3] tools bpftool: Display license GPL compatible in prog show/list

tools/bpf/bpftool/prog.c static void print_prog_plain(struct bpf_prog_info *info, int fd) · line 300

Quoted 5 lines · Jiri Olsa
tools/bpf/bpftool/prog.c +1 -0
@@ -295,6 +297,7 @@ static void print_prog_plain(struct bpf_prog_info *info, int fd)
 	printf("tag ");
 	fprint_hex(stdout, info->tag, BPF_TAG_SIZE, "");
 	print_dev_plain(info->ifindex, info->netns_dev, info->netns_ino);
+	printf(" license GPL %scompatible", info->gpl_compatible ? "" : "NON ");

3 nit picks:

Other "fields" are separated by two spaces between each other:

4: kprobe name func_begin tag 57cd311f2e27366b license GPL compatible

           ^^               ^^                    X
          loaded_at Apr 25/11:20  uid 0
                                ^^
          xlated 16B  not jited  memlock 4096B
                    ^^         ^^

Could you also update the example outputs in the man page:

tools/bpf/bpftool/Documentation/bpftool-prog.rst

Sorry about the bike shedding but I would also vote for:

"[not] GPL compatible"

rather than

"license GPL [NON] compatible"

for brevity..

maintainer
#5 lore raw

Re: [PATCH 3/3] tools bpftool: Display license GPL compatible in prog show/list

Quoted 24 lines · Jakub Kicinski

tools/bpf/bpftool/prog.c static void print_prog_plain(struct bpf_prog_info *info, int fd) · line 300

Quoted 5 lines · Jiri Olsa
tools/bpf/bpftool/prog.c +1 -0
@@ -295,6 +297,7 @@ static void print_prog_plain(struct bpf_prog_info *info, int fd)
 	printf("tag ");
 	fprint_hex(stdout, info->tag, BPF_TAG_SIZE, "");
 	print_dev_plain(info->ifindex, info->netns_dev, info->netns_ino);
+	printf(" license GPL %scompatible", info->gpl_compatible ? "" : "NON ");

3 nit picks:

Other "fields" are separated by two spaces between each other:

4: kprobe name func_begin tag 57cd311f2e27366b license GPL compatible

           ^^               ^^                    X
          loaded_at Apr 25/11:20  uid 0
                                ^^
          xlated 16B  not jited  memlock 4096B
                    ^^         ^^

Could you also update the example outputs in the man page:

tools/bpf/bpftool/Documentation/bpftool-prog.rst

Sorry about the bike shedding but I would also vote for:

Quoted 7 lines

"[not] GPL compatible"

rather than

"license GPL [NON] compatible"

for brevity..

While we're at it, can we also squeeze this whole thing a bit? Feels like huge string wasted for very little information compared to the rest of the dump. Just append the string "gpl" at the end of the line if info->gpl_compatible is set, otherwise just add nothing. This also allows to naturally grep for it e.g. bpftool p | grep gpl if you need a quick summary.

Thanks,
Daniel

#6 lore raw

Re: [PATCH 3/3] tools bpftool: Display license GPL compatible in prog show/list

Quoted 31 lines · Daniel Borkmann
Quoted 30 lines · Jakub Kicinski

tools/bpf/bpftool/prog.c static void print_prog_plain(struct bpf_prog_info *info, int fd) · line 300

Quoted 5 lines · Jiri Olsa
tools/bpf/bpftool/prog.c +1 -0
@@ -295,6 +297,7 @@ static void print_prog_plain(struct bpf_prog_info *info, int fd)
 	printf("tag ");
 	fprint_hex(stdout, info->tag, BPF_TAG_SIZE, "");
 	print_dev_plain(info->ifindex, info->netns_dev, info->netns_ino);
+	printf(" license GPL %scompatible", info->gpl_compatible ? "" : "NON ");

3 nit picks:

Other "fields" are separated by two spaces between each other:

4: kprobe name func_begin tag 57cd311f2e27366b license GPL compatible

           ^^               ^^                    X
          loaded_at Apr 25/11:20  uid 0
                                ^^
          xlated 16B  not jited  memlock 4096B
                    ^^         ^^

Could you also update the example outputs in the man page:

tools/bpf/bpftool/Documentation/bpftool-prog.rst

Sorry about the bike shedding but I would also vote for:

"[not] GPL compatible"

rather than

"license GPL [NON] compatible"

Quoted 7 lines
Quoted 1 line

for brevity..

While we're at it, can we also squeeze this whole thing a bit? Feels like huge string wasted for very little information compared to the rest of the dump. Just append the string "gpl" at the end of the line if info->gpl_compatible is set, otherwise just add nothing. This also allows to naturally grep for it e.g. bpftool p | grep gpl if you need a quick summary.

that's fine with me.. so 'gpl' in here:

5: tracepoint name func tag 57cd311f2e27366b gpl
loaded_at Apr 26/09:37 uid 0 xlated 16B not jited memlock 4096B

and keeping tyhe whole name in json output:

[{
        "id": 5,
        "type": "tracepoint",
        "name": "func",
        "tag": "57cd311f2e27366b",
        "gpl_compatible": true,
        "loaded_at": "Apr 26/09:37",
        "uid": 0,
        "bytes_xlated": 16,
        "jited": false,
        "bytes_memlock": 4096
    }

]

how about that?

thanks,
jirka

maintainer
#7 lore raw

Re: [PATCH 3/3] tools bpftool: Display license GPL compatible in prog show/list

Quoted 60 lines · Jiri Olsa
Quoted 31 lines · Daniel Borkmann
Quoted 30 lines · Jakub Kicinski

tools/bpf/bpftool/prog.c static void print_prog_plain(struct bpf_prog_info *info, int fd) · line 300

Quoted 5 lines · Jiri Olsa
tools/bpf/bpftool/prog.c +1 -0
@@ -295,6 +297,7 @@ static void print_prog_plain(struct bpf_prog_info *info, int fd)
 	printf("tag ");
 	fprint_hex(stdout, info->tag, BPF_TAG_SIZE, "");
 	print_dev_plain(info->ifindex, info->netns_dev, info->netns_ino);
+	printf(" license GPL %scompatible", info->gpl_compatible ? "" : "NON ");

3 nit picks:

Other "fields" are separated by two spaces between each other:

4: kprobe name func_begin tag 57cd311f2e27366b license GPL compatible

           ^^               ^^                    X
          loaded_at Apr 25/11:20  uid 0
                                ^^
          xlated 16B  not jited  memlock 4096B
                    ^^         ^^

Could you also update the example outputs in the man page:

tools/bpf/bpftool/Documentation/bpftool-prog.rst

Sorry about the bike shedding but I would also vote for:

"[not] GPL compatible"

rather than

"license GPL [NON] compatible"

Quoted 7 lines
Quoted 1 line

for brevity..

While we're at it, can we also squeeze this whole thing a bit? Feels like huge string wasted for very little information compared to the rest of the dump. Just append the string "gpl" at the end of the line if info->gpl_compatible is set, otherwise just add nothing. This also allows to naturally grep for it e.g. bpftool p | grep gpl if you need a quick summary.

that's fine with me.. so 'gpl' in here:

5: tracepoint name func tag 57cd311f2e27366b gpl
loaded_at Apr 26/09:37 uid 0 xlated 16B not jited memlock 4096B

and keeping tyhe whole name in json output:

[{
        "id": 5,
        "type": "tracepoint",
        "name": "func",
        "tag": "57cd311f2e27366b",
        "gpl_compatible": true,
        "loaded_at": "Apr 26/09:37",
        "uid": 0,
        "bytes_xlated": 16,
        "jited": false,
        "bytes_memlock": 4096
    }
Quoted 3 lines

]

how about that?

Sounds good, thanks Jiri!

#8 lore raw

PATCH v3 3/3 tools bpftool: Display license GPL compatible in prog show/list

Quoted 63 lines · Daniel Borkmann
Quoted 62 lines · Jiri Olsa
Quoted 31 lines · Daniel Borkmann
Quoted 30 lines · Jakub Kicinski

Review static void print_prog_plain(struct bpf_prog_info *info, int fd) · line 300

Quoted 5 lines · Jiri Olsa
(quoted diff) +1 -0
@@ -295,6 +297,7 @@ static void print_prog_plain(struct bpf_prog_info *info, int fd)
 	printf("tag ");
 	fprint_hex(stdout, info->tag, BPF_TAG_SIZE, "");
 	print_dev_plain(info->ifindex, info->netns_dev, info->netns_ino);
+	printf(" license GPL %scompatible", info->gpl_compatible ? "" : "NON ");

3 nit picks:

Other "fields" are separated by two spaces between each other:

4: kprobe name func_begin tag 57cd311f2e27366b license GPL compatible

           ^^               ^^                    X
          loaded_at Apr 25/11:20  uid 0
                                ^^
          xlated 16B  not jited  memlock 4096B
                    ^^         ^^

Could you also update the example outputs in the man page:

tools/bpf/bpftool/Documentation/bpftool-prog.rst

Sorry about the bike shedding but I would also vote for:

"[not] GPL compatible"

rather than

"license GPL [NON] compatible"

Quoted 7 lines
Quoted 1 line

for brevity..

While we're at it, can we also squeeze this whole thing a bit? Feels like huge string wasted for very little information compared to the rest of the dump. Just append the string "gpl" at the end of the line if info->gpl_compatible is set, otherwise just add nothing. This also allows to naturally grep for it e.g. bpftool p | grep gpl if you need a quick summary.

that's fine with me.. so 'gpl' in here:

5: tracepoint name func tag 57cd311f2e27366b gpl
loaded_at Apr 26/09:37 uid 0 xlated 16B not jited memlock 4096B

and keeping tyhe whole name in json output:

[{
        "id": 5,
        "type": "tracepoint",
        "name": "func",
        "tag": "57cd311f2e27366b",
        "gpl_compatible": true,
        "loaded_at": "Apr 26/09:37",
        "uid": 0,
        "bytes_xlated": 16,
        "jited": false,
        "bytes_memlock": 4096
    }

]

Quoted 3 lines
Quoted 1 line

how about that?

Sounds good, thanks Jiri!

v3 of the last patch attached, the branch is also updated

thanks,
jirka

---
Display the license "gpl" string in bpftool prog command, like:

  # bpftool prog list
  5: tracepoint  name func  tag 57cd311f2e27366b  gpl
          loaded_at Apr 26/09:37  uid 0
          xlated 16B  not jited  memlock 4096B
  # bpftool --json --pretty prog show
  [{
          "id": 5,
          "type": "tracepoint",
          "name": "func",
          "tag": "57cd311f2e27366b",
          "gpl_compatible": true,
          "loaded_at": "Apr 26/09:37",
          "uid": 0,
          "bytes_xlated": 16,
          "jited": false,
          "bytes_memlock": 4096
      }
  ]
---
 tools/bpf/bpftool/Documentation/bpftool-prog.rst | 3 ++-
 tools/bpf/bpftool/prog.c                         | 3 +++
 2 files changed, 5 insertions(+), 1 deletion(-)
tools/bpf/bpftool/Documentation/bpftool-prog.rst +2 -1
index 67ca6c69376c..43d34a5c3ec5 100644
@@ -95,7 +95,7 @@ EXAMPLES
 **# bpftool prog show**
 ::
 
-  10: xdp  name some_prog  tag 005a3d2123620c8b
+  10: xdp  name some_prog  tag 005a3d2123620c8b  gpl
 	loaded_at Sep 29/20:11  uid 0
 	xlated 528B  jited 370B  memlock 4096B  map_ids 10
 
@@ -108,6 +108,7 @@ EXAMPLES
                 "id": 10,
                 "type": "xdp",
                 "tag": "005a3d2123620c8b",
+                "gpl_compatible": true,
                 "loaded_at": "Sep 29/20:11",
                 "uid": 0,
                 "bytes_xlated": 528,
tools/bpf/bpftool/prog.c +3 -0
index 548adb9b7317..e71a0a11afde 100644
@@ -235,6 +235,8 @@ static void print_prog_json(struct bpf_prog_info *info, int fd)
 		     info->tag[0], info->tag[1], info->tag[2], info->tag[3],
 		     info->tag[4], info->tag[5], info->tag[6], info->tag[7]);
 
+	jsonw_bool_field(json_wtr, "gpl_compatible", info->gpl_compatible);
+
 	print_dev_json(info->ifindex, info->netns_dev, info->netns_ino);
 
 	if (info->load_time) {
@@ -295,6 +297,7 @@ static void print_prog_plain(struct bpf_prog_info *info, int fd)
 	printf("tag ");
 	fprint_hex(stdout, info->tag, BPF_TAG_SIZE, "");
 	print_dev_plain(info->ifindex, info->netns_dev, info->netns_ino);
+	printf("%s", info->gpl_compatible ? "  gpl" : "");
 	printf("\n");
 
 	if (info->load_time) {
Signature · 1 line
2.13.6
maintainer
#9 lore raw

Re: [PATCHv3 3/3] tools bpftool: Display license GPL compatible in prog show/list

On 04/26/2018 10:18 AM, Jiri Olsa wrote:
[...]

Quoted 29 lines

v3 of the last patch attached, the branch is also updated

thanks,
jirka

---
Display the license "gpl" string in bpftool prog command, like:

  # bpftool prog list
  5: tracepoint  name func  tag 57cd311f2e27366b  gpl
          loaded_at Apr 26/09:37  uid 0
          xlated 16B  not jited  memlock 4096B
  # bpftool --json --pretty prog show
  [{
          "id": 5,
          "type": "tracepoint",
          "name": "func",
          "tag": "57cd311f2e27366b",
          "gpl_compatible": true,
          "loaded_at": "Apr 26/09:37",
          "uid": 0,
          "bytes_xlated": 16,
          "jited": false,
          "bytes_memlock": 4096
      }
  ]
Quoted 1 line

Ok, v2 from prior two patches and v3 of this one applied to bpf-next. Please next time always submit a fresh new series at once, thanks Jiri.

#10 lore raw

Re: [PATCHv3 3/3] tools bpftool: Display license GPL compatible in prog show/list

Quoted 31 lines · Daniel Borkmann

On 04/26/2018 10:18 AM, Jiri Olsa wrote:
[...]

Quoted 29 lines

v3 of the last patch attached, the branch is also updated

thanks,
jirka

---
Display the license "gpl" string in bpftool prog command, like:

  # bpftool prog list
  5: tracepoint  name func  tag 57cd311f2e27366b  gpl
          loaded_at Apr 26/09:37  uid 0
          xlated 16B  not jited  memlock 4096B
  # bpftool --json --pretty prog show
  [{
          "id": 5,
          "type": "tracepoint",
          "name": "func",
          "tag": "57cd311f2e27366b",
          "gpl_compatible": true,
          "loaded_at": "Apr 26/09:37",
          "uid": 0,
          "bytes_xlated": 16,
          "jited": false,
          "bytes_memlock": 4096
      }
  ]
Quoted 4 lines
Quoted 1 line

Ok, v2 from prior two patches and v3 of this one applied to bpf-next. Please next time always submit a fresh new series at once, thanks Jiri.

noted, thanks a lot

jirka

#11 lore raw

Re: [PATCH 3/3] tools bpftool: Display license GPL compatible in prog show/list

In reply to Jakub Kicinski
Quoted 9 lines · Jakub Kicinski

tools/bpf/bpftool/prog.c static void print_prog_plain(struct bpf_prog_info *info, int fd) · line 300

Quoted 5 lines · Jiri Olsa
tools/bpf/bpftool/prog.c +1 -0
@@ -295,6 +297,7 @@ static void print_prog_plain(struct bpf_prog_info *info, int fd)
 	printf("tag ");
 	fprint_hex(stdout, info->tag, BPF_TAG_SIZE, "");
 	print_dev_plain(info->ifindex, info->netns_dev, info->netns_ino);
+	printf(" license GPL %scompatible", info->gpl_compatible ? "" : "NON ");

3 nit picks:

Quoted 9 lines

Other "fields" are separated by two spaces between each other:

4: kprobe name func_begin tag 57cd311f2e27366b license GPL compatible

           ^^               ^^                    X
          loaded_at Apr 25/11:20  uid 0
                                ^^
          xlated 16B  not jited  memlock 4096B
                    ^^         ^^

will change

Quoted 3 lines

Could you also update the example outputs in the man page:

tools/bpf/bpftool/Documentation/bpftool-prog.rst

oops, I always forget that.. will do

thanks,
jirka