mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2025-10-24 08:55:00 +03:00
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 |
||
|---|---|---|
| .. | ||
| checksum | ||
| file | ||
| linux_dos_attributes | ||
| .gitignore | ||
| badsend.c | ||
| btree_test.c | ||
| chg_usr_exec.c | ||
| cp_files.c | ||
| ctime.c | ||
| devname2devid.c | ||
| dir_rd_update.c | ||
| dosmode_readonly_write.c | ||
| draid.c | ||
| ereports.c | ||
| get_diff.c | ||
| getversion.c | ||
| libzfs_input_check.c | ||
| Makefile.am | ||
| mkbusy.c | ||
| mkfile.c | ||
| mkfiles.c | ||
| mktree.c | ||
| mmap_exec.c | ||
| mmap_libaio.c | ||
| mmap_seek.c | ||
| mmap_sync.c | ||
| mmapwrite.c | ||
| nvlist_to_lua.c | ||
| readmmap.c | ||
| rename_dir.c | ||
| rm_lnkcnt_zero_file.c | ||
| send_doall.c | ||
| stride_dd.c | ||
| suid_write_to_file.c | ||
| threadsappend.c | ||
| truncate_test.c | ||
| user_ns_exec.c | ||
| xattrtest.c | ||
| zed_fd_spill-zedlet.c | ||
| zfs_diff-socket.c | ||