]> git.hungrycats.org Git - linux/commitdiff
[PATCH] Make i/dhash_entries cmdline work as it use to.
authorJose R. Santos <jrsantos@austin.ibm.com>
Mon, 23 Aug 2004 05:46:07 +0000 (22:46 -0700)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Mon, 23 Aug 2004 05:46:07 +0000 (22:46 -0700)
I was looking at the recent for >MAX_ORDER hash tables but it seems that
the patch limits the number of entries to what it thinks are good values
and the i/dhash_entries cmdline options can not exceed this.

This seems to limit the usability of the patch on systems were larger
allocations that the ones the kernel calculates are desired.

- Make ihash_entries and dhash_entries cmdline option behave like it use to.

- Remove MAX_SYS_HASH_TABLE_ORDER.  Limit the max size to 1/16 the total
  number of pages.

Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
include/linux/mmzone.h
mm/page_alloc.c

index 8a23709fe18a0ec41e7ef550144a260c9679ba07..47431567a76fad6f85cfa024d1bbf7c2ed395ff3 100644 (file)
 #define MAX_ORDER CONFIG_FORCE_MAX_ZONEORDER
 #endif
 
-/*
- * system hash table size limits
- * - on large memory machines, we may want to allocate a bigger hash than that
- *   permitted by MAX_ORDER, so we allocate with the bootmem allocator, and are
- *   limited to this size
- */
-#if MAX_ORDER > 14
-#define MAX_SYS_HASH_TABLE_ORDER MAX_ORDER
-#else
-#define MAX_SYS_HASH_TABLE_ORDER 14
-#endif
-
 struct free_area {
        struct list_head        free_list;
        unsigned long           *map;
index 6708f4f80b43567e9297b8e0f58fe56fde979f09..a3f2a7407ac77bc5f0c8ad80a47c2f5c2d2f602b 100644 (file)
@@ -1989,41 +1989,40 @@ void *__init alloc_large_system_hash(const char *tablename,
                                     unsigned int *_hash_shift,
                                     unsigned int *_hash_mask)
 {
-       unsigned long mem, max, log2qty, size;
+       unsigned long long max;
+       unsigned long log2qty, size;
        void *table;
 
-       /* round applicable memory size up to nearest megabyte */
-       mem = consider_highmem ? nr_all_pages : nr_kernel_pages;
-       mem += (1UL << (20 - PAGE_SHIFT)) - 1;
-       mem >>= 20 - PAGE_SHIFT;
-       mem <<= 20 - PAGE_SHIFT;
-
-       /* limit to 1 bucket per 2^scale bytes of low memory (rounded up to
-        * nearest power of 2 in size) */
-       if (scale > PAGE_SHIFT)
-               mem >>= (scale - PAGE_SHIFT);
-       else
-               mem <<= (PAGE_SHIFT - scale);
-
-       mem = 1UL << (long_log2(mem) + 1);
+       /* allow the kernel cmdline to have a say */
+       if (!numentries) {
+               /* round applicable memory size up to nearest megabyte */
+               numentries = consider_highmem ? nr_all_pages : nr_kernel_pages;
+               numentries += (1UL << (20 - PAGE_SHIFT)) - 1;
+               numentries >>= 20 - PAGE_SHIFT;
+               numentries <<= 20 - PAGE_SHIFT;
+
+               /* limit to 1 bucket per 2^scale bytes of low memory */
+               if (scale > PAGE_SHIFT)
+                       numentries >>= (scale - PAGE_SHIFT);
+               else
+                       numentries <<= (PAGE_SHIFT - scale);
+       }
+       /* rounded up to nearest power of 2 in size */
+       numentries = 1UL << (long_log2(numentries) + 1);
 
-       /* limit allocation size */
-       max = (1UL << (PAGE_SHIFT + MAX_SYS_HASH_TABLE_ORDER)) / bucketsize;
-       if (max > mem)
-               max = mem;
+       /* limit allocation size to 1/16 total memory */
+       max = ((unsigned long long)nr_all_pages << PAGE_SHIFT) >> 4;
+       do_div(max, bucketsize);
 
-       /* allow the kernel cmdline to have a say */
-       if (!numentries || numentries > max)
+       if (numentries > max)
                numentries = max;
 
        log2qty = long_log2(numentries);
 
        do {
                size = bucketsize << log2qty;
-
-               table = (void *) alloc_bootmem(size);
-
-       } while (!table && size > PAGE_SIZE);
+               table = alloc_bootmem(size);
+       } while (!table && size > PAGE_SIZE && --log2qty);
 
        if (!table)
                panic("Failed to allocate %s hash table\n", tablename);