]> git.proxmox.com Git - mirror_zfs-debian.git/commitdiff
Remove TSD zfs_fsyncer_key
authorBrian Behlendorf <behlendorf1@llnl.gov>
Thu, 13 Dec 2012 20:21:11 +0000 (12:21 -0800)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Wed, 19 Dec 2012 17:08:01 +0000 (09:08 -0800)
It's my understanding that the zfs_fsyncer_key TSD was added as
a performance omtimization to reduce contention on the zl_lock
from zil_commit().  This issue manifested itself as very long
(100+ms) fsync() system call times for fsync() heavy workloads.

However, under Linux I'm not seeing the same contention that
was originally described.  Therefore, I'm removing this code
in order to ween ourselves off any dependence on TSD.  If the
original performance issue reappears on Linux we can revisit
fixing it without resorting to TSD.

This just leaves one small ZFS TSD consumer.  If it can be
cleanly removed from the code we'll be able to shed the SPL
TSD implementation entirely.

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes zfsonlinux/spl#174

include/sys/zfs_vfsops.h
module/zfs/zfs_ioctl.c
module/zfs/zfs_log.c
module/zfs/zfs_vnops.c

index 4dd46710f72bf20a90d19990c67a4291bde95127..5b11c93128e6bed5dba7c613034a99c6ff81e81e 100644 (file)
@@ -150,8 +150,6 @@ typedef struct zfid_long {
 #define        SHORT_FID_LEN   (sizeof (zfid_short_t) - sizeof (uint16_t))
 #define        LONG_FID_LEN    (sizeof (zfid_long_t) - sizeof (uint16_t))
 
-extern uint_t zfs_fsyncer_key;
-
 extern int zfs_suspend_fs(zfs_sb_t *zsb);
 extern int zfs_resume_fs(zfs_sb_t *zsb, const char *osname);
 extern int zfs_userspace_one(zfs_sb_t *zsb, zfs_userquota_prop_t type,
index c609203ea46d9f08c871daf7db07d21cc5a55f55..d8e823427b79a65b349f9fa94a40ee0870f8b26d 100644 (file)
@@ -5187,7 +5187,6 @@ zfs_detach(void)
        list_destroy(&zfsdev_state_list);
 }
 
-uint_t zfs_fsyncer_key;
 extern uint_t rrw_tsd_key;
 
 #ifdef DEBUG
@@ -5210,7 +5209,6 @@ _init(void)
        if ((error = zfs_attach()) != 0)
                goto out2;
 
-       tsd_create(&zfs_fsyncer_key, NULL);
        tsd_create(&rrw_tsd_key, NULL);
 
        printk(KERN_NOTICE "ZFS: Loaded module v%s-%s%s, "
@@ -5240,7 +5238,6 @@ _fini(void)
        zfs_fini();
        spa_fini();
 
-       tsd_destroy(&zfs_fsyncer_key);
        tsd_destroy(&rrw_tsd_key);
 
        printk(KERN_NOTICE "ZFS: Unloaded module v%s-%s%s\n",
index cbd6f1cb41a6bb518db1d4ea2d3965f27e66fde1..4f144d553eeb8499143d6698cecdf55610f00af1 100644 (file)
@@ -457,7 +457,6 @@ zfs_log_write(zilog_t *zilog, dmu_tx_t *tx, int txtype,
 {
        itx_wr_state_t write_state;
        boolean_t slogging;
-       uintptr_t fsync_cnt;
        ssize_t immediate_write_sz;
 
        if (zil_replaying(zilog, tx) || zp->z_unlinked)
@@ -475,10 +474,6 @@ zfs_log_write(zilog_t *zilog, dmu_tx_t *tx, int txtype,
        else
                write_state = WR_NEED_COPY;
 
-       if ((fsync_cnt = (uintptr_t)tsd_get(zfs_fsyncer_key)) != 0) {
-               (void) tsd_set(zfs_fsyncer_key, (void *)(fsync_cnt - 1));
-       }
-
        while (resid) {
                itx_t *itx;
                lr_write_t *lr;
@@ -514,8 +509,7 @@ zfs_log_write(zilog_t *zilog, dmu_tx_t *tx, int txtype,
 
                itx->itx_private = ZTOZSB(zp);
 
-               if (!(ioflag & (FSYNC | FDSYNC)) && (zp->z_sync_cnt == 0) &&
-                   (fsync_cnt == 0))
+               if (!(ioflag & (FSYNC | FDSYNC)) && (zp->z_sync_cnt == 0))
                        itx->itx_sync = B_FALSE;
 
                zil_itx_assign(zilog, itx, tx);
index 8ec4db26f32e4062669e16808fad16013ba4f0d1..38f04e5c2504eec833137745242ba36501b5eb92 100644 (file)
@@ -2070,16 +2070,12 @@ out:
 }
 EXPORT_SYMBOL(zfs_readdir);
 
-ulong_t zfs_fsync_sync_cnt = 4;
-
 int
 zfs_fsync(struct inode *ip, int syncflag, cred_t *cr)
 {
        znode_t *zp = ITOZ(ip);
        zfs_sb_t *zsb = ITOZSB(ip);
 
-       (void) tsd_set(zfs_fsyncer_key, (void *)zfs_fsync_sync_cnt);
-
        if (zsb->z_os->os_sync != ZFS_SYNC_DISABLED) {
                ZFS_ENTER(zsb);
                ZFS_VERIFY_ZP(zp);