@@ -1037,7 +1037,7 @@ ipv6_add_addr(struct inet6_dev *idev, const struct in6_addr *addr,
1037
1037
goto out ;
1038
1038
}
1039
1039
1040
- rt = addrconf_dst_alloc (net , idev , addr , false);
1040
+ rt = addrconf_dst_alloc (net , idev , addr , false, gfp_flags );
1041
1041
if (IS_ERR (rt )) {
1042
1042
err = PTR_ERR (rt );
1043
1043
rt = NULL ;
@@ -2320,7 +2320,7 @@ static void ipv6_try_regen_rndid(struct inet6_dev *idev, struct in6_addr *tmpad
2320
2320
2321
2321
static void
2322
2322
addrconf_prefix_route (struct in6_addr * pfx , int plen , struct net_device * dev ,
2323
- unsigned long expires , u32 flags )
2323
+ unsigned long expires , u32 flags , gfp_t gfp_flags )
2324
2324
{
2325
2325
struct fib6_config cfg = {
2326
2326
.fc_table = l3mdev_fib_table (dev ) ? : RT6_TABLE_PREFIX ,
@@ -2345,7 +2345,7 @@ addrconf_prefix_route(struct in6_addr *pfx, int plen, struct net_device *dev,
2345
2345
cfg .fc_flags |= RTF_NONEXTHOP ;
2346
2346
#endif
2347
2347
2348
- ip6_route_add (& cfg , NULL );
2348
+ ip6_route_add (& cfg , gfp_flags , NULL );
2349
2349
}
2350
2350
2351
2351
@@ -2401,7 +2401,7 @@ static void addrconf_add_mroute(struct net_device *dev)
2401
2401
2402
2402
ipv6_addr_set (& cfg .fc_dst , htonl (0xFF000000 ), 0 , 0 , 0 );
2403
2403
2404
- ip6_route_add (& cfg , NULL );
2404
+ ip6_route_add (& cfg , GFP_ATOMIC , NULL );
2405
2405
}
2406
2406
2407
2407
static struct inet6_dev * addrconf_add_dev (struct net_device * dev )
@@ -2685,7 +2685,7 @@ void addrconf_prefix_rcv(struct net_device *dev, u8 *opt, int len, bool sllao)
2685
2685
expires = jiffies_to_clock_t (rt_expires );
2686
2686
}
2687
2687
addrconf_prefix_route (& pinfo -> prefix , pinfo -> prefix_len ,
2688
- dev , expires , flags );
2688
+ dev , expires , flags , GFP_ATOMIC );
2689
2689
}
2690
2690
ip6_rt_put (rt );
2691
2691
}
@@ -2900,7 +2900,7 @@ static int inet6_addr_add(struct net *net, int ifindex,
2900
2900
if (!IS_ERR (ifp )) {
2901
2901
if (!(ifa_flags & IFA_F_NOPREFIXROUTE )) {
2902
2902
addrconf_prefix_route (& ifp -> addr , ifp -> prefix_len , dev ,
2903
- expires , flags );
2903
+ expires , flags , GFP_KERNEL );
2904
2904
}
2905
2905
2906
2906
/* Send a netlink notification if DAD is enabled and
@@ -3053,7 +3053,8 @@ static void sit_add_v4_addrs(struct inet6_dev *idev)
3053
3053
3054
3054
if (addr .s6_addr32 [3 ]) {
3055
3055
add_addr (idev , & addr , plen , scope );
3056
- addrconf_prefix_route (& addr , plen , idev -> dev , 0 , pflags );
3056
+ addrconf_prefix_route (& addr , plen , idev -> dev , 0 , pflags ,
3057
+ GFP_ATOMIC );
3057
3058
return ;
3058
3059
}
3059
3060
@@ -3078,7 +3079,7 @@ static void sit_add_v4_addrs(struct inet6_dev *idev)
3078
3079
3079
3080
add_addr (idev , & addr , plen , flag );
3080
3081
addrconf_prefix_route (& addr , plen , idev -> dev , 0 ,
3081
- pflags );
3082
+ pflags , GFP_ATOMIC );
3082
3083
}
3083
3084
}
3084
3085
}
@@ -3118,7 +3119,8 @@ void addrconf_add_linklocal(struct inet6_dev *idev,
3118
3119
ifp = ipv6_add_addr (idev , addr , NULL , 64 , IFA_LINK , addr_flags ,
3119
3120
INFINITY_LIFE_TIME , INFINITY_LIFE_TIME , true, NULL );
3120
3121
if (!IS_ERR (ifp )) {
3121
- addrconf_prefix_route (& ifp -> addr , ifp -> prefix_len , idev -> dev , 0 , 0 );
3122
+ addrconf_prefix_route (& ifp -> addr , ifp -> prefix_len , idev -> dev ,
3123
+ 0 , 0 , GFP_ATOMIC );
3122
3124
addrconf_dad_start (ifp );
3123
3125
in6_ifa_put (ifp );
3124
3126
}
@@ -3233,7 +3235,8 @@ static void addrconf_addr_gen(struct inet6_dev *idev, bool prefix_route)
3233
3235
addrconf_add_linklocal (idev , & addr ,
3234
3236
IFA_F_STABLE_PRIVACY );
3235
3237
else if (prefix_route )
3236
- addrconf_prefix_route (& addr , 64 , idev -> dev , 0 , 0 );
3238
+ addrconf_prefix_route (& addr , 64 , idev -> dev ,
3239
+ 0 , 0 , GFP_KERNEL );
3237
3240
break ;
3238
3241
case IN6_ADDR_GEN_MODE_EUI64 :
3239
3242
/* addrconf_add_linklocal also adds a prefix_route and we
@@ -3243,7 +3246,8 @@ static void addrconf_addr_gen(struct inet6_dev *idev, bool prefix_route)
3243
3246
if (ipv6_generate_eui64 (addr .s6_addr + 8 , idev -> dev ) == 0 )
3244
3247
addrconf_add_linklocal (idev , & addr , 0 );
3245
3248
else if (prefix_route )
3246
- addrconf_prefix_route (& addr , 64 , idev -> dev , 0 , 0 );
3249
+ addrconf_prefix_route (& addr , 64 , idev -> dev ,
3250
+ 0 , 0 , GFP_ATOMIC );
3247
3251
break ;
3248
3252
case IN6_ADDR_GEN_MODE_NONE :
3249
3253
default :
@@ -3346,7 +3350,8 @@ static int fixup_permanent_addr(struct net *net,
3346
3350
if (!ifp -> rt || !ifp -> rt -> rt6i_node ) {
3347
3351
struct rt6_info * rt , * prev ;
3348
3352
3349
- rt = addrconf_dst_alloc (net , idev , & ifp -> addr , false);
3353
+ rt = addrconf_dst_alloc (net , idev , & ifp -> addr , false,
3354
+ GFP_ATOMIC );
3350
3355
if (IS_ERR (rt ))
3351
3356
return PTR_ERR (rt );
3352
3357
@@ -3361,7 +3366,7 @@ static int fixup_permanent_addr(struct net *net,
3361
3366
3362
3367
if (!(ifp -> flags & IFA_F_NOPREFIXROUTE )) {
3363
3368
addrconf_prefix_route (& ifp -> addr , ifp -> prefix_len ,
3364
- idev -> dev , 0 , 0 );
3369
+ idev -> dev , 0 , 0 , GFP_ATOMIC );
3365
3370
}
3366
3371
3367
3372
if (ifp -> state == INET6_IFADDR_STATE_PREDAD )
@@ -4572,8 +4577,9 @@ static int inet6_addr_modify(struct inet6_ifaddr *ifp, u32 ifa_flags,
4572
4577
ipv6_ifa_notify (0 , ifp );
4573
4578
4574
4579
if (!(ifa_flags & IFA_F_NOPREFIXROUTE )) {
4575
- addrconf_prefix_route (& ifp -> addr , ifp -> prefix_len , ifp -> idev -> dev ,
4576
- expires , flags );
4580
+ addrconf_prefix_route (& ifp -> addr , ifp -> prefix_len ,
4581
+ ifp -> idev -> dev , expires , flags ,
4582
+ GFP_KERNEL );
4577
4583
} else if (had_prefixroute ) {
4578
4584
enum cleanup_prefix_rt_t action ;
4579
4585
unsigned long rt_expires ;
@@ -5614,7 +5620,8 @@ static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp)
5614
5620
addrconf_join_anycast (ifp );
5615
5621
if (!ipv6_addr_any (& ifp -> peer_addr ))
5616
5622
addrconf_prefix_route (& ifp -> peer_addr , 128 ,
5617
- ifp -> idev -> dev , 0 , 0 );
5623
+ ifp -> idev -> dev , 0 , 0 ,
5624
+ GFP_KERNEL );
5618
5625
break ;
5619
5626
case RTM_DELADDR :
5620
5627
if (ifp -> idev -> cnf .forwarding )
0 commit comments