forked from mirrors/linux
		
	ipv6: Revert two per-cpu var allocation for RTM_NEWROUTE.
These two commits preallocated two per-cpu variables in ip6_route_info_create() as fib_nh_common_init() and fib6_nh_init() were expected to be called under RCU. * commitd27b9c40db("ipv6: Preallocate nhc_pcpu_rth_output in ip6_route_info_create().") * commit5720a328c3("ipv6: Preallocate rt->fib6_nh->rt6i_pcpu in ip6_route_info_create().") Now these functions can be called without RCU and can use GFP_KERNEL. Let's revert the commits. Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com> Link: https://patch.msgid.link/20250516022759.44392-8-kuniyu@amazon.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
		
							parent
							
								
									d465bd07d1
								
							
						
					
					
						commit
						002dba13c8
					
				
					 2 changed files with 7 additions and 37 deletions
				
			
		|  | @ -617,12 +617,10 @@ int fib_nh_common_init(struct net *net, struct fib_nh_common *nhc, | ||||||
| { | { | ||||||
| 	int err; | 	int err; | ||||||
| 
 | 
 | ||||||
| 	if (!nhc->nhc_pcpu_rth_output) { | 	nhc->nhc_pcpu_rth_output = alloc_percpu_gfp(struct rtable __rcu *, | ||||||
| 		nhc->nhc_pcpu_rth_output = alloc_percpu_gfp(struct rtable __rcu *, | 						    gfp_flags); | ||||||
| 							    gfp_flags); | 	if (!nhc->nhc_pcpu_rth_output) | ||||||
| 		if (!nhc->nhc_pcpu_rth_output) | 		return -ENOMEM; | ||||||
| 			return -ENOMEM; |  | ||||||
| 	} |  | ||||||
| 
 | 
 | ||||||
| 	if (encap) { | 	if (encap) { | ||||||
| 		struct lwtunnel_state *lwtstate; | 		struct lwtunnel_state *lwtstate; | ||||||
|  |  | ||||||
|  | @ -3674,12 +3674,10 @@ int fib6_nh_init(struct net *net, struct fib6_nh *fib6_nh, | ||||||
| 		goto out; | 		goto out; | ||||||
| 
 | 
 | ||||||
| pcpu_alloc: | pcpu_alloc: | ||||||
|  | 	fib6_nh->rt6i_pcpu = alloc_percpu_gfp(struct rt6_info *, gfp_flags); | ||||||
| 	if (!fib6_nh->rt6i_pcpu) { | 	if (!fib6_nh->rt6i_pcpu) { | ||||||
| 		fib6_nh->rt6i_pcpu = alloc_percpu_gfp(struct rt6_info *, gfp_flags); | 		err = -ENOMEM; | ||||||
| 		if (!fib6_nh->rt6i_pcpu) { | 		goto out; | ||||||
| 			err = -ENOMEM; |  | ||||||
| 			goto out; |  | ||||||
| 		} |  | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	fib6_nh->fib_nh_dev = dev; | 	fib6_nh->fib_nh_dev = dev; | ||||||
|  | @ -3739,24 +3737,6 @@ void fib6_nh_release_dsts(struct fib6_nh *fib6_nh) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static int fib6_nh_prealloc_percpu(struct fib6_nh *fib6_nh, gfp_t gfp_flags) |  | ||||||
| { |  | ||||||
| 	struct fib_nh_common *nhc = &fib6_nh->nh_common; |  | ||||||
| 
 |  | ||||||
| 	fib6_nh->rt6i_pcpu = alloc_percpu_gfp(struct rt6_info *, gfp_flags); |  | ||||||
| 	if (!fib6_nh->rt6i_pcpu) |  | ||||||
| 		return -ENOMEM; |  | ||||||
| 
 |  | ||||||
| 	nhc->nhc_pcpu_rth_output = alloc_percpu_gfp(struct rtable __rcu *, |  | ||||||
| 						    gfp_flags); |  | ||||||
| 	if (!nhc->nhc_pcpu_rth_output) { |  | ||||||
| 		free_percpu(fib6_nh->rt6i_pcpu); |  | ||||||
| 		return -ENOMEM; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return 0; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static struct fib6_info *ip6_route_info_create(struct fib6_config *cfg, | static struct fib6_info *ip6_route_info_create(struct fib6_config *cfg, | ||||||
| 					       gfp_t gfp_flags, | 					       gfp_t gfp_flags, | ||||||
| 					       struct netlink_ext_ack *extack) | 					       struct netlink_ext_ack *extack) | ||||||
|  | @ -3794,12 +3774,6 @@ static struct fib6_info *ip6_route_info_create(struct fib6_config *cfg, | ||||||
| 		goto free; | 		goto free; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if (!cfg->fc_nh_id) { |  | ||||||
| 		err = fib6_nh_prealloc_percpu(&rt->fib6_nh[0], gfp_flags); |  | ||||||
| 		if (err) |  | ||||||
| 			goto free_metrics; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if (cfg->fc_flags & RTF_ADDRCONF) | 	if (cfg->fc_flags & RTF_ADDRCONF) | ||||||
| 		rt->dst_nocount = true; | 		rt->dst_nocount = true; | ||||||
| 
 | 
 | ||||||
|  | @ -3824,8 +3798,6 @@ static struct fib6_info *ip6_route_info_create(struct fib6_config *cfg, | ||||||
| 	rt->fib6_src.plen = cfg->fc_src_len; | 	rt->fib6_src.plen = cfg->fc_src_len; | ||||||
| #endif | #endif | ||||||
| 	return rt; | 	return rt; | ||||||
| free_metrics: |  | ||||||
| 	ip_fib_metrics_put(rt->fib6_metrics); |  | ||||||
| free: | free: | ||||||
| 	kfree(rt); | 	kfree(rt); | ||||||
| err: | err: | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Kuniyuki Iwashima
						Kuniyuki Iwashima