]> granicus.if.org Git - zfs/commitdiff
Reduce size of zfs_sb_t: allocate z_hold_mtx separately
authorChris Dunlop <chris@onthe.net.au>
Mon, 16 Mar 2015 01:21:21 +0000 (12:21 +1100)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Tue, 24 Mar 2015 20:17:44 +0000 (13:17 -0700)
zfs_sb_t has grown to the point where using kmem_zalloc() for allocations
is triggering the 32k warning threshold.

We can't safely convert this entire allocation to use vmem_alloc() instead
of kmem_alloc() because the backing_dev_info structure is embedded here.
It depends on the bit_waitqueue() function which won't behave properly
when given a virtual address.

Instead, use vmem_alloc() to allocate the z_hold_mtx array separately.

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Chris Dunlop <chris@onthe.net.au>
Closes #3178

include/sys/zfs_vfsops.h
module/zfs/zfs_vfsops.c
module/zfs/zfs_znode.c

index 4b88260de2b91f01f6e561e5ba741a4abde916e9..c4db2a911d3e7fb0ea3b342be1b1b8ab78e16b01 100644 (file)
@@ -92,7 +92,7 @@ typedef struct zfs_sb {
        uint64_t        z_replay_eof;   /* New end of file - replay only */
        sa_attr_type_t  *z_attr_table;  /* SA attr mapping->id */
 #define        ZFS_OBJ_MTX_SZ  256
-       kmutex_t        z_hold_mtx[ZFS_OBJ_MTX_SZ];     /* znode hold locks */
+       kmutex_t        *z_hold_mtx;    /* znode hold locks */
 } zfs_sb_t;
 
 #define        ZFS_SUPER_MAGIC 0x2fc12fc1
index e98f4bf6a120f32070fba8764c33f52612d514b7..41a1c4d8849d281900a60652da98a147f384325c 100644 (file)
@@ -776,6 +776,9 @@ zfs_sb_create(const char *osname, zfs_sb_t **zsbp)
        rrw_init(&zsb->z_teardown_lock, B_FALSE);
        rw_init(&zsb->z_teardown_inactive_lock, NULL, RW_DEFAULT, NULL);
        rw_init(&zsb->z_fuid_lock, NULL, RW_DEFAULT, NULL);
+
+       zsb->z_hold_mtx = vmem_zalloc(sizeof (kmutex_t) * ZFS_OBJ_MTX_SZ,
+           KM_SLEEP);
        for (i = 0; i != ZFS_OBJ_MTX_SZ; i++)
                mutex_init(&zsb->z_hold_mtx[i], NULL, MUTEX_DEFAULT, NULL);
 
@@ -789,6 +792,8 @@ zfs_sb_create(const char *osname, zfs_sb_t **zsbp)
 out:
        dmu_objset_disown(os, zsb);
        *zsbp = NULL;
+
+       vmem_free(zsb->z_hold_mtx, sizeof (kmutex_t) * ZFS_OBJ_MTX_SZ);
        kmem_free(zsb, sizeof (zfs_sb_t));
        return (error);
 }
@@ -892,6 +897,7 @@ zfs_sb_free(zfs_sb_t *zsb)
        rw_destroy(&zsb->z_fuid_lock);
        for (i = 0; i != ZFS_OBJ_MTX_SZ; i++)
                mutex_destroy(&zsb->z_hold_mtx[i]);
+       vmem_free(zsb->z_hold_mtx, sizeof (kmutex_t) * ZFS_OBJ_MTX_SZ);
        mutex_destroy(&zsb->z_ctldir_lock);
        avl_destroy(&zsb->z_ctldir_snaps);
        kmem_free(zsb, sizeof (zfs_sb_t));
index 3a7c30db2cfa58112158391bed98b53208da302d..a96ac8338f47ef62d757a08525bead267162ea6b 100644 (file)
@@ -1731,6 +1731,8 @@ zfs_create_fs(objset_t *os, cred_t *cr, nvlist_t *zplprops, dmu_tx_t *tx)
        list_create(&zsb->z_all_znodes, sizeof (znode_t),
            offsetof(znode_t, z_link_node));
 
+       zsb->z_hold_mtx = vmem_zalloc(sizeof (kmutex_t) * ZFS_OBJ_MTX_SZ,
+           KM_SLEEP);
        for (i = 0; i != ZFS_OBJ_MTX_SZ; i++)
                mutex_init(&zsb->z_hold_mtx[i], NULL, MUTEX_DEFAULT, NULL);
 
@@ -1755,6 +1757,7 @@ zfs_create_fs(objset_t *os, cred_t *cr, nvlist_t *zplprops, dmu_tx_t *tx)
        for (i = 0; i != ZFS_OBJ_MTX_SZ; i++)
                mutex_destroy(&zsb->z_hold_mtx[i]);
 
+       vmem_free(zsb->z_hold_mtx, sizeof (kmutex_t) * ZFS_OBJ_MTX_SZ);
        kmem_free(sb, sizeof (struct super_block));
        kmem_free(zsb, sizeof (zfs_sb_t));
 }