ipv4: Attach FIB info to dst_default_metrics when possible
[cascardo/linux.git] / net / ipv4 / fib_semantics.c
index 363ec39..48e93a5 100644 (file)
@@ -152,7 +152,8 @@ static void free_fib_info_rcu(struct rcu_head *head)
 {
        struct fib_info *fi = container_of(head, struct fib_info, rcu);
 
-       kfree(fi->fib_metrics);
+       if (fi->fib_metrics != (u32 *) dst_default_metrics)
+               kfree(fi->fib_metrics);
        kfree(fi);
 }
 
@@ -743,9 +744,12 @@ struct fib_info *fib_create_info(struct fib_config *cfg)
        fi = kzalloc(sizeof(*fi)+nhs*sizeof(struct fib_nh), GFP_KERNEL);
        if (fi == NULL)
                goto failure;
-       fi->fib_metrics = kzalloc(sizeof(u32) * RTAX_MAX, GFP_KERNEL);
-       if (!fi->fib_metrics)
-               goto failure;
+       if (cfg->fc_mx) {
+               fi->fib_metrics = kzalloc(sizeof(u32) * RTAX_MAX, GFP_KERNEL);
+               if (!fi->fib_metrics)
+                       goto failure;
+       } else
+               fi->fib_metrics = (u32 *) dst_default_metrics;
        fib_info_cnt++;
 
        fi->fib_net = hold_net(net);