Skip to content

Commit a631b6e

Browse files
mrpreKernel Patches Daemon
authored and
Kernel Patches Daemon
committed
bpf, sockmap: Introduce tracing capability for sockmap
Sockmap has the same high-performance forwarding capability as XDP, but operates at Layer 7. Introduce tracing capability for sockmap, to trace the execution results of BPF programs without modifying the programs themselves, similar to the existing trace_xdp_redirect{_map}. It is crucial for debugging sockmap programs, especially in production environments. Additionally, the new header file has to be added to bpf_trace.h to automatically generate tracepoints. Test results: $ echo "1" > /sys/kernel/tracing/events/sockmap/enable msg/skb: ''' sockmap_redirect: sk=000000000ec02a93, netns=4026531840, inode=318, \ family=2, protocol=6, prog_id=59, len=8192, type=msg, action=REDIRECT, \ redirect_type=ingress sockmap_redirect: sk=00000000d5d9c931, netns=4026531840, inode=64731, \ family=2, protocol=6, prog_id=91, len=8221, type=skb, action=REDIRECT, \ redirect_type=egress sockmap_redirect: sk=00000000106fc281, netns=4026531840, inode=64729, \ family=2, protocol=6, prog_id=94, len=8192, type=msg, action=PASS, \ redirect_type=none ''' strparser: ''' sockmap_strparser: sk=00000000f15fc1c8, netns=4026531840, inode=52396, \ family=2, protocol=6, prog_id=143, in_len=1000, full_len=10 ''' Suggested-by: Jakub Sitnicki <[email protected]> Suggested-by: Cong Wang <[email protected]> Suggested-by: Steven Rostedt <[email protected]> Signed-off-by: Jiayuan Chen <[email protected]>
1 parent fc760de commit a631b6e

File tree

4 files changed

+166
-0
lines changed

4 files changed

+166
-0
lines changed

MAINTAINERS

+1
Original file line numberDiff line numberDiff line change
@@ -4420,6 +4420,7 @@ L: [email protected]
44204420
44214421
S: Maintained
44224422
F: include/linux/skmsg.h
4423+
F: include/trace/events/sockmap.h
44234424
F: net/core/skmsg.c
44244425
F: net/core/sock_map.c
44254426
F: net/ipv4/tcp_bpf.c

include/linux/bpf_trace.h

+1
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,6 @@
33
#define __LINUX_BPF_TRACE_H__
44

55
#include <trace/events/xdp.h>
6+
#include <trace/events/sockmap.h>
67

78
#endif /* __LINUX_BPF_TRACE_H__ */

include/trace/events/sockmap.h

+158
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
/* SPDX-License-Identifier: GPL-2.0 */
2+
#undef TRACE_SYSTEM
3+
#define TRACE_SYSTEM sockmap
4+
5+
#if !defined(_TRACE_SOCKMAP_H) || defined(TRACE_HEADER_MULTI_READ)
6+
#define _TRACE_SOCKMAP_H
7+
8+
#include <linux/tracepoint.h>
9+
#include <linux/bpf.h>
10+
#include <linux/skmsg.h>
11+
12+
#ifndef __TRACE_SOCKMAP_HELPER_ONCE_ONLY
13+
#define __TRACE_SOCKMAP_HELPER_ONCE_ONLY
14+
15+
enum sockmap_direct_type {
16+
SOCKMAP_REDIR_NONE = 0,
17+
SOCKMAP_REDIR_INGRESS,
18+
SOCKMAP_REDIR_EGRESS,
19+
};
20+
21+
enum sockmap_data_type {
22+
SOCKMAP_MSG = 0,
23+
SOCKMAP_SKB,
24+
};
25+
26+
#endif /* end __TRACE_SOCKMAP_HELPER_ONCE_ONLY */
27+
28+
TRACE_DEFINE_ENUM(SOCKMAP_MSG);
29+
TRACE_DEFINE_ENUM(SOCKMAP_SKB);
30+
TRACE_DEFINE_ENUM(SOCKMAP_REDIR_NONE);
31+
TRACE_DEFINE_ENUM(SOCKMAP_REDIR_INGRESS);
32+
TRACE_DEFINE_ENUM(SOCKMAP_REDIR_EGRESS);
33+
34+
TRACE_DEFINE_ENUM(__SK_DROP);
35+
TRACE_DEFINE_ENUM(__SK_PASS);
36+
TRACE_DEFINE_ENUM(__SK_REDIRECT);
37+
TRACE_DEFINE_ENUM(__SK_NONE);
38+
39+
#define show_redirect_type(x) \
40+
__print_symbolic(x, \
41+
{ SOCKMAP_REDIR_NONE, "none" }, \
42+
{ SOCKMAP_REDIR_INGRESS, "ingress" }, \
43+
{ SOCKMAP_REDIR_EGRESS, "egress" })
44+
45+
#define show_act(x) \
46+
__print_symbolic(x, \
47+
{ __SK_DROP, "DROP" }, \
48+
{ __SK_PASS, "PASS" }, \
49+
{ __SK_REDIRECT, "REDIRECT" }, \
50+
{ __SK_NONE, "NONE" })
51+
52+
#define show_data_type(x) \
53+
__print_symbolic(x, \
54+
{ SOCKMAP_MSG, "msg" }, \
55+
{ SOCKMAP_SKB, "skb" })
56+
57+
#define trace_sockmap_skmsg_redirect(sk, prog, msg, act) \
58+
trace_sockmap_redirect((sk), SOCKMAP_MSG, (prog), \
59+
(msg)->sg.size, (act), \
60+
sk_msg_to_ingress(msg))
61+
62+
#define trace_sockmap_skb_redirect(sk, prog, skb, act) \
63+
trace_sockmap_redirect((sk), SOCKMAP_SKB, (prog), \
64+
(skb)->len, (act), \
65+
skb_bpf_ingress(skb))
66+
67+
#define trace_sockmap_skb_strp_parse(sk, prog, skb, ret) \
68+
trace_sockmap_strparser((sk), (prog), (skb)->len, (ret))
69+
70+
TRACE_EVENT(sockmap_redirect,
71+
72+
TP_PROTO(const struct sock *sk, enum sockmap_data_type type,
73+
const struct bpf_prog *prog, int len, int act,
74+
bool ingress),
75+
76+
TP_ARGS(sk, type, prog, len, act, ingress),
77+
78+
TP_STRUCT__entry(
79+
__field(const void *, sk)
80+
__field(unsigned long, ino)
81+
__field(unsigned int, netns_ino)
82+
__field(__u16, family)
83+
__field(__u16, protocol)
84+
__field(int, prog_id)
85+
__field(int, len)
86+
__field(int, act)
87+
__field(enum sockmap_data_type, type)
88+
__field(enum sockmap_direct_type, redir)
89+
),
90+
91+
TP_fast_assign(
92+
/* 'redir' is undefined if action is not REDIRECT */
93+
enum sockmap_direct_type redir = SOCKMAP_REDIR_NONE;
94+
95+
if (act == __SK_REDIRECT) {
96+
if (ingress)
97+
redir = SOCKMAP_REDIR_INGRESS;
98+
else
99+
redir = SOCKMAP_REDIR_EGRESS;
100+
}
101+
__entry->sk = sk;
102+
__entry->ino = sock_i_ino((struct sock *)sk);
103+
__entry->netns_ino = sock_net(sk)->ns.inum;
104+
__entry->type = type;
105+
__entry->family = sk->sk_family;
106+
__entry->protocol = sk->sk_protocol;
107+
__entry->prog_id = prog->aux->id;
108+
__entry->len = len;
109+
__entry->act = act;
110+
__entry->redir = redir;
111+
),
112+
113+
TP_printk("sk=%p, netns=%u, inode=%lu, family=%u, protocol=%u,"
114+
" prog_id=%d, len=%d, type=%s, action=%s, redirect_type=%s",
115+
__entry->sk, __entry->netns_ino, __entry->ino,
116+
__entry->family, __entry->protocol, __entry->prog_id,
117+
__entry->len, show_data_type(__entry->type),
118+
show_act(__entry->act), show_redirect_type(__entry->redir))
119+
);
120+
121+
TRACE_EVENT(sockmap_strparser,
122+
123+
TP_PROTO(const struct sock *sk, const struct bpf_prog *prog,
124+
int in_len, int full_len),
125+
126+
TP_ARGS(sk, prog, in_len, full_len),
127+
128+
TP_STRUCT__entry(
129+
__field(const void *, sk)
130+
__field(unsigned long, ino)
131+
__field(unsigned int, netns_ino)
132+
__field(__u16, family)
133+
__field(__u16, protocol)
134+
__field(int, prog_id)
135+
__field(int, in_len)
136+
__field(int, full_len)
137+
),
138+
139+
TP_fast_assign(
140+
__entry->sk = sk;
141+
__entry->ino = sock_i_ino((struct sock *)sk);
142+
__entry->netns_ino = sock_net(sk)->ns.inum;
143+
__entry->family = sk->sk_family;
144+
__entry->protocol = sk->sk_protocol;
145+
__entry->prog_id = prog->aux->id;
146+
__entry->in_len = in_len;
147+
__entry->full_len = full_len;
148+
),
149+
150+
TP_printk("sk=%p, netns=%u, inode=%lu, family=%u, protocol=%u,"
151+
" prog_id=%d, in_len=%d, full_len=%d",
152+
__entry->sk, __entry->netns_ino, __entry->ino,
153+
__entry->family, __entry->protocol, __entry->prog_id,
154+
__entry->in_len, __entry->full_len)
155+
);
156+
#endif /* _TRACE_SOCKMAP_H */
157+
158+
#include <trace/define_trace.h>

net/core/skmsg.c

+6
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include <net/tcp.h>
1010
#include <net/tls.h>
1111
#include <trace/events/sock.h>
12+
#include <trace/events/sockmap.h>
1213

1314
static bool sk_msg_try_coalesce_ok(struct sk_msg *msg, int elem_first_coalesce)
1415
{
@@ -910,6 +911,7 @@ int sk_psock_msg_verdict(struct sock *sk, struct sk_psock *psock,
910911
sock_hold(psock->sk_redir);
911912
}
912913
out:
914+
trace_sockmap_skmsg_redirect(sk, prog, msg, ret);
913915
rcu_read_unlock();
914916
return ret;
915917
}
@@ -981,6 +983,7 @@ int sk_psock_tls_strp_read(struct sk_psock *psock, struct sk_buff *skb)
981983
ret = bpf_prog_run_pin_on_cpu(prog, skb);
982984
ret = sk_psock_map_verd(ret, skb_bpf_redirect_fetch(skb));
983985
skb->sk = NULL;
986+
trace_sockmap_skb_redirect(psock->sk, prog, skb, ret);
984987
}
985988
sk_psock_tls_verdict_apply(skb, psock, ret);
986989
rcu_read_unlock();
@@ -1090,6 +1093,7 @@ static void sk_psock_strp_read(struct strparser *strp, struct sk_buff *skb)
10901093
skb_bpf_set_strparser(skb);
10911094
ret = sk_psock_map_verd(ret, skb_bpf_redirect_fetch(skb));
10921095
skb->sk = NULL;
1096+
trace_sockmap_skb_redirect(sk, prog, skb, ret);
10931097
}
10941098
sk_psock_verdict_apply(psock, skb, ret);
10951099
out:
@@ -1113,6 +1117,7 @@ static int sk_psock_strp_parse(struct strparser *strp, struct sk_buff *skb)
11131117
skb->sk = psock->sk;
11141118
ret = bpf_prog_run_pin_on_cpu(prog, skb);
11151119
skb->sk = NULL;
1120+
trace_sockmap_skb_strp_parse(psock->sk, prog, skb, ret);
11161121
}
11171122
rcu_read_unlock();
11181123
return ret;
@@ -1217,6 +1222,7 @@ static int sk_psock_verdict_recv(struct sock *sk, struct sk_buff *skb)
12171222
skb_bpf_redirect_clear(skb);
12181223
ret = bpf_prog_run_pin_on_cpu(prog, skb);
12191224
ret = sk_psock_map_verd(ret, skb_bpf_redirect_fetch(skb));
1225+
trace_sockmap_skb_redirect(psock->sk, prog, skb, ret);
12201226
}
12211227
ret = sk_psock_verdict_apply(psock, skb, ret);
12221228
if (ret < 0)

0 commit comments

Comments
 (0)