static int ip6_route_info_create_nh(struct fib6_info *rt,
                                    struct fib6_config *cfg,
+                                   gfp_t gfp_flags,
                                    struct netlink_ext_ack *extack)
 {
        struct net *net = cfg->fc_nlinfo.nl_net;
        } else {
                int addr_type;
 
-               err = fib6_nh_init(net, rt->fib6_nh, cfg, GFP_ATOMIC, extack);
+               err = fib6_nh_init(net, rt->fib6_nh, cfg, gfp_flags, extack);
                if (err)
                        goto out_release;
 
        if (IS_ERR(rt))
                return PTR_ERR(rt);
 
-       err = ip6_route_info_create_nh(rt, cfg, extack);
+       err = ip6_route_info_create_nh(rt, cfg, gfp_flags, extack);
        if (err)
                return err;
 
        if (IS_ERR(f6i))
                return f6i;
 
-       err = ip6_route_info_create_nh(f6i, &cfg, extack);
+       err = ip6_route_info_create_nh(f6i, &cfg, gfp_flags, extack);
        if (err)
                return ERR_PTR(err);
 
                        goto cleanup;
                }
 
-               err = ip6_route_info_create_nh(rt, &r_cfg, extack);
+               err = ip6_route_info_create_nh(rt, &r_cfg, GFP_KERNEL, extack);
                if (err) {
                        rt = NULL;
                        goto cleanup;