mirror_zfs/module/os/freebsd/zfs
Alexander Motin f7de776da2
Fix ARC ghost states eviction accounting
arc_evict_hdr() returns number of evicted bytes in scope of specific
state.  For ghost states it does not mean the amount of really freed
memory, but the logical buffer size.  It is correct for the eviction
process, but not for waking up threads waiting for ARC size reduction,
as added in "Revise ARC shrinker algorithm" commit, causing premature
wakeups while ARC is still overflowed, allowing even bigger overflow,
plus processing overhead when next allocation will also get blocked,
probably also for too short time.

To fix that make arc_evict_hdr() also return the amount of really
freed memory, which for the ghost states is only the header, and use
it to update arc_evict_count instead.  Originally I was thinking to
not return it at all, since arc_get_data_impl() does not account for
the headers, but decided that some slow allocation progress is better
than long waits, reaching on my tests up to 100ms.

To reduce negative latency effects of long time periods when reclaim
thread can free little real memory, start reclamation process earlier,
before we actually reached the overflow threshold, when we have to
throttle new allocations.  We can also do it without taking global
arc_evict_lock, reducing the contention.

Reviewed-by: George Wilson <gwilson@delphix.com>
Reviewed-by: Allan Jude <allan@klarasystems.com>
Reviewed-by: Ryan Moeller <ryan@iXsystems.com>
Signed-off-by: Alexander Motin <mav@FreeBSD.org>
Sponsored-By: iXsystems, Inc.
Closes #12279
2021-07-13 09:41:59 -06:00
..
abd_os.c FreeBSD: Hardcode abd_chunk_size to PAGE_SIZE 2021-07-06 17:39:23 -07:00
arc_os.c Fix ARC ghost states eviction accounting 2021-07-13 09:41:59 -06:00
crypto_os.c FreeBSD: Retry OCF ENOMEM errors. 2021-05-24 14:42:45 -06:00
dmu_os.c FreeBSD: Clean up ASSERT/VERIFY use in module 2021-04-30 16:36:10 -07:00
hkdf.c Add FreeBSD support to OpenZFS 2020-04-14 11:36:28 -07:00
kmod_core.c Move zfsdev_state_{init,destroy} to common code 2021-04-08 21:17:43 -07:00
spa_os.c FreeBSD: Clean up ASSERT/VERIFY use in module 2021-04-30 16:36:10 -07:00
sysctl_os.c Reference_tracking_enable should be a module param 2021-03-16 14:56:17 -07:00
vdev_file.c FreeBSD: Clean up ASSERT/VERIFY use in module 2021-04-30 16:36:10 -07:00
vdev_geom.c FreeBSD: Use unmapped I/O for scattered/gang ABD buffers 2021-07-07 16:39:00 -07:00
vdev_label_os.c FreeBSD: Clean up ASSERT/VERIFY use in module 2021-04-30 16:36:10 -07:00
zfs_acl.c FreeBSD: Remove !FreeBSD ifdef'd code 2021-05-07 15:13:44 -07:00
zfs_ctldir.c FreeBSD: Clean up ASSERT/VERIFY use in module 2021-04-30 16:36:10 -07:00
zfs_debug.c Annotated dprintf as printf-like 2021-06-22 21:53:45 -07:00
zfs_dir.c Clean up use of zfs_log_create in zfs_dir 2021-05-07 15:13:10 -07:00
zfs_file_os.c file reference counts can get corrupted 2021-07-10 19:00:37 -06:00
zfs_ioctl_compat.c FreeBSD: Fix legacy compat for platform IOCs 2020-09-30 13:25:50 -07:00
zfs_ioctl_os.c libzfs: On FreeBSD, use MNT_NOWAIT with getfsstat 2021-06-08 07:36:43 -06:00
zfs_racct.c Restore FreeBSD resource usage accounting 2021-02-19 22:34:33 -08:00
zfs_vfsops.c Annotated dprintf as printf-like 2021-06-22 21:53:45 -07:00
zfs_vnops_os.c FreeBSD: Implement xattr=sa 2021-05-13 15:14:12 -07:00
zfs_znode.c FreeBSD: Implement xattr=sa 2021-05-13 15:14:12 -07:00
zio_crypt.c Revert "Fix raw sends on encrypted datasets when copying back snapshots" 2021-05-13 10:00:17 -07:00
zvol_os.c FreeBSD: Update dataset_kstats for zvols in dev mode 2021-05-26 12:14:26 -06:00