diff options
Diffstat (limited to 'net/core/sock.c')
| -rw-r--r-- | net/core/sock.c | 18 | 
1 files changed, 10 insertions, 8 deletions
diff --git a/net/core/sock.c b/net/core/sock.c index 4cb957d934a2..788c1372663c 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -1101,7 +1101,7 @@ int sock_setsockopt(struct socket *sock, int level, int optname,  		 * play 'guess the biggest size' games. RCVBUF/SNDBUF  		 * are treated in BSD as hints  		 */ -		val = min_t(u32, val, sysctl_wmem_max); +		val = min_t(u32, val, READ_ONCE(sysctl_wmem_max));  set_sndbuf:  		/* Ensure val * 2 fits into an int, to prevent max_t()  		 * from treating it as a negative value. @@ -1133,7 +1133,7 @@ set_sndbuf:  		 * play 'guess the biggest size' games. RCVBUF/SNDBUF  		 * are treated in BSD as hints  		 */ -		__sock_set_rcvbuf(sk, min_t(u32, val, sysctl_rmem_max)); +		__sock_set_rcvbuf(sk, min_t(u32, val, READ_ONCE(sysctl_rmem_max)));  		break;  	case SO_RCVBUFFORCE: @@ -2536,7 +2536,7 @@ struct sk_buff *sock_omalloc(struct sock *sk, unsigned long size,  	/* small safe race: SKB_TRUESIZE may differ from final skb->truesize */  	if (atomic_read(&sk->sk_omem_alloc) + SKB_TRUESIZE(size) > -	    sysctl_optmem_max) +	    READ_ONCE(sysctl_optmem_max))  		return NULL;  	skb = alloc_skb(size, priority); @@ -2554,8 +2554,10 @@ struct sk_buff *sock_omalloc(struct sock *sk, unsigned long size,   */  void *sock_kmalloc(struct sock *sk, int size, gfp_t priority)  { -	if ((unsigned int)size <= sysctl_optmem_max && -	    atomic_read(&sk->sk_omem_alloc) + size < sysctl_optmem_max) { +	int optmem_max = READ_ONCE(sysctl_optmem_max); + +	if ((unsigned int)size <= optmem_max && +	    atomic_read(&sk->sk_omem_alloc) + size < optmem_max) {  		void *mem;  		/* First do the add, to avoid the race if kmalloc  		 * might sleep. @@ -3309,8 +3311,8 @@ void sock_init_data(struct socket *sock, struct sock *sk)  	timer_setup(&sk->sk_timer, NULL, 0);  	sk->sk_allocation	=	GFP_KERNEL; -	sk->sk_rcvbuf		=	sysctl_rmem_default; -	sk->sk_sndbuf		=	sysctl_wmem_default; +	sk->sk_rcvbuf		=	READ_ONCE(sysctl_rmem_default); +	sk->sk_sndbuf		=	READ_ONCE(sysctl_wmem_default);  	sk->sk_state		=	TCP_CLOSE;  	sk_set_socket(sk, sock); @@ -3365,7 +3367,7 @@ void sock_init_data(struct socket *sock, struct sock *sk)  #ifdef CONFIG_NET_RX_BUSY_POLL  	sk->sk_napi_id		=	0; -	sk->sk_ll_usec		=	sysctl_net_busy_read; +	sk->sk_ll_usec		=	READ_ONCE(sysctl_net_busy_read);  #endif  	sk->sk_max_pacing_rate = ~0UL;  | 
