bpf: add initial bpf tracepoints
This work adds a number of tracepoints to paths that are either
considered slow-path or exception-like states, where monitoring or
inspecting them would be desirable.
For bpf(2) syscall, tracepoints have been placed for main commands
when they succeed. In XDP case, tracepoint is for exceptions, that
is, f.e. on abnormal BPF program exit such as unknown or XDP_ABORTED
return code, or when error occurs during XDP_TX action and the packet
could not be forwarded.
Both have been split into separate event headers, and can be further
extended. Worst case, if they unexpectedly should get into our way in
future, they can also removed [1]. Of course, these tracepoints (like
any other) can be analyzed by eBPF itself, etc. Example output:
# ./perf record -a -e bpf:* sleep 10
# ./perf script
sock_example 6197 [005] 283.980322: bpf:bpf_map_create: map type=ARRAY ufd=4 key=4 val=8 max=256 flags=0
sock_example 6197 [005] 283.980721: bpf:bpf_prog_load: prog=a5ea8fa30ea6849c type=SOCKET_FILTER ufd=5
sock_example 6197 [005] 283.988423: bpf:bpf_prog_get_type: prog=a5ea8fa30ea6849c type=SOCKET_FILTER
sock_example 6197 [005] 283.988443: bpf:bpf_map_lookup_elem: map type=ARRAY ufd=4 key=[06 00 00 00] val=[00 00 00 00 00 00 00 00]
[...]
sock_example 6197 [005] 288.990868: bpf:bpf_map_lookup_elem: map type=ARRAY ufd=4 key=[01 00 00 00] val=[14 00 00 00 00 00 00 00]
swapper 0 [005] 289.338243: bpf:bpf_prog_put_rcu: prog=a5ea8fa30ea6849c type=SOCKET_FILTER
[1] https://lwn.net/Articles/705270/
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
8 years ago
|
|
|
#undef TRACE_SYSTEM
|
|
|
|
#define TRACE_SYSTEM xdp
|
|
|
|
|
|
|
|
#if !defined(_TRACE_XDP_H) || defined(TRACE_HEADER_MULTI_READ)
|
|
|
|
#define _TRACE_XDP_H
|
|
|
|
|
|
|
|
#include <linux/netdevice.h>
|
|
|
|
#include <linux/filter.h>
|
|
|
|
#include <linux/tracepoint.h>
|
|
|
|
|
|
|
|
#define __XDP_ACT_MAP(FN) \
|
|
|
|
FN(ABORTED) \
|
|
|
|
FN(DROP) \
|
|
|
|
FN(PASS) \
|
|
|
|
FN(TX) \
|
|
|
|
FN(REDIRECT)
|
bpf: add initial bpf tracepoints
This work adds a number of tracepoints to paths that are either
considered slow-path or exception-like states, where monitoring or
inspecting them would be desirable.
For bpf(2) syscall, tracepoints have been placed for main commands
when they succeed. In XDP case, tracepoint is for exceptions, that
is, f.e. on abnormal BPF program exit such as unknown or XDP_ABORTED
return code, or when error occurs during XDP_TX action and the packet
could not be forwarded.
Both have been split into separate event headers, and can be further
extended. Worst case, if they unexpectedly should get into our way in
future, they can also removed [1]. Of course, these tracepoints (like
any other) can be analyzed by eBPF itself, etc. Example output:
# ./perf record -a -e bpf:* sleep 10
# ./perf script
sock_example 6197 [005] 283.980322: bpf:bpf_map_create: map type=ARRAY ufd=4 key=4 val=8 max=256 flags=0
sock_example 6197 [005] 283.980721: bpf:bpf_prog_load: prog=a5ea8fa30ea6849c type=SOCKET_FILTER ufd=5
sock_example 6197 [005] 283.988423: bpf:bpf_prog_get_type: prog=a5ea8fa30ea6849c type=SOCKET_FILTER
sock_example 6197 [005] 283.988443: bpf:bpf_map_lookup_elem: map type=ARRAY ufd=4 key=[06 00 00 00] val=[00 00 00 00 00 00 00 00]
[...]
sock_example 6197 [005] 288.990868: bpf:bpf_map_lookup_elem: map type=ARRAY ufd=4 key=[01 00 00 00] val=[14 00 00 00 00 00 00 00]
swapper 0 [005] 289.338243: bpf:bpf_prog_put_rcu: prog=a5ea8fa30ea6849c type=SOCKET_FILTER
[1] https://lwn.net/Articles/705270/
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
8 years ago
|
|
|
|
|
|
|
#define __XDP_ACT_TP_FN(x) \
|
|
|
|
TRACE_DEFINE_ENUM(XDP_##x);
|
|
|
|
#define __XDP_ACT_SYM_FN(x) \
|
|
|
|
{ XDP_##x, #x },
|
|
|
|
#define __XDP_ACT_SYM_TAB \
|
|
|
|
__XDP_ACT_MAP(__XDP_ACT_SYM_FN) { -1, 0 }
|
|
|
|
__XDP_ACT_MAP(__XDP_ACT_TP_FN)
|
|
|
|
|
|
|
|
TRACE_EVENT(xdp_exception,
|
|
|
|
|
|
|
|
TP_PROTO(const struct net_device *dev,
|
|
|
|
const struct bpf_prog *xdp, u32 act),
|
|
|
|
|
|
|
|
TP_ARGS(dev, xdp, act),
|
|
|
|
|
|
|
|
TP_STRUCT__entry(
|
|
|
|
__field(int, prog_id)
|
bpf: add initial bpf tracepoints
This work adds a number of tracepoints to paths that are either
considered slow-path or exception-like states, where monitoring or
inspecting them would be desirable.
For bpf(2) syscall, tracepoints have been placed for main commands
when they succeed. In XDP case, tracepoint is for exceptions, that
is, f.e. on abnormal BPF program exit such as unknown or XDP_ABORTED
return code, or when error occurs during XDP_TX action and the packet
could not be forwarded.
Both have been split into separate event headers, and can be further
extended. Worst case, if they unexpectedly should get into our way in
future, they can also removed [1]. Of course, these tracepoints (like
any other) can be analyzed by eBPF itself, etc. Example output:
# ./perf record -a -e bpf:* sleep 10
# ./perf script
sock_example 6197 [005] 283.980322: bpf:bpf_map_create: map type=ARRAY ufd=4 key=4 val=8 max=256 flags=0
sock_example 6197 [005] 283.980721: bpf:bpf_prog_load: prog=a5ea8fa30ea6849c type=SOCKET_FILTER ufd=5
sock_example 6197 [005] 283.988423: bpf:bpf_prog_get_type: prog=a5ea8fa30ea6849c type=SOCKET_FILTER
sock_example 6197 [005] 283.988443: bpf:bpf_map_lookup_elem: map type=ARRAY ufd=4 key=[06 00 00 00] val=[00 00 00 00 00 00 00 00]
[...]
sock_example 6197 [005] 288.990868: bpf:bpf_map_lookup_elem: map type=ARRAY ufd=4 key=[01 00 00 00] val=[14 00 00 00 00 00 00 00]
swapper 0 [005] 289.338243: bpf:bpf_prog_put_rcu: prog=a5ea8fa30ea6849c type=SOCKET_FILTER
[1] https://lwn.net/Articles/705270/
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
8 years ago
|
|
|
__field(u32, act)
|
|
|
|
__field(int, ifindex)
|
bpf: add initial bpf tracepoints
This work adds a number of tracepoints to paths that are either
considered slow-path or exception-like states, where monitoring or
inspecting them would be desirable.
For bpf(2) syscall, tracepoints have been placed for main commands
when they succeed. In XDP case, tracepoint is for exceptions, that
is, f.e. on abnormal BPF program exit such as unknown or XDP_ABORTED
return code, or when error occurs during XDP_TX action and the packet
could not be forwarded.
Both have been split into separate event headers, and can be further
extended. Worst case, if they unexpectedly should get into our way in
future, they can also removed [1]. Of course, these tracepoints (like
any other) can be analyzed by eBPF itself, etc. Example output:
# ./perf record -a -e bpf:* sleep 10
# ./perf script
sock_example 6197 [005] 283.980322: bpf:bpf_map_create: map type=ARRAY ufd=4 key=4 val=8 max=256 flags=0
sock_example 6197 [005] 283.980721: bpf:bpf_prog_load: prog=a5ea8fa30ea6849c type=SOCKET_FILTER ufd=5
sock_example 6197 [005] 283.988423: bpf:bpf_prog_get_type: prog=a5ea8fa30ea6849c type=SOCKET_FILTER
sock_example 6197 [005] 283.988443: bpf:bpf_map_lookup_elem: map type=ARRAY ufd=4 key=[06 00 00 00] val=[00 00 00 00 00 00 00 00]
[...]
sock_example 6197 [005] 288.990868: bpf:bpf_map_lookup_elem: map type=ARRAY ufd=4 key=[01 00 00 00] val=[14 00 00 00 00 00 00 00]
swapper 0 [005] 289.338243: bpf:bpf_prog_put_rcu: prog=a5ea8fa30ea6849c type=SOCKET_FILTER
[1] https://lwn.net/Articles/705270/
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
8 years ago
|
|
|
),
|
|
|
|
|
|
|
|
TP_fast_assign(
|
|
|
|
__entry->prog_id = xdp->aux->id;
|
|
|
|
__entry->act = act;
|
|
|
|
__entry->ifindex = dev->ifindex;
|
bpf: add initial bpf tracepoints
This work adds a number of tracepoints to paths that are either
considered slow-path or exception-like states, where monitoring or
inspecting them would be desirable.
For bpf(2) syscall, tracepoints have been placed for main commands
when they succeed. In XDP case, tracepoint is for exceptions, that
is, f.e. on abnormal BPF program exit such as unknown or XDP_ABORTED
return code, or when error occurs during XDP_TX action and the packet
could not be forwarded.
Both have been split into separate event headers, and can be further
extended. Worst case, if they unexpectedly should get into our way in
future, they can also removed [1]. Of course, these tracepoints (like
any other) can be analyzed by eBPF itself, etc. Example output:
# ./perf record -a -e bpf:* sleep 10
# ./perf script
sock_example 6197 [005] 283.980322: bpf:bpf_map_create: map type=ARRAY ufd=4 key=4 val=8 max=256 flags=0
sock_example 6197 [005] 283.980721: bpf:bpf_prog_load: prog=a5ea8fa30ea6849c type=SOCKET_FILTER ufd=5
sock_example 6197 [005] 283.988423: bpf:bpf_prog_get_type: prog=a5ea8fa30ea6849c type=SOCKET_FILTER
sock_example 6197 [005] 283.988443: bpf:bpf_map_lookup_elem: map type=ARRAY ufd=4 key=[06 00 00 00] val=[00 00 00 00 00 00 00 00]
[...]
sock_example 6197 [005] 288.990868: bpf:bpf_map_lookup_elem: map type=ARRAY ufd=4 key=[01 00 00 00] val=[14 00 00 00 00 00 00 00]
swapper 0 [005] 289.338243: bpf:bpf_prog_put_rcu: prog=a5ea8fa30ea6849c type=SOCKET_FILTER
[1] https://lwn.net/Articles/705270/
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
8 years ago
|
|
|
),
|
|
|
|
|
|
|
|
TP_printk("prog_id=%d action=%s ifindex=%d",
|
|
|
|
__entry->prog_id,
|
|
|
|
__print_symbolic(__entry->act, __XDP_ACT_SYM_TAB),
|
|
|
|
__entry->ifindex)
|
bpf: add initial bpf tracepoints
This work adds a number of tracepoints to paths that are either
considered slow-path or exception-like states, where monitoring or
inspecting them would be desirable.
For bpf(2) syscall, tracepoints have been placed for main commands
when they succeed. In XDP case, tracepoint is for exceptions, that
is, f.e. on abnormal BPF program exit such as unknown or XDP_ABORTED
return code, or when error occurs during XDP_TX action and the packet
could not be forwarded.
Both have been split into separate event headers, and can be further
extended. Worst case, if they unexpectedly should get into our way in
future, they can also removed [1]. Of course, these tracepoints (like
any other) can be analyzed by eBPF itself, etc. Example output:
# ./perf record -a -e bpf:* sleep 10
# ./perf script
sock_example 6197 [005] 283.980322: bpf:bpf_map_create: map type=ARRAY ufd=4 key=4 val=8 max=256 flags=0
sock_example 6197 [005] 283.980721: bpf:bpf_prog_load: prog=a5ea8fa30ea6849c type=SOCKET_FILTER ufd=5
sock_example 6197 [005] 283.988423: bpf:bpf_prog_get_type: prog=a5ea8fa30ea6849c type=SOCKET_FILTER
sock_example 6197 [005] 283.988443: bpf:bpf_map_lookup_elem: map type=ARRAY ufd=4 key=[06 00 00 00] val=[00 00 00 00 00 00 00 00]
[...]
sock_example 6197 [005] 288.990868: bpf:bpf_map_lookup_elem: map type=ARRAY ufd=4 key=[01 00 00 00] val=[14 00 00 00 00 00 00 00]
swapper 0 [005] 289.338243: bpf:bpf_prog_put_rcu: prog=a5ea8fa30ea6849c type=SOCKET_FILTER
[1] https://lwn.net/Articles/705270/
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
8 years ago
|
|
|
);
|
|
|
|
|
|
|
|
DECLARE_EVENT_CLASS(xdp_redirect_template,
|
|
|
|
|
|
|
|
TP_PROTO(const struct net_device *dev,
|
|
|
|
const struct bpf_prog *xdp,
|
|
|
|
int to_ifindex, int err,
|
|
|
|
const struct bpf_map *map, u32 map_index),
|
|
|
|
|
|
|
|
TP_ARGS(dev, xdp, to_ifindex, err, map, map_index),
|
|
|
|
|
|
|
|
TP_STRUCT__entry(
|
|
|
|
__field(int, prog_id)
|
|
|
|
__field(u32, act)
|
|
|
|
__field(int, ifindex)
|
|
|
|
__field(int, err)
|
|
|
|
__field(int, to_ifindex)
|
|
|
|
__field(u32, map_id)
|
|
|
|
__field(int, map_index)
|
|
|
|
),
|
|
|
|
|
|
|
|
TP_fast_assign(
|
|
|
|
__entry->prog_id = xdp->aux->id;
|
|
|
|
__entry->act = XDP_REDIRECT;
|
|
|
|
__entry->ifindex = dev->ifindex;
|
|
|
|
__entry->err = err;
|
|
|
|
__entry->to_ifindex = to_ifindex;
|
|
|
|
__entry->map_id = map ? map->id : 0;
|
|
|
|
__entry->map_index = map_index;
|
|
|
|
),
|
|
|
|
|
|
|
|
TP_printk("prog_id=%d action=%s ifindex=%d to_ifindex=%d err=%d",
|
|
|
|
__entry->prog_id,
|
|
|
|
__print_symbolic(__entry->act, __XDP_ACT_SYM_TAB),
|
|
|
|
__entry->ifindex, __entry->to_ifindex,
|
|
|
|
__entry->err)
|
|
|
|
);
|
|
|
|
|
|
|
|
DEFINE_EVENT(xdp_redirect_template, xdp_redirect,
|
|
|
|
TP_PROTO(const struct net_device *dev,
|
|
|
|
const struct bpf_prog *xdp,
|
|
|
|
int to_ifindex, int err,
|
|
|
|
const struct bpf_map *map, u32 map_index),
|
|
|
|
TP_ARGS(dev, xdp, to_ifindex, err, map, map_index)
|
|
|
|
);
|
|
|
|
|
|
|
|
DEFINE_EVENT(xdp_redirect_template, xdp_redirect_err,
|
|
|
|
TP_PROTO(const struct net_device *dev,
|
|
|
|
const struct bpf_prog *xdp,
|
|
|
|
int to_ifindex, int err,
|
|
|
|
const struct bpf_map *map, u32 map_index),
|
|
|
|
TP_ARGS(dev, xdp, to_ifindex, err, map, map_index)
|
|
|
|
);
|
|
|
|
|
|
|
|
#define _trace_xdp_redirect(dev, xdp, to) \
|
|
|
|
trace_xdp_redirect(dev, xdp, to, 0, NULL, 0);
|
|
|
|
|
|
|
|
#define _trace_xdp_redirect_err(dev, xdp, to, err) \
|
|
|
|
trace_xdp_redirect_err(dev, xdp, to, err, NULL, 0);
|
|
|
|
|
|
|
|
DEFINE_EVENT_PRINT(xdp_redirect_template, xdp_redirect_map,
|
|
|
|
TP_PROTO(const struct net_device *dev,
|
|
|
|
const struct bpf_prog *xdp,
|
|
|
|
int to_ifindex, int err,
|
|
|
|
const struct bpf_map *map, u32 map_index),
|
|
|
|
TP_ARGS(dev, xdp, to_ifindex, err, map, map_index),
|
|
|
|
TP_printk("prog_id=%d action=%s ifindex=%d to_ifindex=%d err=%d"
|
|
|
|
" map_id=%d map_index=%d",
|
|
|
|
__entry->prog_id,
|
|
|
|
__print_symbolic(__entry->act, __XDP_ACT_SYM_TAB),
|
|
|
|
__entry->ifindex, __entry->to_ifindex,
|
|
|
|
__entry->err,
|
|
|
|
__entry->map_id, __entry->map_index)
|
|
|
|
);
|
|
|
|
|
|
|
|
DEFINE_EVENT_PRINT(xdp_redirect_template, xdp_redirect_map_err,
|
|
|
|
TP_PROTO(const struct net_device *dev,
|
|
|
|
const struct bpf_prog *xdp,
|
|
|
|
int to_ifindex, int err,
|
|
|
|
const struct bpf_map *map, u32 map_index),
|
|
|
|
TP_ARGS(dev, xdp, to_ifindex, err, map, map_index),
|
|
|
|
TP_printk("prog_id=%d action=%s ifindex=%d to_ifindex=%d err=%d"
|
|
|
|
" map_id=%d map_index=%d",
|
|
|
|
__entry->prog_id,
|
|
|
|
__print_symbolic(__entry->act, __XDP_ACT_SYM_TAB),
|
|
|
|
__entry->ifindex, __entry->to_ifindex,
|
|
|
|
__entry->err,
|
|
|
|
__entry->map_id, __entry->map_index)
|
|
|
|
);
|
|
|
|
|
|
|
|
#define _trace_xdp_redirect_map(dev, xdp, fwd, map, idx) \
|
|
|
|
trace_xdp_redirect_map(dev, xdp, fwd ? fwd->ifindex : 0, \
|
|
|
|
0, map, idx)
|
|
|
|
|
|
|
|
#define _trace_xdp_redirect_map_err(dev, xdp, fwd, map, idx, err) \
|
|
|
|
trace_xdp_redirect_map_err(dev, xdp, fwd ? fwd->ifindex : 0, \
|
|
|
|
err, map, idx)
|
|
|
|
|
bpf: add initial bpf tracepoints
This work adds a number of tracepoints to paths that are either
considered slow-path or exception-like states, where monitoring or
inspecting them would be desirable.
For bpf(2) syscall, tracepoints have been placed for main commands
when they succeed. In XDP case, tracepoint is for exceptions, that
is, f.e. on abnormal BPF program exit such as unknown or XDP_ABORTED
return code, or when error occurs during XDP_TX action and the packet
could not be forwarded.
Both have been split into separate event headers, and can be further
extended. Worst case, if they unexpectedly should get into our way in
future, they can also removed [1]. Of course, these tracepoints (like
any other) can be analyzed by eBPF itself, etc. Example output:
# ./perf record -a -e bpf:* sleep 10
# ./perf script
sock_example 6197 [005] 283.980322: bpf:bpf_map_create: map type=ARRAY ufd=4 key=4 val=8 max=256 flags=0
sock_example 6197 [005] 283.980721: bpf:bpf_prog_load: prog=a5ea8fa30ea6849c type=SOCKET_FILTER ufd=5
sock_example 6197 [005] 283.988423: bpf:bpf_prog_get_type: prog=a5ea8fa30ea6849c type=SOCKET_FILTER
sock_example 6197 [005] 283.988443: bpf:bpf_map_lookup_elem: map type=ARRAY ufd=4 key=[06 00 00 00] val=[00 00 00 00 00 00 00 00]
[...]
sock_example 6197 [005] 288.990868: bpf:bpf_map_lookup_elem: map type=ARRAY ufd=4 key=[01 00 00 00] val=[14 00 00 00 00 00 00 00]
swapper 0 [005] 289.338243: bpf:bpf_prog_put_rcu: prog=a5ea8fa30ea6849c type=SOCKET_FILTER
[1] https://lwn.net/Articles/705270/
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
8 years ago
|
|
|
#endif /* _TRACE_XDP_H */
|
|
|
|
|
|
|
|
#include <trace/define_trace.h>
|