mirror_zfs/module/os/linux/zfs
Matthew Ahrens f8c0d7e1f6
fix abd_nr_pages_off for gang abd
`__vdev_disk_physio()` uses `abd_nr_pages_off()` to allocate a bio with
a sufficient number of iovec's to process this zio (i.e.
`nr_iovecs`/`bi_max_vecs`).  If there are not enough iovec's in the bio,
then additional bio's will be allocated.  However, this is a sub-optimal
code path.  In particular, it requires several abd calls (to
`abd_nr_pages_off()` and `abd_bio_map_off()`) which will have to walk
the constituents of the ABD (the pages or the gang children) because
they are looking for offsets > 0.

For gang ABD's, `abd_nr_pages_off()` returns the number of iovec's
needed for the first constituent, rather than the sum of all
constituents (within the requested range).  This always under-estimates
the required number of iovec's, which causes us to always need several
bio's.  The end result is that `__vdev_disk_physio()` is usually O(n^2)
for gang ABD's (and occasionally O(n^3), when more than 16 bio's are
needed).

This commit fixes `abd_nr_pages_off()`'s handling of gang ABD's, to
correctly determine how many iovec's are needed, by adding up the number
of iovec's for each of the gang children in the requested range.

Reviewed-by: Mark Maybee <mark.maybee@delphix.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Brian Atkinson <batkinson@lanl.gov>
Signed-off-by: Matthew Ahrens <mahrens@delphix.com>
Closes #11536
2021-01-28 09:28:20 -08:00
..
abd_os.c fix abd_nr_pages_off for gang abd 2021-01-28 09:28:20 -08:00
arc_os.c Implement memory and CPU hotplug 2020-12-10 14:09:23 -08:00
Makefile.in Linux 5.10 compat: use iov_iter in uio structure 2020-12-18 08:48:26 -08:00
mmp_os.c Add zfs_multihost_interval tunable handler for FreeBSD 2020-06-23 13:32:42 -07:00
policy.c Share zfs_fsync, zfs_read, zfs_write, et al between Linux and FreeBSD 2020-10-21 14:08:06 -07:00
qat_compress.c Fix QAT allocation failure return value 2020-01-06 11:17:53 -08:00
qat_crypt.c QAT related bug fixes 2019-09-12 13:33:44 -07:00
qat.c QAT related bug fixes 2019-09-12 13:33:44 -07:00
spa_misc_os.c Make spa_history_zone platform-dependent in kernel 2020-03-02 09:43:30 -08:00
trace.c Enable use of DTRACE_PROBE* macros in "spl" module 2019-11-01 13:13:43 -07:00
vdev_disk.c fix abd_nr_pages_off for gang abd 2021-01-28 09:28:20 -08:00
vdev_file.c Distributed Spare (dRAID) Feature 2020-11-13 13:51:51 -08:00
zfs_acl.c Cross-platform acltype 2020-10-13 21:25:48 -07:00
zfs_ctldir.c G/C struct znode -> z_moved 2020-11-10 12:42:47 -08:00
zfs_debug.c FreeBSD: Add support for procfs_list 2020-09-23 16:43:51 -07:00
zfs_dir.c Throw const on some strings 2020-10-02 17:44:10 -07:00
zfs_file_os.c Re-share zfsdev_getminor and zfs_onexit_fd_hold 2020-02-28 14:50:32 -08:00
zfs_ioctl_os.c Make zc_nvlist_src_size limit tunable 2020-08-18 09:33:55 -07:00
zfs_sysfs.c Persistent L2ARC 2020-04-10 10:33:35 -07:00
zfs_uio.c Linux 5.10 compat: restore custom uio_prefaultpages() 2021-01-21 10:43:39 -08:00
zfs_vfsops.c Fix possibly uninitialized 'root_inode' variable warning 2020-12-10 15:23:26 -08:00
zfs_vnops_os.c Fix zrele race in zrele_async that can cause hang 2021-01-27 21:29:58 -08:00
zfs_znode.c G/C struct znode -> z_moved 2020-11-10 12:42:47 -08:00
zio_crypt.c Extending FreeBSD UIO Struct 2021-01-20 21:27:30 -08:00
zpl_ctldir.c Linux: Fix ZFS_ENTER/ZFS_EXIT/ZFS_VERFY_ZP usage 2020-11-14 10:19:00 -08:00
zpl_export.c Eliminate Linux specific inode usage from common code 2019-12-11 11:53:57 -08:00
zpl_file.c Extending FreeBSD UIO Struct 2021-01-20 21:27:30 -08:00
zpl_inode.c Extending FreeBSD UIO Struct 2021-01-20 21:27:30 -08:00
zpl_super.c Linux: Fix ZFS_ENTER/ZFS_EXIT/ZFS_VERFY_ZP usage 2020-11-14 10:19:00 -08:00
zpl_xattr.c Extending FreeBSD UIO Struct 2021-01-20 21:27:30 -08:00
zvol_os.c Extending FreeBSD UIO Struct 2021-01-20 21:27:30 -08:00