aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/ipv4/route.c43
1 files changed, 16 insertions, 27 deletions
diff --git a/net/ipv4/route.c b/net/ipv4/route.c
index daf82f8d3c4a..9fcbb1b0a8d6 100644
--- a/net/ipv4/route.c
+++ b/net/ipv4/route.c
@@ -71,6 +71,7 @@
71#include <linux/kernel.h> 71#include <linux/kernel.h>
72#include <linux/sched.h> 72#include <linux/sched.h>
73#include <linux/mm.h> 73#include <linux/mm.h>
74#include <linux/bootmem.h>
74#include <linux/string.h> 75#include <linux/string.h>
75#include <linux/socket.h> 76#include <linux/socket.h>
76#include <linux/sockios.h> 77#include <linux/sockios.h>
@@ -3103,12 +3104,14 @@ __setup("rhash_entries=", set_rhash_entries);
3103 3104
3104int __init ip_rt_init(void) 3105int __init ip_rt_init(void)
3105{ 3106{
3106 int order, goal, rc = 0; 3107 int rc = 0;
3107 3108
3108 rt_hash_rnd = (int) ((num_physpages ^ (num_physpages>>8)) ^ 3109 rt_hash_rnd = (int) ((num_physpages ^ (num_physpages>>8)) ^
3109 (jiffies ^ (jiffies >> 7))); 3110 (jiffies ^ (jiffies >> 7)));
3110 3111
3111#ifdef CONFIG_NET_CLS_ROUTE 3112#ifdef CONFIG_NET_CLS_ROUTE
3113 {
3114 int order;
3112 for (order = 0; 3115 for (order = 0;
3113 (PAGE_SIZE << order) < 256 * sizeof(struct ip_rt_acct) * NR_CPUS; order++) 3116 (PAGE_SIZE << order) < 256 * sizeof(struct ip_rt_acct) * NR_CPUS; order++)
3114 /* NOTHING */; 3117 /* NOTHING */;
@@ -3116,6 +3119,7 @@ int __init ip_rt_init(void)
3116 if (!ip_rt_acct) 3119 if (!ip_rt_acct)
3117 panic("IP: failed to allocate ip_rt_acct\n"); 3120 panic("IP: failed to allocate ip_rt_acct\n");
3118 memset(ip_rt_acct, 0, PAGE_SIZE << order); 3121 memset(ip_rt_acct, 0, PAGE_SIZE << order);
3122 }
3119#endif 3123#endif
3120 3124
3121 ipv4_dst_ops.kmem_cachep = kmem_cache_create("ip_dst_cache", 3125 ipv4_dst_ops.kmem_cachep = kmem_cache_create("ip_dst_cache",
@@ -3126,32 +3130,17 @@ int __init ip_rt_init(void)
3126 if (!ipv4_dst_ops.kmem_cachep) 3130 if (!ipv4_dst_ops.kmem_cachep)
3127 panic("IP: failed to allocate ip_dst_cache\n"); 3131 panic("IP: failed to allocate ip_dst_cache\n");
3128 3132
3129 goal = num_physpages >> (26 - PAGE_SHIFT); 3133 rt_hash_table = (struct rt_hash_bucket *)
3130 if (rhash_entries) 3134 alloc_large_system_hash("IP route cache",
3131 goal = (rhash_entries * sizeof(struct rt_hash_bucket)) >> PAGE_SHIFT; 3135 sizeof(struct rt_hash_bucket),
3132 for (order = 0; (1UL << order) < goal; order++) 3136 rhash_entries,
3133 /* NOTHING */; 3137 (num_physpages >= 128 * 1024) ?
3134 3138 (27 - PAGE_SHIFT) :
3135 do { 3139 (29 - PAGE_SHIFT),
3136 rt_hash_mask = (1UL << order) * PAGE_SIZE / 3140 HASH_HIGHMEM,
3137 sizeof(struct rt_hash_bucket); 3141 &rt_hash_log,
3138 while (rt_hash_mask & (rt_hash_mask - 1)) 3142 &rt_hash_mask,
3139 rt_hash_mask--; 3143 0);
3140 rt_hash_table = (struct rt_hash_bucket *)
3141 __get_free_pages(GFP_ATOMIC, order);
3142 } while (rt_hash_table == NULL && --order > 0);
3143
3144 if (!rt_hash_table)
3145 panic("Failed to allocate IP route cache hash table\n");
3146
3147 printk(KERN_INFO "IP: routing cache hash table of %u buckets, %ldKbytes\n",
3148 rt_hash_mask,
3149 (long) (rt_hash_mask * sizeof(struct rt_hash_bucket)) / 1024);
3150
3151 for (rt_hash_log = 0; (1 << rt_hash_log) != rt_hash_mask; rt_hash_log++)
3152 /* NOTHING */;
3153
3154 rt_hash_mask--;
3155 memset(rt_hash_table, 0, (rt_hash_mask + 1) * sizeof(struct rt_hash_bucket)); 3144 memset(rt_hash_table, 0, (rt_hash_mask + 1) * sizeof(struct rt_hash_bucket));
3156 rt_hash_lock_init(); 3145 rt_hash_lock_init();
3157 3146