mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 02:27:36 +03:00
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 <behlendorf1@llnl.gov> Closes zfsonlinux/spl#174
This commit is contained in:
@@ -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",
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user