From 31f2b5abdf95d8426d8bfd66ca7f62ec70215e3c Mon Sep 17 00:00:00 2001 From: Brian Behlendorf Date: Thu, 13 Dec 2012 12:21:11 -0800 Subject: [PATCH] Remove TSD zfs_fsyncer_key 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 Closes zfsonlinux/spl#174 --- include/sys/zfs_vfsops.h | 2 -- module/zfs/zfs_ioctl.c | 3 --- module/zfs/zfs_log.c | 8 +------- module/zfs/zfs_vnops.c | 4 ---- 4 files changed, 1 insertion(+), 16 deletions(-) diff --git a/include/sys/zfs_vfsops.h b/include/sys/zfs_vfsops.h index 4dd46710f..5b11c9312 100644 --- a/include/sys/zfs_vfsops.h +++ b/include/sys/zfs_vfsops.h @@ -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, diff --git a/module/zfs/zfs_ioctl.c b/module/zfs/zfs_ioctl.c index c609203ea..d8e823427 100644 --- a/module/zfs/zfs_ioctl.c +++ b/module/zfs/zfs_ioctl.c @@ -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", diff --git a/module/zfs/zfs_log.c b/module/zfs/zfs_log.c index cbd6f1cb4..4f144d553 100644 --- a/module/zfs/zfs_log.c +++ b/module/zfs/zfs_log.c @@ -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); diff --git a/module/zfs/zfs_vnops.c b/module/zfs/zfs_vnops.c index 8ec4db26f..38f04e5c2 100644 --- a/module/zfs/zfs_vnops.c +++ b/module/zfs/zfs_vnops.c @@ -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);