Skip to content

Commit 779a459

Browse files
author
Alexei Starovoitov
committed
Merge branch 'bpftool-fixes'
Quentin Monnet says: ==================== Hi, Several items for bpftool are included in this set: the first three patches are fixes for bpftool itself and bash completion, while the last two slightly improve the information obtained when dumping programs or maps, on Daniel's suggestion. Please refer to individual commit logs for more details. ==================== Signed-off-by: Alexei Starovoitov <ast@kernel.org>
2 parents cc2b8ed + 99a44be commit 779a459

File tree

6 files changed

+129
-65
lines changed

6 files changed

+129
-65
lines changed

tools/bpf/bpftool/bash-completion/bpftool

Lines changed: 50 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -243,16 +243,20 @@ _bpftool()
243243
# Completion depends on object and command in use
244244
case $object in
245245
prog)
246-
if [[ $command != "load" && $command != "loadall" ]]; then
247-
case $prev in
248-
id)
249-
_bpftool_get_prog_ids
250-
return 0
251-
;;
252-
esac
253-
fi
246+
# Complete id, only for subcommands that use prog (but no map) ids
247+
case $command in
248+
show|list|dump|pin)
249+
case $prev in
250+
id)
251+
_bpftool_get_prog_ids
252+
return 0
253+
;;
254+
esac
255+
;;
256+
esac
254257

255258
local PROG_TYPE='id pinned tag'
259+
local MAP_TYPE='id pinned'
256260
case $command in
257261
show|list)
258262
[[ $prev != "$command" ]] && return 0
@@ -293,22 +297,43 @@ _bpftool()
293297
return 0
294298
;;
295299
attach|detach)
296-
if [[ ${#words[@]} == 7 ]]; then
297-
COMPREPLY=( $( compgen -W "id pinned" -- "$cur" ) )
298-
return 0
299-
fi
300-
301-
if [[ ${#words[@]} == 6 ]]; then
302-
COMPREPLY=( $( compgen -W "msg_verdict skb_verdict \
303-
skb_parse flow_dissector" -- "$cur" ) )
304-
return 0
305-
fi
306-
307-
if [[ $prev == "$command" ]]; then
308-
COMPREPLY=( $( compgen -W "id pinned" -- "$cur" ) )
309-
return 0
310-
fi
311-
return 0
300+
case $cword in
301+
3)
302+
COMPREPLY=( $( compgen -W "$PROG_TYPE" -- "$cur" ) )
303+
return 0
304+
;;
305+
4)
306+
case $prev in
307+
id)
308+
_bpftool_get_prog_ids
309+
;;
310+
pinned)
311+
_filedir
312+
;;
313+
esac
314+
return 0
315+
;;
316+
5)
317+
COMPREPLY=( $( compgen -W 'msg_verdict skb_verdict \
318+
skb_parse flow_dissector' -- "$cur" ) )
319+
return 0
320+
;;
321+
6)
322+
COMPREPLY=( $( compgen -W "$MAP_TYPE" -- "$cur" ) )
323+
return 0
324+
;;
325+
7)
326+
case $prev in
327+
id)
328+
_bpftool_get_map_ids
329+
;;
330+
pinned)
331+
_filedir
332+
;;
333+
esac
334+
return 0
335+
;;
336+
esac
312337
;;
313338
load|loadall)
314339
local obj
@@ -411,7 +436,7 @@ _bpftool()
411436
lru_percpu_hash lpm_trie array_of_maps \
412437
hash_of_maps devmap sockmap cpumap xskmap \
413438
sockhash cgroup_storage reuseport_sockarray \
414-
percpu_cgroup_storage' -- \
439+
percpu_cgroup_storage queue stack' -- \
415440
"$cur" ) )
416441
return 0
417442
;;

tools/bpf/bpftool/common.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@
4848
#include <sys/mount.h>
4949
#include <sys/resource.h>
5050
#include <sys/stat.h>
51-
#include <sys/types.h>
5251
#include <sys/vfs.h>
5352

5453
#include <bpf.h>
@@ -276,7 +275,7 @@ int get_fd_type(int fd)
276275
char buf[512];
277276
ssize_t n;
278277

279-
snprintf(path, sizeof(path), "/proc/%d/fd/%d", getpid(), fd);
278+
snprintf(path, sizeof(path), "/proc/self/fd/%d", fd);
280279

281280
n = readlink(path, buf, sizeof(buf));
282281
if (n < 0) {
@@ -304,7 +303,7 @@ char *get_fdinfo(int fd, const char *key)
304303
ssize_t n;
305304
FILE *fdi;
306305

307-
snprintf(path, sizeof(path), "/proc/%d/fdinfo/%d", getpid(), fd);
306+
snprintf(path, sizeof(path), "/proc/self/fdinfo/%d", fd);
308307

309308
fdi = fopen(path, "r");
310309
if (!fdi) {
@@ -605,7 +604,7 @@ void print_dev_plain(__u32 ifindex, __u64 ns_dev, __u64 ns_inode)
605604
if (!ifindex)
606605
return;
607606

608-
printf(" dev ");
607+
printf(" offloaded_to ");
609608
if (ifindex_to_name_ns(ifindex, ns_dev, ns_inode, name))
610609
printf("%s", name);
611610
else

tools/bpf/bpftool/jit_disasm.c

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
#include <string.h>
2020
#include <bfd.h>
2121
#include <dis-asm.h>
22-
#include <sys/types.h>
2322
#include <sys/stat.h>
2423
#include <limits.h>
2524

@@ -28,20 +27,12 @@
2827

2928
static void get_exec_path(char *tpath, size_t size)
3029
{
30+
const char *path = "/proc/self/exe";
3131
ssize_t len;
32-
char *path;
33-
34-
snprintf(tpath, size, "/proc/%d/exe", (int) getpid());
35-
tpath[size - 1] = 0;
36-
37-
path = strdup(tpath);
38-
assert(path);
3932

4033
len = readlink(path, tpath, size - 1);
4134
assert(len > 0);
4235
tpath[len] = 0;
43-
44-
free(path);
4536
}
4637

4738
static int oper_count;

tools/bpf/bpftool/main.h

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,32 @@
7878
#define HELP_SPEC_MAP \
7979
"MAP := { id MAP_ID | pinned FILE }"
8080

81+
static const char * const prog_type_name[] = {
82+
[BPF_PROG_TYPE_UNSPEC] = "unspec",
83+
[BPF_PROG_TYPE_SOCKET_FILTER] = "socket_filter",
84+
[BPF_PROG_TYPE_KPROBE] = "kprobe",
85+
[BPF_PROG_TYPE_SCHED_CLS] = "sched_cls",
86+
[BPF_PROG_TYPE_SCHED_ACT] = "sched_act",
87+
[BPF_PROG_TYPE_TRACEPOINT] = "tracepoint",
88+
[BPF_PROG_TYPE_XDP] = "xdp",
89+
[BPF_PROG_TYPE_PERF_EVENT] = "perf_event",
90+
[BPF_PROG_TYPE_CGROUP_SKB] = "cgroup_skb",
91+
[BPF_PROG_TYPE_CGROUP_SOCK] = "cgroup_sock",
92+
[BPF_PROG_TYPE_LWT_IN] = "lwt_in",
93+
[BPF_PROG_TYPE_LWT_OUT] = "lwt_out",
94+
[BPF_PROG_TYPE_LWT_XMIT] = "lwt_xmit",
95+
[BPF_PROG_TYPE_SOCK_OPS] = "sock_ops",
96+
[BPF_PROG_TYPE_SK_SKB] = "sk_skb",
97+
[BPF_PROG_TYPE_CGROUP_DEVICE] = "cgroup_device",
98+
[BPF_PROG_TYPE_SK_MSG] = "sk_msg",
99+
[BPF_PROG_TYPE_RAW_TRACEPOINT] = "raw_tracepoint",
100+
[BPF_PROG_TYPE_CGROUP_SOCK_ADDR] = "cgroup_sock_addr",
101+
[BPF_PROG_TYPE_LWT_SEG6LOCAL] = "lwt_seg6local",
102+
[BPF_PROG_TYPE_LIRC_MODE2] = "lirc_mode2",
103+
[BPF_PROG_TYPE_SK_REUSEPORT] = "sk_reuseport",
104+
[BPF_PROG_TYPE_FLOW_DISSECTOR] = "flow_dissector",
105+
};
106+
81107
enum bpf_obj_type {
82108
BPF_OBJ_UNKNOWN,
83109
BPF_OBJ_PROG,

tools/bpf/bpftool/map.c

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -487,7 +487,6 @@ static int show_map_close_json(int fd, struct bpf_map_info *info)
487487
char *memlock;
488488

489489
memlock = get_fdinfo(fd, "memlock");
490-
close(fd);
491490

492491
jsonw_start_object(json_wtr);
493492

@@ -514,6 +513,30 @@ static int show_map_close_json(int fd, struct bpf_map_info *info)
514513
jsonw_int_field(json_wtr, "bytes_memlock", atoi(memlock));
515514
free(memlock);
516515

516+
if (info->type == BPF_MAP_TYPE_PROG_ARRAY) {
517+
char *owner_prog_type = get_fdinfo(fd, "owner_prog_type");
518+
char *owner_jited = get_fdinfo(fd, "owner_jited");
519+
520+
if (owner_prog_type) {
521+
unsigned int prog_type = atoi(owner_prog_type);
522+
523+
if (prog_type < ARRAY_SIZE(prog_type_name))
524+
jsonw_string_field(json_wtr, "owner_prog_type",
525+
prog_type_name[prog_type]);
526+
else
527+
jsonw_uint_field(json_wtr, "owner_prog_type",
528+
prog_type);
529+
}
530+
if (atoi(owner_jited))
531+
jsonw_bool_field(json_wtr, "owner_jited", true);
532+
else
533+
jsonw_bool_field(json_wtr, "owner_jited", false);
534+
535+
free(owner_prog_type);
536+
free(owner_jited);
537+
}
538+
close(fd);
539+
517540
if (!hash_empty(map_table.table)) {
518541
struct pinned_obj *obj;
519542

@@ -536,7 +559,6 @@ static int show_map_close_plain(int fd, struct bpf_map_info *info)
536559
char *memlock;
537560

538561
memlock = get_fdinfo(fd, "memlock");
539-
close(fd);
540562

541563
printf("%u: ", info->id);
542564
if (info->type < ARRAY_SIZE(map_type_name))
@@ -557,6 +579,30 @@ static int show_map_close_plain(int fd, struct bpf_map_info *info)
557579
printf(" memlock %sB", memlock);
558580
free(memlock);
559581

582+
if (info->type == BPF_MAP_TYPE_PROG_ARRAY) {
583+
char *owner_prog_type = get_fdinfo(fd, "owner_prog_type");
584+
char *owner_jited = get_fdinfo(fd, "owner_jited");
585+
586+
printf("\n\t");
587+
if (owner_prog_type) {
588+
unsigned int prog_type = atoi(owner_prog_type);
589+
590+
if (prog_type < ARRAY_SIZE(prog_type_name))
591+
printf("owner_prog_type %s ",
592+
prog_type_name[prog_type]);
593+
else
594+
printf("owner_prog_type %d ", prog_type);
595+
}
596+
if (atoi(owner_jited))
597+
printf("owner jited");
598+
else
599+
printf("owner not jited");
600+
601+
free(owner_prog_type);
602+
free(owner_jited);
603+
}
604+
close(fd);
605+
560606
printf("\n");
561607
if (!hash_empty(map_table.table)) {
562608
struct pinned_obj *obj;

tools/bpf/bpftool/prog.c

Lines changed: 1 addition & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -54,30 +54,6 @@
5454
#include "main.h"
5555
#include "xlated_dumper.h"
5656

57-
static const char * const prog_type_name[] = {
58-
[BPF_PROG_TYPE_UNSPEC] = "unspec",
59-
[BPF_PROG_TYPE_SOCKET_FILTER] = "socket_filter",
60-
[BPF_PROG_TYPE_KPROBE] = "kprobe",
61-
[BPF_PROG_TYPE_SCHED_CLS] = "sched_cls",
62-
[BPF_PROG_TYPE_SCHED_ACT] = "sched_act",
63-
[BPF_PROG_TYPE_TRACEPOINT] = "tracepoint",
64-
[BPF_PROG_TYPE_XDP] = "xdp",
65-
[BPF_PROG_TYPE_PERF_EVENT] = "perf_event",
66-
[BPF_PROG_TYPE_CGROUP_SKB] = "cgroup_skb",
67-
[BPF_PROG_TYPE_CGROUP_SOCK] = "cgroup_sock",
68-
[BPF_PROG_TYPE_LWT_IN] = "lwt_in",
69-
[BPF_PROG_TYPE_LWT_OUT] = "lwt_out",
70-
[BPF_PROG_TYPE_LWT_XMIT] = "lwt_xmit",
71-
[BPF_PROG_TYPE_SOCK_OPS] = "sock_ops",
72-
[BPF_PROG_TYPE_SK_SKB] = "sk_skb",
73-
[BPF_PROG_TYPE_CGROUP_DEVICE] = "cgroup_device",
74-
[BPF_PROG_TYPE_SK_MSG] = "sk_msg",
75-
[BPF_PROG_TYPE_RAW_TRACEPOINT] = "raw_tracepoint",
76-
[BPF_PROG_TYPE_CGROUP_SOCK_ADDR] = "cgroup_sock_addr",
77-
[BPF_PROG_TYPE_LIRC_MODE2] = "lirc_mode2",
78-
[BPF_PROG_TYPE_FLOW_DISSECTOR] = "flow_dissector",
79-
};
80-
8157
static const char * const attach_type_strings[] = {
8258
[BPF_SK_SKB_STREAM_PARSER] = "stream_parser",
8359
[BPF_SK_SKB_STREAM_VERDICT] = "stream_verdict",
@@ -1172,6 +1148,7 @@ static int do_help(int argc, char **argv)
11721148
" tracepoint | raw_tracepoint | xdp | perf_event | cgroup/skb |\n"
11731149
" cgroup/sock | cgroup/dev | lwt_in | lwt_out | lwt_xmit |\n"
11741150
" lwt_seg6local | sockops | sk_skb | sk_msg | lirc_mode2 |\n"
1151+
" sk_reuseport | flow_dissector |\n"
11751152
" cgroup/bind4 | cgroup/bind6 | cgroup/post_bind4 |\n"
11761153
" cgroup/post_bind6 | cgroup/connect4 | cgroup/connect6 |\n"
11771154
" cgroup/sendmsg4 | cgroup/sendmsg6 }\n"

0 commit comments

Comments
 (0)