mm: update callers to use HASH_ZERO flag
authorPavel Tatashin <pasha.tatashin@oracle.com>
Thu, 6 Jul 2017 22:39:11 +0000 (15:39 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 6 Jul 2017 23:24:33 +0000 (16:24 -0700)
Update dcache, inode, pid, mountpoint, and mount hash tables to use
HASH_ZERO, and remove initialization after allocations.  In case of
places where HASH_EARLY was used such as in __pv_init_lock_hash the
zeroed hash table was already assumed, because memblock zeroes the
memory.

CPU: SPARC M6, Memory: 7T
Before fix:
  Dentry cache hash table entries: 1073741824
  Inode-cache hash table entries: 536870912
  Mount-cache hash table entries: 16777216
  Mountpoint-cache hash table entries: 16777216
  ftrace: allocating 20414 entries in 40 pages
  Total time: 11.798s

After fix:
  Dentry cache hash table entries: 1073741824
  Inode-cache hash table entries: 536870912
  Mount-cache hash table entries: 16777216
  Mountpoint-cache hash table entries: 16777216
  ftrace: allocating 20414 entries in 40 pages
  Total time: 3.198s

CPU: Intel Xeon E5-2630, Memory: 2.2T:
Before fix:
  Dentry cache hash table entries: 536870912
  Inode-cache hash table entries: 268435456
  Mount-cache hash table entries: 8388608
  Mountpoint-cache hash table entries: 8388608
  CPU: Physical Processor ID: 0
  Total time: 3.245s

After fix:
  Dentry cache hash table entries: 536870912
  Inode-cache hash table entries: 268435456
  Mount-cache hash table entries: 8388608
  Mountpoint-cache hash table entries: 8388608
  CPU: Physical Processor ID: 0
  Total time: 3.244s

Link: http://lkml.kernel.org/r/1488432825-92126-4-git-send-email-pasha.tatashin@oracle.com
Signed-off-by: Pavel Tatashin <pasha.tatashin@oracle.com>
Reviewed-by: Babu Moger <babu.moger@oracle.com>
Cc: David Miller <davem@davemloft.net>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
fs/dcache.c
fs/inode.c
fs/namespace.c
kernel/locking/qspinlock_paravirt.h
kernel/pid.c

index a9f995f6859eb19ea3c5cddac19d86512ccf1d1e..a140fe1dbb1acc26e9e452f06b8ca108c085ecca 100644 (file)
@@ -3546,8 +3546,6 @@ __setup("dhash_entries=", set_dhash_entries);
 
 static void __init dcache_init_early(void)
 {
-       unsigned int loop;
-
        /* If hashes are distributed across NUMA nodes, defer
         * hash allocation until vmalloc space is available.
         */
@@ -3559,24 +3557,19 @@ static void __init dcache_init_early(void)
                                        sizeof(struct hlist_bl_head),
                                        dhash_entries,
                                        13,
-                                       HASH_EARLY,
+                                       HASH_EARLY | HASH_ZERO,
                                        &d_hash_shift,
                                        &d_hash_mask,
                                        0,
                                        0);
-
-       for (loop = 0; loop < (1U << d_hash_shift); loop++)
-               INIT_HLIST_BL_HEAD(dentry_hashtable + loop);
 }
 
 static void __init dcache_init(void)
 {
-       unsigned int loop;
-
-       /* 
+       /*
         * A constructor could be added for stable state like the lists,
         * but it is probably not worth it because of the cache nature
-        * of the dcache. 
+        * of the dcache.
         */
        dentry_cache = KMEM_CACHE(dentry,
                SLAB_RECLAIM_ACCOUNT|SLAB_PANIC|SLAB_MEM_SPREAD|SLAB_ACCOUNT);
@@ -3590,14 +3583,11 @@ static void __init dcache_init(void)
                                        sizeof(struct hlist_bl_head),
                                        dhash_entries,
                                        13,
-                                       0,
+                                       HASH_ZERO,
                                        &d_hash_shift,
                                        &d_hash_mask,
                                        0,
                                        0);
-
-       for (loop = 0; loop < (1U << d_hash_shift); loop++)
-               INIT_HLIST_BL_HEAD(dentry_hashtable + loop);
 }
 
 /* SLAB cache for __getname() consumers */
index ab3b9a795c0b73130968e04e388d8160017106fd..5cbc8e6e93905b1a8f880dfcf82065442e0933e9 100644 (file)
@@ -1915,8 +1915,6 @@ __setup("ihash_entries=", set_ihash_entries);
  */
 void __init inode_init_early(void)
 {
-       unsigned int loop;
-
        /* If hashes are distributed across NUMA nodes, defer
         * hash allocation until vmalloc space is available.
         */
@@ -1928,20 +1926,15 @@ void __init inode_init_early(void)
                                        sizeof(struct hlist_head),
                                        ihash_entries,
                                        14,
-                                       HASH_EARLY,
+                                       HASH_EARLY | HASH_ZERO,
                                        &i_hash_shift,
                                        &i_hash_mask,
                                        0,
                                        0);
-
-       for (loop = 0; loop < (1U << i_hash_shift); loop++)
-               INIT_HLIST_HEAD(&inode_hashtable[loop]);
 }
 
 void __init inode_init(void)
 {
-       unsigned int loop;
-
        /* inode slab cache */
        inode_cachep = kmem_cache_create("inode_cache",
                                         sizeof(struct inode),
@@ -1959,14 +1952,11 @@ void __init inode_init(void)
                                        sizeof(struct hlist_head),
                                        ihash_entries,
                                        14,
-                                       0,
+                                       HASH_ZERO,
                                        &i_hash_shift,
                                        &i_hash_mask,
                                        0,
                                        0);
-
-       for (loop = 0; loop < (1U << i_hash_shift); loop++)
-               INIT_HLIST_HEAD(&inode_hashtable[loop]);
 }
 
 void init_special_inode(struct inode *inode, umode_t mode, dev_t rdev)
index f70914a859a4a1318e40f2226c0dc0965ade67a0..81f934b5d5718665cbfe6c3c44d3bdb716bc6711 100644 (file)
@@ -3239,7 +3239,6 @@ static void __init init_mount_tree(void)
 
 void __init mnt_init(void)
 {
-       unsigned u;
        int err;
 
        mnt_cache = kmem_cache_create("mnt_cache", sizeof(struct mount),
@@ -3248,22 +3247,17 @@ void __init mnt_init(void)
        mount_hashtable = alloc_large_system_hash("Mount-cache",
                                sizeof(struct hlist_head),
                                mhash_entries, 19,
-                               0,
+                               HASH_ZERO,
                                &m_hash_shift, &m_hash_mask, 0, 0);
        mountpoint_hashtable = alloc_large_system_hash("Mountpoint-cache",
                                sizeof(struct hlist_head),
                                mphash_entries, 19,
-                               0,
+                               HASH_ZERO,
                                &mp_hash_shift, &mp_hash_mask, 0, 0);
 
        if (!mount_hashtable || !mountpoint_hashtable)
                panic("Failed to allocate mount hash table\n");
 
-       for (u = 0; u <= m_hash_mask; u++)
-               INIT_HLIST_HEAD(&mount_hashtable[u]);
-       for (u = 0; u <= mp_hash_mask; u++)
-               INIT_HLIST_HEAD(&mountpoint_hashtable[u]);
-
        kernfs_init();
 
        err = sysfs_init();
index e6b2f7ad3e51d4fb901be3e1d02dcea84aca0b2a..4ccfcaae5b89da53ae688893eddbc717c5124317 100644 (file)
@@ -193,7 +193,8 @@ void __init __pv_init_lock_hash(void)
         */
        pv_lock_hash = alloc_large_system_hash("PV qspinlock",
                                               sizeof(struct pv_hash_entry),
-                                              pv_hash_size, 0, HASH_EARLY,
+                                              pv_hash_size, 0,
+                                              HASH_EARLY | HASH_ZERO,
                                               &pv_lock_hash_bits, NULL,
                                               pv_hash_size, pv_hash_size);
 }
index fd1cde1e45760df67a6cc54fa97959061660ab3f..731c4e528f4e3cb2150370b37dc22afe9dc8e5cb 100644 (file)
@@ -575,16 +575,13 @@ struct pid *find_ge_pid(int nr, struct pid_namespace *ns)
  */
 void __init pidhash_init(void)
 {
-       unsigned int i, pidhash_size;
+       unsigned int pidhash_size;
 
        pid_hash = alloc_large_system_hash("PID", sizeof(*pid_hash), 0, 18,
-                                          HASH_EARLY | HASH_SMALL,
+                                          HASH_EARLY | HASH_SMALL | HASH_ZERO,
                                           &pidhash_shift, NULL,
                                           0, 4096);
        pidhash_size = 1U << pidhash_shift;
-
-       for (i = 0; i < pidhash_size; i++)
-               INIT_HLIST_HEAD(&pid_hash[i]);
 }
 
 void __init pidmap_init(void)