mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	ipv6: Preallocate nhc_pcpu_rth_output in ip6_route_info_create().
ip6_route_info_create_nh() will be called under RCU. It calls fib_nh_common_init() and allocates nhc->nhc_pcpu_rth_output. As with the reason for rt->fib6_nh->rt6i_pcpu, we want to avoid GFP_ATOMIC allocation for nhc->nhc_pcpu_rth_output under RCU. Let's preallocate it in ip6_route_info_create(). Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com> Link: https://patch.msgid.link/20250418000443.43734-9-kuniyu@amazon.com Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
		
							parent
							
								
									5720a328c3
								
							
						
					
					
						commit
						d27b9c40db
					
				
					 2 changed files with 15 additions and 4 deletions
				
			
		| 
						 | 
				
			
			@ -617,10 +617,12 @@ int fib_nh_common_init(struct net *net, struct fib_nh_common *nhc,
 | 
			
		|||
{
 | 
			
		||||
	int err;
 | 
			
		||||
 | 
			
		||||
	nhc->nhc_pcpu_rth_output = alloc_percpu_gfp(struct rtable __rcu *,
 | 
			
		||||
						    gfp_flags);
 | 
			
		||||
	if (!nhc->nhc_pcpu_rth_output)
 | 
			
		||||
		return -ENOMEM;
 | 
			
		||||
	if (!nhc->nhc_pcpu_rth_output) {
 | 
			
		||||
		nhc->nhc_pcpu_rth_output = alloc_percpu_gfp(struct rtable __rcu *,
 | 
			
		||||
							    gfp_flags);
 | 
			
		||||
		if (!nhc->nhc_pcpu_rth_output)
 | 
			
		||||
			return -ENOMEM;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (encap) {
 | 
			
		||||
		struct lwtunnel_state *lwtstate;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3732,10 +3732,19 @@ 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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue