diff options
Diffstat (limited to 'net/core/skmsg.c')
| -rw-r--r-- | net/core/skmsg.c | 12 | 
1 files changed, 5 insertions, 7 deletions
diff --git a/net/core/skmsg.c b/net/core/skmsg.c index 1261512d6807..5def3a2e85be 100644 --- a/net/core/skmsg.c +++ b/net/core/skmsg.c @@ -488,6 +488,7 @@ static int sk_psock_skb_ingress_self(struct sk_psock *psock, struct sk_buff *skb  	if (unlikely(!msg))  		return -EAGAIN;  	sk_msg_init(msg); +	skb_set_owner_r(skb, sk);  	return sk_psock_skb_ingress_enqueue(skb, psock, sk, msg);  } @@ -790,7 +791,6 @@ static void sk_psock_tls_verdict_apply(struct sk_buff *skb, struct sock *sk, int  {  	switch (verdict) {  	case __SK_REDIRECT: -		skb_set_owner_r(skb, sk);  		sk_psock_skb_redirect(skb);  		break;  	case __SK_PASS: @@ -808,10 +808,6 @@ int sk_psock_tls_strp_read(struct sk_psock *psock, struct sk_buff *skb)  	rcu_read_lock();  	prog = READ_ONCE(psock->progs.skb_verdict);  	if (likely(prog)) { -		/* We skip full set_owner_r here because if we do a SK_PASS -		 * or SK_DROP we can skip skb memory accounting and use the -		 * TLS context. -		 */  		skb->sk = psock->sk;  		tcp_skb_bpf_redirect_clear(skb);  		ret = sk_psock_bpf_run(psock, prog, skb); @@ -880,12 +876,13 @@ static void sk_psock_strp_read(struct strparser *strp, struct sk_buff *skb)  		kfree_skb(skb);  		goto out;  	} -	skb_set_owner_r(skb, sk);  	prog = READ_ONCE(psock->progs.skb_verdict);  	if (likely(prog)) { +		skb->sk = sk;  		tcp_skb_bpf_redirect_clear(skb);  		ret = sk_psock_bpf_run(psock, prog, skb);  		ret = sk_psock_map_verd(ret, tcp_skb_bpf_redirect_fetch(skb)); +		skb->sk = NULL;  	}  	sk_psock_verdict_apply(psock, skb, ret);  out: @@ -956,12 +953,13 @@ static int sk_psock_verdict_recv(read_descriptor_t *desc, struct sk_buff *skb,  		kfree_skb(skb);  		goto out;  	} -	skb_set_owner_r(skb, sk);  	prog = READ_ONCE(psock->progs.skb_verdict);  	if (likely(prog)) { +		skb->sk = sk;  		tcp_skb_bpf_redirect_clear(skb);  		ret = sk_psock_bpf_run(psock, prog, skb);  		ret = sk_psock_map_verd(ret, tcp_skb_bpf_redirect_fetch(skb)); +		skb->sk = NULL;  	}  	sk_psock_verdict_apply(psock, skb, ret);  out:  |