zfs/module/os/freebsd/zfs
Shaan Nobee 9e5a297de6 Speed up WB_SYNC_NONE when a WB_SYNC_ALL occurs simultaneously
Page writebacks with WB_SYNC_NONE can take several seconds to complete
since they wait for the transaction group to close before being
committed. This is usually not a problem since the caller does not
need to wait. However, if we're simultaneously doing a writeback
with WB_SYNC_ALL (e.g via msync), the latter can block for several
seconds (up to zfs_txg_timeout) due to the active WB_SYNC_NONE
writeback since it needs to wait for the transaction to complete
and the PG_writeback bit to be cleared.

This commit deals with 2 cases:

- No page writeback is active. A WB_SYNC_ALL page writeback starts
  and even completes. But when it's about to check if the PG_writeback
  bit has been cleared, another writeback with WB_SYNC_NONE starts.
  The sync page writeback ends up waiting for the non-sync page
  writeback to complete.

- A page writeback with WB_SYNC_NONE is already active when a
  WB_SYNC_ALL writeback starts. The WB_SYNC_ALL writeback ends up
  waiting for the WB_SYNC_NONE writeback.

The fix works by carefully keeping track of active sync/non-sync
writebacks and committing when beneficial.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Shaan Nobee <sniper111@gmail.com>
Closes #12662
Closes #12790
2023-06-05 10:59:02 -07:00
..
abd_os.c Avoid small buffer copying on write 2022-07-26 10:10:37 -07:00
arc_os.c FreeBSD: Remove extra arc_reduce_target_size() call 2023-03-24 12:27:52 -05:00
crypto_os.c FreeBSD: Improve crypto_dispatch() handling 2022-07-26 10:10:37 -07:00
dmu_os.c FreeBSD: Clean up ASSERT/VERIFY use in module 2021-09-14 12:02:23 -07:00
hkdf.c Add FreeBSD support to OpenZFS 2020-04-14 11:36:28 -07:00
kmod_core.c FreeBSD: Remove stray debug printf 2023-01-19 12:50:36 -08:00
spa_os.c FreeBSD: Fix potential boot panic with bad label 2023-01-05 11:00:09 -08:00
sysctl_os.c Turn default_bs and default_ibs into ZFS_MODULE_PARAMs 2023-03-07 13:58:36 -08:00
vdev_file.c module: zfs: fix unused, remove argsused 2022-02-16 17:58:56 -08:00
vdev_geom.c Improve too large physical ashift handling 2022-09-21 13:15:15 -07:00
vdev_label_os.c FreeBSD: Clean up ASSERT/VERIFY use in module 2021-09-14 12:02:23 -07:00
zfs_acl.c Fix ACL checks for NFS kernel server 2022-03-20 21:21:18 -07:00
zfs_ctldir.c FreeBSD: add missing vop_fplookup assignments 2023-05-30 08:53:21 -07:00
zfs_debug.c Annotated dprintf as printf-like 2021-06-24 13:12:36 -07:00
zfs_dir.c FreeBSD: Clean up ASSERT/VERIFY use in module 2021-09-14 12:02:23 -07:00
zfs_file_os.c FreeBSD: handle V_PCATCH 2022-09-28 10:35:13 -07:00
zfs_ioctl_compat.c FreeBSD: Fix out of bounds read in zfs_ioctl_ozfs_to_legacy() 2022-12-01 12:39:43 -08:00
zfs_ioctl_os.c FreeBSD: make zfs_vfs_held() definition consistent with declaration 2023-05-30 08:53:21 -07:00
zfs_racct.c module: zfs: fix unused, remove argsused 2022-02-16 17:58:56 -08:00
zfs_vfsops.c Avoid a null pointer dereference in zfs_mount() on FreeBSD 2023-02-06 10:40:16 -08:00
zfs_vnops_os.c FreeBSD: catch up to 1400068 2022-09-28 10:35:13 -07:00
zfs_znode.c Speed up WB_SYNC_NONE when a WB_SYNC_ALL occurs simultaneously 2023-06-05 10:59:02 -07:00
zio_crypt.c module: zfs: fix unused, remove argsused 2022-02-16 17:58:56 -08:00
zvol_os.c Additional limits on hole reporting 2023-03-29 10:40:49 -07:00