forked from mirrors/linux
		
	net: use unrcu_pointer() helper
Toke mentioned unrcu_pointer() existence, allowing to remove some of the ugly casts we have when using xchg() for rcu protected pointers. Also make inet_rcv_compat const. Signed-off-by: Eric Dumazet <edumazet@google.com> Cc: Toke Høiland-Jørgensen <toke@redhat.com> Reviewed-by: Toke Høiland-Jørgensen <toke@redhat.com> Link: https://lore.kernel.org/r/20240604111603.45871-1-edumazet@google.com Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
		
							parent
							
								
									59d0f48160
								
							
						
					
					
						commit
						b4cb4a1391
					
				
					 12 changed files with 19 additions and 21 deletions
				
			
		|  | @ -2095,7 +2095,7 @@ sk_dst_set(struct sock *sk, struct dst_entry *dst) | |||
| 
 | ||||
| 	sk_tx_queue_clear(sk); | ||||
| 	WRITE_ONCE(sk->sk_dst_pending_confirm, 0); | ||||
| 	old_dst = xchg((__force struct dst_entry **)&sk->sk_dst_cache, dst); | ||||
| 	old_dst = unrcu_pointer(xchg(&sk->sk_dst_cache, RCU_INITIALIZER(dst))); | ||||
| 	dst_release(old_dst); | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -206,7 +206,7 @@ void gen_kill_estimator(struct net_rate_estimator __rcu **rate_est) | |||
| { | ||||
| 	struct net_rate_estimator *est; | ||||
| 
 | ||||
| 	est = xchg((__force struct net_rate_estimator **)rate_est, NULL); | ||||
| 	est = unrcu_pointer(xchg(rate_est, NULL)); | ||||
| 	if (est) { | ||||
| 		timer_shutdown_sync(&est->timer); | ||||
| 		kfree_rcu(est, rcu); | ||||
|  |  | |||
|  | @ -18,7 +18,7 @@ | |||
| 
 | ||||
| static const struct sock_diag_handler __rcu *sock_diag_handlers[AF_MAX]; | ||||
| 
 | ||||
| static struct sock_diag_inet_compat __rcu *inet_rcv_compat; | ||||
| static const struct sock_diag_inet_compat __rcu *inet_rcv_compat; | ||||
| 
 | ||||
| static struct workqueue_struct *broadcast_wq; | ||||
| 
 | ||||
|  | @ -187,8 +187,7 @@ void sock_diag_broadcast_destroy(struct sock *sk) | |||
| 
 | ||||
| void sock_diag_register_inet_compat(const struct sock_diag_inet_compat *ptr) | ||||
| { | ||||
| 	xchg((__force const struct sock_diag_inet_compat **)&inet_rcv_compat, | ||||
| 	     ptr); | ||||
| 	xchg(&inet_rcv_compat, RCU_INITIALIZER(ptr)); | ||||
| } | ||||
| EXPORT_SYMBOL_GPL(sock_diag_register_inet_compat); | ||||
| 
 | ||||
|  | @ -196,8 +195,7 @@ void sock_diag_unregister_inet_compat(const struct sock_diag_inet_compat *ptr) | |||
| { | ||||
| 	const struct sock_diag_inet_compat *old; | ||||
| 
 | ||||
| 	old = xchg((__force const struct sock_diag_inet_compat **)&inet_rcv_compat, | ||||
| 		   NULL); | ||||
| 	old = unrcu_pointer(xchg(&inet_rcv_compat, NULL)); | ||||
| 	WARN_ON_ONCE(old != ptr); | ||||
| } | ||||
| EXPORT_SYMBOL_GPL(sock_diag_unregister_inet_compat); | ||||
|  |  | |||
|  | @ -1953,7 +1953,7 @@ int cipso_v4_req_setattr(struct request_sock *req, | |||
| 	buf = NULL; | ||||
| 
 | ||||
| 	req_inet = inet_rsk(req); | ||||
| 	opt = xchg((__force struct ip_options_rcu **)&req_inet->ireq_opt, opt); | ||||
| 	opt = unrcu_pointer(xchg(&req_inet->ireq_opt, RCU_INITIALIZER(opt))); | ||||
| 	if (opt) | ||||
| 		kfree_rcu(opt, rcu); | ||||
| 
 | ||||
|  |  | |||
|  | @ -3081,7 +3081,7 @@ int tcp_disconnect(struct sock *sk, int flags) | |||
| 	icsk->icsk_ack.rcv_mss = TCP_MIN_MSS; | ||||
| 	memset(&tp->rx_opt, 0, sizeof(tp->rx_opt)); | ||||
| 	__sk_dst_reset(sk); | ||||
| 	dst_release(xchg((__force struct dst_entry **)&sk->sk_rx_dst, NULL)); | ||||
| 	dst_release(unrcu_pointer(xchg(&sk->sk_rx_dst, NULL))); | ||||
| 	tcp_saved_syn_free(tp); | ||||
| 	tp->compressed_ack = 0; | ||||
| 	tp->segs_in = 0; | ||||
|  |  | |||
|  | @ -49,7 +49,7 @@ void tcp_fastopen_ctx_destroy(struct net *net) | |||
| { | ||||
| 	struct tcp_fastopen_context *ctxt; | ||||
| 
 | ||||
| 	ctxt = xchg((__force struct tcp_fastopen_context **)&net->ipv4.tcp_fastopen_ctx, NULL); | ||||
| 	ctxt = unrcu_pointer(xchg(&net->ipv4.tcp_fastopen_ctx, NULL)); | ||||
| 
 | ||||
| 	if (ctxt) | ||||
| 		call_rcu(&ctxt->rcu, tcp_fastopen_ctx_free); | ||||
|  | @ -80,9 +80,10 @@ int tcp_fastopen_reset_cipher(struct net *net, struct sock *sk, | |||
| 
 | ||||
| 	if (sk) { | ||||
| 		q = &inet_csk(sk)->icsk_accept_queue.fastopenq; | ||||
| 		octx = xchg((__force struct tcp_fastopen_context **)&q->ctx, ctx); | ||||
| 		octx = unrcu_pointer(xchg(&q->ctx, RCU_INITIALIZER(ctx))); | ||||
| 	} else { | ||||
| 		octx = xchg((__force struct tcp_fastopen_context **)&net->ipv4.tcp_fastopen_ctx, ctx); | ||||
| 		octx = unrcu_pointer(xchg(&net->ipv4.tcp_fastopen_ctx, | ||||
| 					  RCU_INITIALIZER(ctx))); | ||||
| 	} | ||||
| 
 | ||||
| 	if (octx) | ||||
|  |  | |||
|  | @ -2230,7 +2230,7 @@ bool udp_sk_rx_dst_set(struct sock *sk, struct dst_entry *dst) | |||
| 	struct dst_entry *old; | ||||
| 
 | ||||
| 	if (dst_hold_safe(dst)) { | ||||
| 		old = xchg((__force struct dst_entry **)&sk->sk_rx_dst, dst); | ||||
| 		old = unrcu_pointer(xchg(&sk->sk_rx_dst, RCU_INITIALIZER(dst))); | ||||
| 		dst_release(old); | ||||
| 		return old != dst; | ||||
| 	} | ||||
|  |  | |||
|  | @ -509,7 +509,7 @@ void inet6_cleanup_sock(struct sock *sk) | |||
| 
 | ||||
| 	/* Free tx options */ | ||||
| 
 | ||||
| 	opt = xchg((__force struct ipv6_txoptions **)&np->opt, NULL); | ||||
| 	opt = unrcu_pointer(xchg(&np->opt, NULL)); | ||||
| 	if (opt) { | ||||
| 		atomic_sub(opt->tot_len, &sk->sk_omem_alloc); | ||||
| 		txopt_put(opt); | ||||
|  |  | |||
|  | @ -984,7 +984,7 @@ static void __fib6_drop_pcpu_from(struct fib6_nh *fib6_nh, | |||
| 		if (pcpu_rt && rcu_access_pointer(pcpu_rt->from) == match) { | ||||
| 			struct fib6_info *from; | ||||
| 
 | ||||
| 			from = xchg((__force struct fib6_info **)&pcpu_rt->from, NULL); | ||||
| 			from = unrcu_pointer(xchg(&pcpu_rt->from, NULL)); | ||||
| 			fib6_info_release(from); | ||||
| 		} | ||||
| 	} | ||||
|  |  | |||
|  | @ -111,8 +111,7 @@ struct ipv6_txoptions *ipv6_update_options(struct sock *sk, | |||
| 			icsk->icsk_sync_mss(sk, icsk->icsk_pmtu_cookie); | ||||
| 		} | ||||
| 	} | ||||
| 	opt = xchg((__force struct ipv6_txoptions **)&inet6_sk(sk)->opt, | ||||
| 		   opt); | ||||
| 	opt = unrcu_pointer(xchg(&inet6_sk(sk)->opt, RCU_INITIALIZER(opt))); | ||||
| 	sk_dst_reset(sk); | ||||
| 
 | ||||
| 	return opt; | ||||
|  |  | |||
|  | @ -368,7 +368,7 @@ static void ip6_dst_destroy(struct dst_entry *dst) | |||
| 		in6_dev_put(idev); | ||||
| 	} | ||||
| 
 | ||||
| 	from = xchg((__force struct fib6_info **)&rt->from, NULL); | ||||
| 	from = unrcu_pointer(xchg(&rt->from, NULL)); | ||||
| 	fib6_info_release(from); | ||||
| } | ||||
| 
 | ||||
|  | @ -1437,7 +1437,7 @@ static struct rt6_info *rt6_make_pcpu_route(struct net *net, | |||
| 	if (res->f6i->fib6_destroying) { | ||||
| 		struct fib6_info *from; | ||||
| 
 | ||||
| 		from = xchg((__force struct fib6_info **)&pcpu_rt->from, NULL); | ||||
| 		from = unrcu_pointer(xchg(&pcpu_rt->from, NULL)); | ||||
| 		fib6_info_release(from); | ||||
| 	} | ||||
| 
 | ||||
|  | @ -1466,7 +1466,7 @@ static void rt6_remove_exception(struct rt6_exception_bucket *bucket, | |||
| 	/* purge completely the exception to allow releasing the held resources:
 | ||||
| 	 * some [sk] cache may keep the dst around for unlimited time | ||||
| 	 */ | ||||
| 	from = xchg((__force struct fib6_info **)&rt6_ex->rt6i->from, NULL); | ||||
| 	from = unrcu_pointer(xchg(&rt6_ex->rt6i->from, NULL)); | ||||
| 	fib6_info_release(from); | ||||
| 	dst_dev_put(&rt6_ex->rt6i->dst); | ||||
| 
 | ||||
|  |  | |||
|  | @ -62,7 +62,7 @@ static void tcf_set_action_cookie(struct tc_cookie __rcu **old_cookie, | |||
| { | ||||
| 	struct tc_cookie *old; | ||||
| 
 | ||||
| 	old = xchg((__force struct tc_cookie **)old_cookie, new_cookie); | ||||
| 	old = unrcu_pointer(xchg(old_cookie, RCU_INITIALIZER(new_cookie))); | ||||
| 	if (old) | ||||
| 		call_rcu(&old->rcu, tcf_free_cookie_rcu); | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Eric Dumazet
						Eric Dumazet