1*4882a593Smuzhiyun================ 2*4882a593Smuzhiyunbpftool-prog 3*4882a593Smuzhiyun================ 4*4882a593Smuzhiyun------------------------------------------------------------------------------- 5*4882a593Smuzhiyuntool for inspection and simple manipulation of eBPF progs 6*4882a593Smuzhiyun------------------------------------------------------------------------------- 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun:Manual section: 8 9*4882a593Smuzhiyun 10*4882a593SmuzhiyunSYNOPSIS 11*4882a593Smuzhiyun======== 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun **bpftool** [*OPTIONS*] **prog** *COMMAND* 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun *OPTIONS* := { { **-j** | **--json** } [{ **-p** | **--pretty** }] | { **-f** | **--bpffs** } } 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun *COMMANDS* := 18*4882a593Smuzhiyun { **show** | **list** | **dump xlated** | **dump jited** | **pin** | **load** 19*4882a593Smuzhiyun | **loadall** | **help** } 20*4882a593Smuzhiyun 21*4882a593SmuzhiyunPROG COMMANDS 22*4882a593Smuzhiyun============= 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun| **bpftool** **prog** { **show** | **list** } [*PROG*] 25*4882a593Smuzhiyun| **bpftool** **prog dump xlated** *PROG* [{**file** *FILE* | **opcodes** | **visual** | **linum**}] 26*4882a593Smuzhiyun| **bpftool** **prog dump jited** *PROG* [{**file** *FILE* | **opcodes** | **linum**}] 27*4882a593Smuzhiyun| **bpftool** **prog pin** *PROG* *FILE* 28*4882a593Smuzhiyun| **bpftool** **prog** { **load** | **loadall** } *OBJ* *PATH* [**type** *TYPE*] [**map** {**idx** *IDX* | **name** *NAME*} *MAP*] [**dev** *NAME*] [**pinmaps** *MAP_DIR*] 29*4882a593Smuzhiyun| **bpftool** **prog attach** *PROG* *ATTACH_TYPE* [*MAP*] 30*4882a593Smuzhiyun| **bpftool** **prog detach** *PROG* *ATTACH_TYPE* [*MAP*] 31*4882a593Smuzhiyun| **bpftool** **prog tracelog** 32*4882a593Smuzhiyun| **bpftool** **prog run** *PROG* **data_in** *FILE* [**data_out** *FILE* [**data_size_out** *L*]] [**ctx_in** *FILE* [**ctx_out** *FILE* [**ctx_size_out** *M*]]] [**repeat** *N*] 33*4882a593Smuzhiyun| **bpftool** **prog profile** *PROG* [**duration** *DURATION*] *METRICs* 34*4882a593Smuzhiyun| **bpftool** **prog help** 35*4882a593Smuzhiyun| 36*4882a593Smuzhiyun| *MAP* := { **id** *MAP_ID* | **pinned** *FILE* } 37*4882a593Smuzhiyun| *PROG* := { **id** *PROG_ID* | **pinned** *FILE* | **tag** *PROG_TAG* | **name** *PROG_NAME* } 38*4882a593Smuzhiyun| *TYPE* := { 39*4882a593Smuzhiyun| **socket** | **kprobe** | **kretprobe** | **classifier** | **action** | 40*4882a593Smuzhiyun| **tracepoint** | **raw_tracepoint** | **xdp** | **perf_event** | **cgroup/skb** | 41*4882a593Smuzhiyun| **cgroup/sock** | **cgroup/dev** | **lwt_in** | **lwt_out** | **lwt_xmit** | 42*4882a593Smuzhiyun| **lwt_seg6local** | **sockops** | **sk_skb** | **sk_msg** | **lirc_mode2** | 43*4882a593Smuzhiyun| **cgroup/bind4** | **cgroup/bind6** | **cgroup/post_bind4** | **cgroup/post_bind6** | 44*4882a593Smuzhiyun| **cgroup/connect4** | **cgroup/connect6** | **cgroup/getpeername4** | **cgroup/getpeername6** | 45*4882a593Smuzhiyun| **cgroup/getsockname4** | **cgroup/getsockname6** | **cgroup/sendmsg4** | **cgroup/sendmsg6** | 46*4882a593Smuzhiyun| **cgroup/recvmsg4** | **cgroup/recvmsg6** | **cgroup/sysctl** | 47*4882a593Smuzhiyun| **cgroup/getsockopt** | **cgroup/setsockopt** | **cgroup/sock_release** | 48*4882a593Smuzhiyun| **struct_ops** | **fentry** | **fexit** | **freplace** | **sk_lookup** 49*4882a593Smuzhiyun| } 50*4882a593Smuzhiyun| *ATTACH_TYPE* := { 51*4882a593Smuzhiyun| **msg_verdict** | **stream_verdict** | **stream_parser** | **flow_dissector** 52*4882a593Smuzhiyun| } 53*4882a593Smuzhiyun| *METRICs* := { 54*4882a593Smuzhiyun| **cycles** | **instructions** | **l1d_loads** | **llc_misses** 55*4882a593Smuzhiyun| } 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun 58*4882a593SmuzhiyunDESCRIPTION 59*4882a593Smuzhiyun=========== 60*4882a593Smuzhiyun **bpftool prog { show | list }** [*PROG*] 61*4882a593Smuzhiyun Show information about loaded programs. If *PROG* is 62*4882a593Smuzhiyun specified show information only about given programs, 63*4882a593Smuzhiyun otherwise list all programs currently loaded on the system. 64*4882a593Smuzhiyun In case of **tag** or **name**, *PROG* may match several 65*4882a593Smuzhiyun programs which will all be shown. 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun Output will start with program ID followed by program type and 68*4882a593Smuzhiyun zero or more named attributes (depending on kernel version). 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun Since Linux 5.1 the kernel can collect statistics on BPF 71*4882a593Smuzhiyun programs (such as the total time spent running the program, 72*4882a593Smuzhiyun and the number of times it was run). If available, bpftool 73*4882a593Smuzhiyun shows such statistics. However, the kernel does not collect 74*4882a593Smuzhiyun them by defaults, as it slightly impacts performance on each 75*4882a593Smuzhiyun program run. Activation or deactivation of the feature is 76*4882a593Smuzhiyun performed via the **kernel.bpf_stats_enabled** sysctl knob. 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun Since Linux 5.8 bpftool is able to discover information about 79*4882a593Smuzhiyun processes that hold open file descriptors (FDs) against BPF 80*4882a593Smuzhiyun programs. On such kernels bpftool will automatically emit this 81*4882a593Smuzhiyun information as well. 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun **bpftool prog dump xlated** *PROG* [{ **file** *FILE* | **opcodes** | **visual** | **linum** }] 84*4882a593Smuzhiyun Dump eBPF instructions of the programs from the kernel. By 85*4882a593Smuzhiyun default, eBPF will be disassembled and printed to standard 86*4882a593Smuzhiyun output in human-readable format. In this case, **opcodes** 87*4882a593Smuzhiyun controls if raw opcodes should be printed as well. 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun In case of **tag** or **name**, *PROG* may match several 90*4882a593Smuzhiyun programs which will all be dumped. However, if **file** or 91*4882a593Smuzhiyun **visual** is specified, *PROG* must match a single program. 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun If **file** is specified, the binary image will instead be 94*4882a593Smuzhiyun written to *FILE*. 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun If **visual** is specified, control flow graph (CFG) will be 97*4882a593Smuzhiyun built instead, and eBPF instructions will be presented with 98*4882a593Smuzhiyun CFG in DOT format, on standard output. 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun If the programs have line_info available, the source line will 101*4882a593Smuzhiyun be displayed by default. If **linum** is specified, 102*4882a593Smuzhiyun the filename, line number and line column will also be 103*4882a593Smuzhiyun displayed on top of the source line. 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun **bpftool prog dump jited** *PROG* [{ **file** *FILE* | **opcodes** | **linum** }] 106*4882a593Smuzhiyun Dump jited image (host machine code) of the program. 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun If *FILE* is specified image will be written to a file, 109*4882a593Smuzhiyun otherwise it will be disassembled and printed to stdout. 110*4882a593Smuzhiyun *PROG* must match a single program when **file** is specified. 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun **opcodes** controls if raw opcodes will be printed. 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun If the prog has line_info available, the source line will 115*4882a593Smuzhiyun be displayed by default. If **linum** is specified, 116*4882a593Smuzhiyun the filename, line number and line column will also be 117*4882a593Smuzhiyun displayed on top of the source line. 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun **bpftool prog pin** *PROG* *FILE* 120*4882a593Smuzhiyun Pin program *PROG* as *FILE*. 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun Note: *FILE* must be located in *bpffs* mount. It must not 123*4882a593Smuzhiyun contain a dot character ('.'), which is reserved for future 124*4882a593Smuzhiyun extensions of *bpffs*. 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun **bpftool prog { load | loadall }** *OBJ* *PATH* [**type** *TYPE*] [**map** {**idx** *IDX* | **name** *NAME*} *MAP*] [**dev** *NAME*] [**pinmaps** *MAP_DIR*] 127*4882a593Smuzhiyun Load bpf program(s) from binary *OBJ* and pin as *PATH*. 128*4882a593Smuzhiyun **bpftool prog load** pins only the first program from the 129*4882a593Smuzhiyun *OBJ* as *PATH*. **bpftool prog loadall** pins all programs 130*4882a593Smuzhiyun from the *OBJ* under *PATH* directory. 131*4882a593Smuzhiyun **type** is optional, if not specified program type will be 132*4882a593Smuzhiyun inferred from section names. 133*4882a593Smuzhiyun By default bpftool will create new maps as declared in the ELF 134*4882a593Smuzhiyun object being loaded. **map** parameter allows for the reuse 135*4882a593Smuzhiyun of existing maps. It can be specified multiple times, each 136*4882a593Smuzhiyun time for a different map. *IDX* refers to index of the map 137*4882a593Smuzhiyun to be replaced in the ELF file counting from 0, while *NAME* 138*4882a593Smuzhiyun allows to replace a map by name. *MAP* specifies the map to 139*4882a593Smuzhiyun use, referring to it by **id** or through a **pinned** file. 140*4882a593Smuzhiyun If **dev** *NAME* is specified program will be loaded onto 141*4882a593Smuzhiyun given networking device (offload). 142*4882a593Smuzhiyun Optional **pinmaps** argument can be provided to pin all 143*4882a593Smuzhiyun maps under *MAP_DIR* directory. 144*4882a593Smuzhiyun 145*4882a593Smuzhiyun Note: *PATH* must be located in *bpffs* mount. It must not 146*4882a593Smuzhiyun contain a dot character ('.'), which is reserved for future 147*4882a593Smuzhiyun extensions of *bpffs*. 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun **bpftool prog attach** *PROG* *ATTACH_TYPE* [*MAP*] 150*4882a593Smuzhiyun Attach bpf program *PROG* (with type specified by 151*4882a593Smuzhiyun *ATTACH_TYPE*). Most *ATTACH_TYPEs* require a *MAP* 152*4882a593Smuzhiyun parameter, with the exception of *flow_dissector* which is 153*4882a593Smuzhiyun attached to current networking name space. 154*4882a593Smuzhiyun 155*4882a593Smuzhiyun **bpftool prog detach** *PROG* *ATTACH_TYPE* [*MAP*] 156*4882a593Smuzhiyun Detach bpf program *PROG* (with type specified by 157*4882a593Smuzhiyun *ATTACH_TYPE*). Most *ATTACH_TYPEs* require a *MAP* 158*4882a593Smuzhiyun parameter, with the exception of *flow_dissector* which is 159*4882a593Smuzhiyun detached from the current networking name space. 160*4882a593Smuzhiyun 161*4882a593Smuzhiyun **bpftool prog tracelog** 162*4882a593Smuzhiyun Dump the trace pipe of the system to the console (stdout). 163*4882a593Smuzhiyun Hit <Ctrl+C> to stop printing. BPF programs can write to this 164*4882a593Smuzhiyun trace pipe at runtime with the **bpf_trace_printk**\ () helper. 165*4882a593Smuzhiyun This should be used only for debugging purposes. For 166*4882a593Smuzhiyun streaming data from BPF programs to user space, one can use 167*4882a593Smuzhiyun perf events (see also **bpftool-map**\ (8)). 168*4882a593Smuzhiyun 169*4882a593Smuzhiyun **bpftool prog run** *PROG* **data_in** *FILE* [**data_out** *FILE* [**data_size_out** *L*]] [**ctx_in** *FILE* [**ctx_out** *FILE* [**ctx_size_out** *M*]]] [**repeat** *N*] 170*4882a593Smuzhiyun Run BPF program *PROG* in the kernel testing infrastructure 171*4882a593Smuzhiyun for BPF, meaning that the program works on the data and 172*4882a593Smuzhiyun context provided by the user, and not on actual packets or 173*4882a593Smuzhiyun monitored functions etc. Return value and duration for the 174*4882a593Smuzhiyun test run are printed out to the console. 175*4882a593Smuzhiyun 176*4882a593Smuzhiyun Input data is read from the *FILE* passed with **data_in**. 177*4882a593Smuzhiyun If this *FILE* is "**-**", input data is read from standard 178*4882a593Smuzhiyun input. Input context, if any, is read from *FILE* passed with 179*4882a593Smuzhiyun **ctx_in**. Again, "**-**" can be used to read from standard 180*4882a593Smuzhiyun input, but only if standard input is not already in use for 181*4882a593Smuzhiyun input data. If a *FILE* is passed with **data_out**, output 182*4882a593Smuzhiyun data is written to that file. Similarly, output context is 183*4882a593Smuzhiyun written to the *FILE* passed with **ctx_out**. For both 184*4882a593Smuzhiyun output flows, "**-**" can be used to print to the standard 185*4882a593Smuzhiyun output (as plain text, or JSON if relevant option was 186*4882a593Smuzhiyun passed). If output keywords are omitted, output data and 187*4882a593Smuzhiyun context are discarded. Keywords **data_size_out** and 188*4882a593Smuzhiyun **ctx_size_out** are used to pass the size (in bytes) for the 189*4882a593Smuzhiyun output buffers to the kernel, although the default of 32 kB 190*4882a593Smuzhiyun should be more than enough for most cases. 191*4882a593Smuzhiyun 192*4882a593Smuzhiyun Keyword **repeat** is used to indicate the number of 193*4882a593Smuzhiyun consecutive runs to perform. Note that output data and 194*4882a593Smuzhiyun context printed to files correspond to the last of those 195*4882a593Smuzhiyun runs. The duration printed out at the end of the runs is an 196*4882a593Smuzhiyun average over all runs performed by the command. 197*4882a593Smuzhiyun 198*4882a593Smuzhiyun Not all program types support test run. Among those which do, 199*4882a593Smuzhiyun not all of them can take the **ctx_in**/**ctx_out** 200*4882a593Smuzhiyun arguments. bpftool does not perform checks on program types. 201*4882a593Smuzhiyun 202*4882a593Smuzhiyun **bpftool prog profile** *PROG* [**duration** *DURATION*] *METRICs* 203*4882a593Smuzhiyun Profile *METRICs* for bpf program *PROG* for *DURATION* 204*4882a593Smuzhiyun seconds or until user hits <Ctrl+C>. *DURATION* is optional. 205*4882a593Smuzhiyun If *DURATION* is not specified, the profiling will run up to 206*4882a593Smuzhiyun **UINT_MAX** seconds. 207*4882a593Smuzhiyun 208*4882a593Smuzhiyun **bpftool prog help** 209*4882a593Smuzhiyun Print short help message. 210*4882a593Smuzhiyun 211*4882a593SmuzhiyunOPTIONS 212*4882a593Smuzhiyun======= 213*4882a593Smuzhiyun .. include:: common_options.rst 214*4882a593Smuzhiyun 215*4882a593Smuzhiyun -f, --bpffs 216*4882a593Smuzhiyun When showing BPF programs, show file names of pinned 217*4882a593Smuzhiyun programs. 218*4882a593Smuzhiyun 219*4882a593Smuzhiyun -m, --mapcompat 220*4882a593Smuzhiyun Allow loading maps with unknown map definitions. 221*4882a593Smuzhiyun 222*4882a593Smuzhiyun -n, --nomount 223*4882a593Smuzhiyun Do not automatically attempt to mount any virtual file system 224*4882a593Smuzhiyun (such as tracefs or BPF virtual file system) when necessary. 225*4882a593Smuzhiyun 226*4882a593SmuzhiyunEXAMPLES 227*4882a593Smuzhiyun======== 228*4882a593Smuzhiyun**# bpftool prog show** 229*4882a593Smuzhiyun 230*4882a593Smuzhiyun:: 231*4882a593Smuzhiyun 232*4882a593Smuzhiyun 10: xdp name some_prog tag 005a3d2123620c8b gpl run_time_ns 81632 run_cnt 10 233*4882a593Smuzhiyun loaded_at 2017-09-29T20:11:00+0000 uid 0 234*4882a593Smuzhiyun xlated 528B jited 370B memlock 4096B map_ids 10 235*4882a593Smuzhiyun pids systemd(1) 236*4882a593Smuzhiyun 237*4882a593Smuzhiyun**# bpftool --json --pretty prog show** 238*4882a593Smuzhiyun 239*4882a593Smuzhiyun:: 240*4882a593Smuzhiyun 241*4882a593Smuzhiyun [{ 242*4882a593Smuzhiyun "id": 10, 243*4882a593Smuzhiyun "type": "xdp", 244*4882a593Smuzhiyun "tag": "005a3d2123620c8b", 245*4882a593Smuzhiyun "gpl_compatible": true, 246*4882a593Smuzhiyun "run_time_ns": 81632, 247*4882a593Smuzhiyun "run_cnt": 10, 248*4882a593Smuzhiyun "loaded_at": 1506715860, 249*4882a593Smuzhiyun "uid": 0, 250*4882a593Smuzhiyun "bytes_xlated": 528, 251*4882a593Smuzhiyun "jited": true, 252*4882a593Smuzhiyun "bytes_jited": 370, 253*4882a593Smuzhiyun "bytes_memlock": 4096, 254*4882a593Smuzhiyun "map_ids": [10 255*4882a593Smuzhiyun ], 256*4882a593Smuzhiyun "pids": [{ 257*4882a593Smuzhiyun "pid": 1, 258*4882a593Smuzhiyun "comm": "systemd" 259*4882a593Smuzhiyun } 260*4882a593Smuzhiyun ] 261*4882a593Smuzhiyun } 262*4882a593Smuzhiyun ] 263*4882a593Smuzhiyun 264*4882a593Smuzhiyun| 265*4882a593Smuzhiyun| **# bpftool prog dump xlated id 10 file /tmp/t** 266*4882a593Smuzhiyun| **$ ls -l /tmp/t** 267*4882a593Smuzhiyun 268*4882a593Smuzhiyun:: 269*4882a593Smuzhiyun 270*4882a593Smuzhiyun -rw------- 1 root root 560 Jul 22 01:42 /tmp/t 271*4882a593Smuzhiyun 272*4882a593Smuzhiyun**# bpftool prog dump jited tag 005a3d2123620c8b** 273*4882a593Smuzhiyun 274*4882a593Smuzhiyun:: 275*4882a593Smuzhiyun 276*4882a593Smuzhiyun 0: push %rbp 277*4882a593Smuzhiyun 1: mov %rsp,%rbp 278*4882a593Smuzhiyun 2: sub $0x228,%rsp 279*4882a593Smuzhiyun 3: sub $0x28,%rbp 280*4882a593Smuzhiyun 4: mov %rbx,0x0(%rbp) 281*4882a593Smuzhiyun 282*4882a593Smuzhiyun| 283*4882a593Smuzhiyun| **# mount -t bpf none /sys/fs/bpf/** 284*4882a593Smuzhiyun| **# bpftool prog pin id 10 /sys/fs/bpf/prog** 285*4882a593Smuzhiyun| **# bpftool prog load ./my_prog.o /sys/fs/bpf/prog2** 286*4882a593Smuzhiyun| **# ls -l /sys/fs/bpf/** 287*4882a593Smuzhiyun 288*4882a593Smuzhiyun:: 289*4882a593Smuzhiyun 290*4882a593Smuzhiyun -rw------- 1 root root 0 Jul 22 01:43 prog 291*4882a593Smuzhiyun -rw------- 1 root root 0 Jul 22 01:44 prog2 292*4882a593Smuzhiyun 293*4882a593Smuzhiyun**# bpftool prog dump jited pinned /sys/fs/bpf/prog opcodes** 294*4882a593Smuzhiyun 295*4882a593Smuzhiyun:: 296*4882a593Smuzhiyun 297*4882a593Smuzhiyun 0: push %rbp 298*4882a593Smuzhiyun 55 299*4882a593Smuzhiyun 1: mov %rsp,%rbp 300*4882a593Smuzhiyun 48 89 e5 301*4882a593Smuzhiyun 4: sub $0x228,%rsp 302*4882a593Smuzhiyun 48 81 ec 28 02 00 00 303*4882a593Smuzhiyun b: sub $0x28,%rbp 304*4882a593Smuzhiyun 48 83 ed 28 305*4882a593Smuzhiyun f: mov %rbx,0x0(%rbp) 306*4882a593Smuzhiyun 48 89 5d 00 307*4882a593Smuzhiyun 308*4882a593Smuzhiyun| 309*4882a593Smuzhiyun| **# bpftool prog load xdp1_kern.o /sys/fs/bpf/xdp1 type xdp map name rxcnt id 7** 310*4882a593Smuzhiyun| **# bpftool prog show pinned /sys/fs/bpf/xdp1** 311*4882a593Smuzhiyun 312*4882a593Smuzhiyun:: 313*4882a593Smuzhiyun 314*4882a593Smuzhiyun 9: xdp name xdp_prog1 tag 539ec6ce11b52f98 gpl 315*4882a593Smuzhiyun loaded_at 2018-06-25T16:17:31-0700 uid 0 316*4882a593Smuzhiyun xlated 488B jited 336B memlock 4096B map_ids 7 317*4882a593Smuzhiyun 318*4882a593Smuzhiyun**# rm /sys/fs/bpf/xdp1** 319*4882a593Smuzhiyun 320*4882a593Smuzhiyun| 321*4882a593Smuzhiyun| **# bpftool prog profile id 337 duration 10 cycles instructions llc_misses** 322*4882a593Smuzhiyun 323*4882a593Smuzhiyun:: 324*4882a593Smuzhiyun 325*4882a593Smuzhiyun 51397 run_cnt 326*4882a593Smuzhiyun 40176203 cycles (83.05%) 327*4882a593Smuzhiyun 42518139 instructions # 1.06 insns per cycle (83.39%) 328*4882a593Smuzhiyun 123 llc_misses # 2.89 LLC misses per million insns (83.15%) 329