diff options
Diffstat (limited to 'net/mptcp/protocol.c')
| -rw-r--r-- | net/mptcp/protocol.c | 12 | 
1 files changed, 7 insertions, 5 deletions
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 7a5afa8c6866..a88924947815 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -474,7 +474,7 @@ static void mptcp_cleanup_rbuf(struct mptcp_sock *msk)  	bool cleanup, rx_empty;  	cleanup = (space > 0) && (space >= (old_space << 1)); -	rx_empty = !atomic_read(&sk->sk_rmem_alloc); +	rx_empty = !__mptcp_rmem(sk);  	mptcp_for_each_subflow(msk, subflow) {  		struct sock *ssk = mptcp_subflow_tcp_sock(subflow); @@ -720,8 +720,10 @@ void mptcp_data_ready(struct sock *sk, struct sock *ssk)  		sk_rbuf = ssk_rbuf;  	/* over limit? can't append more skbs to msk, Also, no need to wake-up*/ -	if (atomic_read(&sk->sk_rmem_alloc) > sk_rbuf) +	if (__mptcp_rmem(sk) > sk_rbuf) { +		MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_RCVPRUNED);  		return; +	}  	/* Wake-up the reader only for in-sequence data */  	mptcp_data_lock(sk); @@ -1754,7 +1756,7 @@ static int __mptcp_recvmsg_mskq(struct mptcp_sock *msk,  		if (!(flags & MSG_PEEK)) {  			/* we will bulk release the skb memory later */  			skb->destructor = NULL; -			msk->rmem_released += skb->truesize; +			WRITE_ONCE(msk->rmem_released, msk->rmem_released + skb->truesize);  			__skb_unlink(skb, &msk->receive_queue);  			__kfree_skb(skb);  		} @@ -1873,7 +1875,7 @@ static void __mptcp_update_rmem(struct sock *sk)  	atomic_sub(msk->rmem_released, &sk->sk_rmem_alloc);  	sk_mem_uncharge(sk, msk->rmem_released); -	msk->rmem_released = 0; +	WRITE_ONCE(msk->rmem_released, 0);  }  static void __mptcp_splice_receive_queue(struct sock *sk) @@ -2380,7 +2382,7 @@ static int __mptcp_init_sock(struct sock *sk)  	msk->out_of_order_queue = RB_ROOT;  	msk->first_pending = NULL;  	msk->wmem_reserved = 0; -	msk->rmem_released = 0; +	WRITE_ONCE(msk->rmem_released, 0);  	msk->tx_pending_data = 0;  	msk->first = NULL;  |