1BPFTOOL-PROG(8)                                                BPFTOOL-PROG(8)
2
3
4

NAME

6       bpftool-prog  -  tool  for  inspection  and simple manipulation of eBPF
7       progs
8

SYNOPSIS

10          bpftool [OPTIONS] prog COMMAND
11
12          OPTIONS := { { -j | --json } [{ -p | --pretty }] | { -d | --debug  }
13          |
14                 {  -f | --bpffs } | { -m | --mapcompat } | { -n | --nomount }
15                 | { -L | --use-loader } }
16
17          COMMANDS := { show | list | dump xlated | dump jited | pin | load  |
18          loadall | help }
19

PROG COMMANDS

21       bpftool prog { show | list } [PROG]
22       bpftool prog dump xlated PROG [{file FILE | opcodes | visual | linum}]
23       bpftool prog dump jited  PROG [{file FILE | opcodes | linum}]
24       bpftool prog pin PROG FILE
25       bpftool prog { load | loadall } OBJ PATH [type TYPE] [map {idx IDX | name NAME} MAP] [dev NAME] [pinmaps MAP_DIR]
26       bpftool prog attach PROG ATTACH_TYPE [MAP]
27       bpftool prog detach PROG ATTACH_TYPE [MAP]
28       bpftool prog tracelog
29       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]
30       bpftool prog profile PROG [duration DURATION] METRICs
31       bpftool prog help
32
33       MAP := { id MAP_ID | pinned FILE }
34       PROG := { id PROG_ID | pinned FILE | tag PROG_TAG | name PROG_NAME }
35       TYPE := {
36         socket | kprobe | kretprobe | classifier | action |
37         tracepoint | raw_tracepoint | xdp | perf_event | cgroup/skb |
38         cgroup/sock | cgroup/dev | lwt_in | lwt_out | lwt_xmit |
39         lwt_seg6local | sockops | sk_skb | sk_msg | lirc_mode2 |
40         cgroup/bind4 | cgroup/bind6 | cgroup/post_bind4 | cgroup/post_bind6 |
41         cgroup/connect4 | cgroup/connect6 | cgroup/getpeername4 | cgroup/getpeername6 |
42         cgroup/getsockname4 | cgroup/getsockname6 | cgroup/sendmsg4 | cgroup/sendmsg6 |
43         cgroup/recvmsg4 | cgroup/recvmsg6 | cgroup/sysctl |
44         cgroup/getsockopt | cgroup/setsockopt | cgroup/sock_release |
45         struct_ops | fentry | fexit | freplace | sk_lookup
46       }
47       ATTACH_TYPE := {
48         msg_verdict | skb_verdict | stream_verdict | stream_parser | flow_dissector
49       }
50       METRICs := {
51         cycles | instructions | l1d_loads | llc_misses |
52         itlb_misses | dtlb_misses
53       }
54
55

DESCRIPTION

57          bpftool prog { show | list } [PROG]
58                 Show information about loaded programs.  If PROG is specified
59                 show information only about given  programs,  otherwise  list
60                 all  programs currently loaded on the system.  In case of tag
61                 or name, PROG may match several programs which  will  all  be
62                 shown.
63
64                 Output  will  start  with program ID followed by program type
65                 and zero or more named attributes (depending on  kernel  ver‐
66                 sion).
67
68                 Since Linux 5.1 the kernel can collect statistics on BPF pro‐
69                 grams (such as the total time spent running the program,  and
70                 the  number of times it was run). If available, bpftool shows
71                 such statistics. However, the kernel does not collect them by
72                 defaults,  as it slightly impacts performance on each program
73                 run. Activation or deactivation of the feature  is  performed
74                 via the kernel.bpf_stats_enabled sysctl knob.
75
76                 Since Linux 5.8 bpftool is able to discover information about
77                 processes that hold open file descriptors (FDs)  against  BPF
78                 programs.  On  such  kernels  bpftool will automatically emit
79                 this information as well.
80
81          bpftool prog dump xlated PROG [{ file FILE  |  opcodes  |  visual  |
82          linum }]
83                 Dump  eBPF  instructions  of the programs from the kernel. By
84                 default, eBPF will be disassembled and  printed  to  standard
85                 output  in  human-readable format. In this case, opcodes con‐
86                 trols if raw opcodes should be printed as well.
87
88                 In case of tag or name, PROG may match several programs which
89                 will all be dumped.  However, if file or visual is specified,
90                 PROG must match a single program.
91
92                 If file is specified, the binary image will instead be  writ‐
93                 ten to FILE.
94
95                 If  visual  is  specified,  control  flow graph (CFG) will be
96                 built instead, and eBPF instructions will be  presented  with
97                 CFG in DOT format, on standard output.
98
99                 If  the  programs  have  line_info available, the source line
100                 will be displayed by default.  If  linum  is  specified,  the
101                 filename,  line number and line column will also be displayed
102                 on top of the source line.
103
104          bpftool prog dump jited PROG [{ file FILE | opcodes | linum }]
105                 Dump jited image (host machine code) of the program.
106
107                 If FILE is specified image will be written to a file,  other‐
108                 wise  it  will  be  disassembled and printed to stdout.  PROG
109                 must match a single program when file is specified.
110
111                 opcodes controls if raw opcodes will be printed.
112
113                 If the prog has line_info available, the source line will  be
114                 displayed  by  default.  If linum is specified, the filename,
115                 line number and line column will also be displayed on top  of
116                 the source line.
117
118          bpftool prog pin PROG FILE
119                 Pin program PROG as FILE.
120
121                 Note:  FILE  must be located in bpffs mount. It must not con‐
122                 tain a dot character ('.'), which is reserved for future  ex‐
123                 tensions of bpffs.
124
125          bpftool prog { load | loadall } OBJ PATH [type TYPE] [map {idx IDX |
126          name NAME} MAP] [dev NAME] [pinmaps MAP_DIR]
127                 Load bpf program(s) from binary OBJ and pin as PATH.  bpftool
128                 prog  load  pins only the first program from the OBJ as PATH.
129                 bpftool prog loadall pins all programs  from  the  OBJ  under
130                 PATH  directory.   type is optional, if not specified program
131                 type will be inferred from section names.  By default bpftool
132                 will  create  new  maps  as  declared in the ELF object being
133                 loaded.  map parameter allows for the reuse of existing maps.
134                 It can be specified multiple times, each time for a different
135                 map.  IDX refers to index of the map to be  replaced  in  the
136                 ELF  file counting from 0, while NAME allows to replace a map
137                 by name.  MAP specifies the map to use, referring to it by id
138                 or  through  a pinned file.  If dev NAME is specified program
139                 will be loaded onto given networking device  (offload).   Op‐
140                 tional pinmaps argument can be provided to pin all maps under
141                 MAP_DIR directory.
142
143                 Note: PATH must be located in bpffs mount. It must  not  con‐
144                 tain  a dot character ('.'), which is reserved for future ex‐
145                 tensions of bpffs.
146
147          bpftool prog attach PROG ATTACH_TYPE [MAP]
148                 Attach bpf program PROG (with type specified by ATTACH_TYPE).
149                 Most ATTACH_TYPEs require a MAP parameter, with the exception
150                 of flow_dissector which is  attached  to  current  networking
151                 name space.
152
153          bpftool prog detach PROG ATTACH_TYPE [MAP]
154                 Detach bpf program PROG (with type specified by ATTACH_TYPE).
155                 Most ATTACH_TYPEs require a MAP parameter, with the exception
156                 of flow_dissector which is detached from the current network‐
157                 ing name space.
158
159          bpftool prog tracelog
160                 Dump the trace pipe of the system to  the  console  (stdout).
161                 Hit <Ctrl+C> to stop printing. BPF programs can write to this
162                 trace pipe at runtime  with  the  bpf_trace_printk()  helper.
163                 This  should be used only for debugging purposes. For stream‐
164                 ing data from BPF programs to user space, one  can  use  perf
165                 events (see also bpftool-map(8)).
166
167          bpftool prog run PROG data_in FILE [data_out FILE [data_size_out L]]
168          [ctx_in FILE [ctx_out FILE [ctx_size_out M]]] [repeat N]
169                 Run BPF program PROG in the kernel testing infrastructure for
170                 BPF,  meaning  that the program works on the data and context
171                 provided by the user, and not on actual packets or  monitored
172                 functions etc. Return value and duration for the test run are
173                 printed out to the console.
174
175                 Input data is read from the FILE  passed  with  data_in.   If
176                 this FILE is "-", input data is read from standard input. In‐
177                 put context, if any, is read from FILE  passed  with  ctx_in.
178                 Again,  "-" can be used to read from standard input, but only
179                 if standard input is not already in use for input data. If  a
180                 FILE  is passed with data_out, output data is written to that
181                 file. Similarly, output context is written to the FILE passed
182                 with ctx_out. For both output flows, "-" can be used to print
183                 to the standard output (as plain text, or  JSON  if  relevant
184                 option  was  passed).  If output keywords are omitted, output
185                 data and context are discarded.  Keywords  data_size_out  and
186                 ctx_size_out  are  used  to  pass the size (in bytes) for the
187                 output buffers to the kernel, although the default of  32  kB
188                 should be more than enough for most cases.
189
190                 Keyword  repeat is used to indicate the number of consecutive
191                 runs to perform. Note that output data and context printed to
192                 files  correspond  to  the  last  of those runs. The duration
193                 printed out at the end of the runs is  an  average  over  all
194                 runs performed by the command.
195
196                 Not all program types support test run. Among those which do,
197                 not all  of  them  can  take  the  ctx_in/ctx_out  arguments.
198                 bpftool does not perform checks on program types.
199
200          bpftool prog profile PROG [duration DURATION] METRICs
201                 Profile  METRICs for bpf program PROG for DURATION seconds or
202                 until user hits <Ctrl+C>. DURATION is optional.  If  DURATION
203                 is  not specified, the profiling will run up to UINT_MAX sec‐
204                 onds.
205
206          bpftool prog help
207                 Print short help message.
208

OPTIONS

210          -h, --help
211                 Print short help message (similar to bpftool help).
212
213          -V, --version
214                 Print version number (similar to bpftool  version),  and  op‐
215                 tional features that were included when bpftool was compiled.
216                 Optional features include linking against libbfd  to  provide
217                 the  disassembler  for  JIT-ted  programs  (bpftool prog dump
218                 jited) and usage of BPF skeletons (some features like bpftool
219                 prog  profile  or  showing pids associated to BPF objects may
220                 rely on it).
221
222          -j, --json
223                 Generate JSON output. For commands that cannot produce  JSON,
224                 this option has no effect.
225
226          -p, --pretty
227                 Generate human-readable JSON output. Implies -j.
228
229          -d, --debug
230                 Print  all logs available, even debug-level information. This
231                 includes logs from libbpf as well as from the verifier,  when
232                 attempting to load programs.
233
234          -f, --bpffs
235                 When  showing  BPF  programs,  show file names of pinned pro‐
236                 grams.
237
238          -m, --mapcompat
239                 Allow loading maps with unknown map definitions.
240
241          -n, --nomount
242                 Do not automatically attempt to mount any virtual file system
243                 (such as tracefs or BPF virtual file system) when necessary.
244
245          -L, --use-loader
246                 Load  program  as a "loader" program. This is useful to debug
247                 the generation of such programs. When this option is in  use,
248                 bpftool  attempts  to  load the programs from the object file
249                 into the kernel, but does not pin them (therefore,  the  PATH
250                 must not be provided).
251
252                 When  combined  with  the -d|--debug option, additional debug
253                 messages are generated, and the execution of the loader  pro‐
254                 gram  will use the bpf_trace_printk() helper to log each step
255                 of loading BTF, creating the maps, and loading  the  programs
256                 (see bpftool prog tracelog as a way to dump those messages).
257

EXAMPLES

259       # bpftool prog show
260
261          10: xdp  name some_prog  tag 005a3d2123620c8b  gpl run_time_ns 81632 run_cnt 10
262                  loaded_at 2017-09-29T20:11:00+0000  uid 0
263                  xlated 528B  jited 370B  memlock 4096B  map_ids 10
264                  pids systemd(1)
265
266       # bpftool --json --pretty prog show
267
268          [{
269                  "id": 10,
270                  "type": "xdp",
271                  "tag": "005a3d2123620c8b",
272                  "gpl_compatible": true,
273                  "run_time_ns": 81632,
274                  "run_cnt": 10,
275                  "loaded_at": 1506715860,
276                  "uid": 0,
277                  "bytes_xlated": 528,
278                  "jited": true,
279                  "bytes_jited": 370,
280                  "bytes_memlock": 4096,
281                  "map_ids": [10
282                  ],
283                  "pids": [{
284                          "pid": 1,
285                          "comm": "systemd"
286                      }
287                  ]
288              }
289          ]
290
291       # bpftool prog dump xlated id 10 file /tmp/t
292       $ ls -l /tmp/t
293
294
295          -rw------- 1 root root 560 Jul 22 01:42 /tmp/t
296
297       # bpftool prog dump jited tag 005a3d2123620c8b
298
299          0:   push   %rbp
300          1:   mov    %rsp,%rbp
301          2:   sub    $0x228,%rsp
302          3:   sub    $0x28,%rbp
303          4:   mov    %rbx,0x0(%rbp)
304
305       # mount -t bpf none /sys/fs/bpf/
306       # bpftool prog pin id 10 /sys/fs/bpf/prog
307       # bpftool prog load ./my_prog.o /sys/fs/bpf/prog2
308       # ls -l /sys/fs/bpf/
309
310
311          -rw------- 1 root root 0 Jul 22 01:43 prog
312          -rw------- 1 root root 0 Jul 22 01:44 prog2
313
314       # bpftool prog dump jited pinned /sys/fs/bpf/prog opcodes
315
316          0:   push   %rbp
317               55
318          1:   mov    %rsp,%rbp
319               48 89 e5
320          4:   sub    $0x228,%rsp
321               48 81 ec 28 02 00 00
322          b:   sub    $0x28,%rbp
323               48 83 ed 28
324          f:   mov    %rbx,0x0(%rbp)
325               48 89 5d 00
326
327       # bpftool prog load xdp1_kern.o /sys/fs/bpf/xdp1 type xdp map name rxcnt id 7
328       # bpftool prog show pinned /sys/fs/bpf/xdp1
329
330
331          9: xdp  name xdp_prog1  tag 539ec6ce11b52f98  gpl
332                  loaded_at 2018-06-25T16:17:31-0700  uid 0
333                  xlated 488B  jited 336B  memlock 4096B  map_ids 7
334
335       # rm /sys/fs/bpf/xdp1
336
337       # bpftool prog profile id 337 duration 10 cycles instructions llc_misses
338
339
340             51397 run_cnt
341          40176203 cycles                                                 (83.05%)
342          42518139 instructions    #   1.06 insns per cycle               (83.39%)
343               123 llc_misses      #   2.89 LLC misses per million insns  (83.15%)
344
345       Output below is for the trace logs.
346       Run in separate terminals:
347       # bpftool prog tracelog
348       # bpftool prog load -L -d file.o
349
350
351          bpftool-620059  [004] d... 2634685.517903: bpf_trace_printk: btf_load size 665 r=5
352          bpftool-620059  [004] d... 2634685.517912: bpf_trace_printk: map_create sample_map idx 0 type 2 value_size 4 value_btf_id 0 r=6
353          bpftool-620059  [004] d... 2634685.517997: bpf_trace_printk: prog_load sample insn_cnt 13 r=7
354          bpftool-620059  [004] d... 2634685.517999: bpf_trace_printk: close(5) = 0
355

SEE ALSO

357          bpf(2),       bpf-helpers(7),       bpftool(8),      bpftool-btf(8),
358          bpftool-cgroup(8),        bpftool-feature(8),        bpftool-gen(8),
359          bpftool-iter(8),  bpftool-link(8),  bpftool-map(8),  bpftool-net(8),
360          bpftool-perf(8), bpftool-struct_ops(8)
361
362
363
364
365                                                               BPFTOOL-PROG(8)
Impressum