Skip to content

Commit b42abb3

Browse files
Cong WangKernel Patches Daemon
authored andcommitted
skmsg: get rid of skb_clone()
With ->read_skb() now we have an entire skb dequeued from receive queue, now we just need to grab an addtional refcnt before passing its ownership to recv actors. And we should not touch them any more, particularly for skb->sk. Fortunately, skb->sk is already set for most of the protocols except UDP where skb->sk has been stolen, so we have to fix it up for UDP case. Cc: Eric Dumazet <edumazet@google.com> Cc: John Fastabend <john.fastabend@gmail.com> Cc: Daniel Borkmann <daniel@iogearbox.net> Cc: Jakub Sitnicki <jakub@cloudflare.com> Signed-off-by: Cong Wang <cong.wang@bytedance.com>
1 parent ac74d25 commit b42abb3

File tree

2 files changed

+2
-6
lines changed

2 files changed

+2
-6
lines changed

net/core/skmsg.c

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1167,10 +1167,7 @@ static int sk_psock_verdict_recv(struct sock *sk, struct sk_buff *skb)
11671167
int ret = __SK_DROP;
11681168
int len = skb->len;
11691169

1170-
/* clone here so sk_eat_skb() in tcp_read_sock does not drop our data */
1171-
skb = skb_clone(skb, GFP_ATOMIC);
1172-
if (!skb)
1173-
return 0;
1170+
skb_get(skb);
11741171

11751172
rcu_read_lock();
11761173
psock = sk_psock(sk);
@@ -1183,12 +1180,10 @@ static int sk_psock_verdict_recv(struct sock *sk, struct sk_buff *skb)
11831180
if (!prog)
11841181
prog = READ_ONCE(psock->progs.skb_verdict);
11851182
if (likely(prog)) {
1186-
skb->sk = sk;
11871183
skb_dst_drop(skb);
11881184
skb_bpf_redirect_clear(skb);
11891185
ret = bpf_prog_run_pin_on_cpu(prog, skb);
11901186
ret = sk_psock_map_verd(ret, skb_bpf_redirect_fetch(skb));
1191-
skb->sk = NULL;
11921187
}
11931188
if (sk_psock_verdict_apply(psock, skb, ret) < 0)
11941189
len = 0;

net/ipv4/udp.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1817,6 +1817,7 @@ int udp_read_skb(struct sock *sk, skb_read_actor_t recv_actor)
18171817
continue;
18181818
}
18191819

1820+
WARN_ON(!skb_set_owner_sk_safe(skb, sk));
18201821
used = recv_actor(sk, skb);
18211822
if (used <= 0) {
18221823
if (!copied)

0 commit comments

Comments
 (0)