diff options
Diffstat (limited to 'net')
| -rw-r--r-- | net/core/skmsg.c | 6 | ||||
| -rw-r--r-- | net/ipv4/tcp_bpf.c | 4 | 
2 files changed, 8 insertions, 2 deletions
| diff --git a/net/core/skmsg.c b/net/core/skmsg.c index e90fbab703b2..8ad7e6755fd6 100644 --- a/net/core/skmsg.c +++ b/net/core/skmsg.c @@ -445,8 +445,10 @@ int sk_msg_recvmsg(struct sock *sk, struct sk_psock *psock, struct msghdr *msg,  			if (likely(!peek)) {  				sge->offset += copy;  				sge->length -= copy; -				if (!msg_rx->skb) +				if (!msg_rx->skb) {  					sk_mem_uncharge(sk, copy); +					atomic_sub(copy, &sk->sk_rmem_alloc); +				}  				msg_rx->sg.size -= copy;  				if (!sge->length) { @@ -772,6 +774,8 @@ static void __sk_psock_purge_ingress_msg(struct sk_psock *psock)  	list_for_each_entry_safe(msg, tmp, &psock->ingress_msg, list) {  		list_del(&msg->list); +		if (!msg->skb) +			atomic_sub(msg->sg.size, &psock->sk->sk_rmem_alloc);  		sk_msg_free(psock->sk, msg);  		kfree(msg);  	} diff --git a/net/ipv4/tcp_bpf.c b/net/ipv4/tcp_bpf.c index b21ea634909c..392678ae80f4 100644 --- a/net/ipv4/tcp_bpf.c +++ b/net/ipv4/tcp_bpf.c @@ -56,6 +56,7 @@ static int bpf_tcp_ingress(struct sock *sk, struct sk_psock *psock,  		}  		sk_mem_charge(sk, size); +		atomic_add(size, &sk->sk_rmem_alloc);  		sk_msg_xfer(tmp, msg, i, size);  		copied += size;  		if (sge->length) @@ -74,7 +75,8 @@ static int bpf_tcp_ingress(struct sock *sk, struct sk_psock *psock,  	if (!ret) {  		msg->sg.start = i; -		sk_psock_queue_msg(psock, tmp); +		if (!sk_psock_queue_msg(psock, tmp)) +			atomic_sub(copied, &sk->sk_rmem_alloc);  		sk_psock_data_ready(sk, psock);  	} else {  		sk_msg_free(sk, tmp); | 
