Commit cfea28f8 authored by John Fastabend's avatar John Fastabend Committed by Alexei Starovoitov

bpf, sockmap: Skb verdict SK_PASS to self already checked rmem limits

For sk_skb case where skb_verdict program returns SK_PASS to continue to
pass packet up the stack, the memory limits were already checked before
enqueuing in skb_queue_tail from TCP side. So, lets remove the extra checks
here. The theory is if the TCP stack believes we have memory to receive
the packet then lets trust the stack and not double check the limits.

In fact the accounting here can cause a drop if sk_rmem_alloc has increased
after the stack accepted this packet, but before the duplicate check here.
And worse if this happens because TCP stack already believes the data has
been received there is no retransmit.

Fixes: 51199405 ("bpf: skb_verdict, support SK_PASS on RX BPF path")
Signed-off-by: default avatarJohn Fastabend <john.fastabend@gmail.com>
Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
Link: https://lore.kernel.org/bpf/160226857664.5692.668205469388498375.stgit@john-Precision-5820-Tower
parent ebb034b1
...@@ -771,6 +771,7 @@ EXPORT_SYMBOL_GPL(sk_psock_tls_strp_read); ...@@ -771,6 +771,7 @@ EXPORT_SYMBOL_GPL(sk_psock_tls_strp_read);
static void sk_psock_verdict_apply(struct sk_psock *psock, static void sk_psock_verdict_apply(struct sk_psock *psock,
struct sk_buff *skb, int verdict) struct sk_buff *skb, int verdict)
{ {
struct tcp_skb_cb *tcp;
struct sock *sk_other; struct sock *sk_other;
switch (verdict) { switch (verdict) {
...@@ -780,16 +781,12 @@ static void sk_psock_verdict_apply(struct sk_psock *psock, ...@@ -780,16 +781,12 @@ static void sk_psock_verdict_apply(struct sk_psock *psock,
!sk_psock_test_state(psock, SK_PSOCK_TX_ENABLED)) { !sk_psock_test_state(psock, SK_PSOCK_TX_ENABLED)) {
goto out_free; goto out_free;
} }
if (atomic_read(&sk_other->sk_rmem_alloc) <=
sk_other->sk_rcvbuf) {
struct tcp_skb_cb *tcp = TCP_SKB_CB(skb);
tcp->bpf.flags |= BPF_F_INGRESS; tcp = TCP_SKB_CB(skb);
skb_queue_tail(&psock->ingress_skb, skb); tcp->bpf.flags |= BPF_F_INGRESS;
schedule_work(&psock->work); skb_queue_tail(&psock->ingress_skb, skb);
break; schedule_work(&psock->work);
} break;
goto out_free;
case __SK_REDIRECT: case __SK_REDIRECT:
sk_psock_skb_redirect(skb); sk_psock_skb_redirect(skb);
break; break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment