mirror_zfs/module/zfs
Mark Johnston 6e2a59181e
Avoid memory allocations in the ARC eviction thread
When the eviction thread goes to shrink an ARC state, it allocates a set
of marker buffers used to hold its place in the state's sublists.

This can be problematic in low memory conditions, since
1) the allocation can be substantial, as we allocate NCPU markers;
2) on at least FreeBSD, page reclamation can block in
   arc_wait_for_eviction()

In particular, in stress tests it's possible to hit a deadlock on
FreeBSD when the number of free pages is very low, wherein the system is
waiting for the page daemon to reclaim memory, the page daemon is
waiting for the ARC eviction thread to finish, and the ARC eviction
thread is blocked waiting for more memory.

Try to reduce the likelihood of such deadlocks by pre-allocating markers
for the eviction thread at ARC initialization time.  When evicting
buffers from an ARC state, check to see if the current thread is the ARC
eviction thread, and use the pre-allocated markers for that purpose
rather than dynamically allocating them.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Alexander Motin <mav@FreeBSD.org>
Reviewed-by: George Amanakis <gamanakis@gmail.com>
Signed-off-by: Mark Johnston <markj@FreeBSD.org>
Closes #12985
2022-01-21 10:28:13 -08:00
..
abd.c module: zfs: fix unused, remove argsused 2021-12-23 09:42:47 -08:00
aggsum.c More aggsum optimizations 2021-06-07 09:02:47 -07:00
arc.c Avoid memory allocations in the ARC eviction thread 2022-01-21 10:28:13 -08:00
blkptr.c Add zstd support to zfs 2020-08-20 10:30:06 -07:00
bplist.c Fast Clone Deletion 2019-07-26 10:54:14 -07:00
bpobj.c module: zfs: fix unused, remove argsused 2021-12-23 09:42:47 -08:00
bptree.c module: zfs: fix unused, remove argsused 2021-12-23 09:42:47 -08:00
bqueue.c Implement Redacted Send/Receive 2019-06-19 09:48:12 -07:00
btree.c Fix typo in btree.c 2020-08-17 15:25:37 -07:00
dataset_kstats.c Introduce write-mostly sums 2021-05-27 14:27:29 -06:00
dbuf_stats.c Eliminate gratuitous bzeroing in dbuf_stats_hash_table_data 2020-09-30 13:24:38 -07:00
dbuf.c module/*.ko: prune .data, global .rodata 2022-01-14 15:37:55 -08:00
ddt_zap.c module/*.ko: prune .data, global .rodata 2022-01-14 15:37:55 -08:00
ddt.c Remove NOTE(CONSTCOND) and note.h 2021-07-26 12:07:53 -07:00
dmu_diff.c module: zfs: fix unused, remove argsused 2021-12-23 09:42:47 -08:00
dmu_object.c Introduce CPU_SEQID_UNSTABLE 2020-11-02 11:51:12 -08:00
dmu_objset.c module/*.ko: prune .data, global .rodata 2022-01-14 15:37:55 -08:00
dmu_recv.c module/*.ko: prune .data, global .rodata 2022-01-14 15:37:55 -08:00
dmu_redact.c module/*.ko: prune .data, global .rodata 2022-01-14 15:37:55 -08:00
dmu_send.c module/*.ko: prune .data, global .rodata 2022-01-14 15:37:55 -08:00
dmu_traverse.c module/*.ko: prune .data, global .rodata 2022-01-14 15:37:55 -08:00
dmu_tx.c module/*.ko: prune .data, global .rodata 2022-01-14 15:37:55 -08:00
dmu_zfetch.c module/*.ko: prune .data, global .rodata 2022-01-14 15:37:55 -08:00
dmu.c module/*.ko: prune .data, global .rodata 2022-01-14 15:37:55 -08:00
dnode_sync.c Annotated dprintf as printf-like 2021-06-22 21:53:45 -07:00
dnode.c module: zfs: fix unused, remove argsused 2021-12-23 09:42:47 -08:00
dsl_bookmark.c module: zfs: fix unused, remove argsused 2021-12-23 09:42:47 -08:00
dsl_crypt.c Revert "Fix raw sends on encrypted datasets when copying back snapshots" 2021-05-13 10:00:17 -07:00
dsl_dataset.c module/*.ko: prune .data, global .rodata 2022-01-14 15:37:55 -08:00
dsl_deadlist.c Livelist logic should handle dedup blkptrs 2021-06-07 13:09:07 -06:00
dsl_deleg.c Reduce loaded range tree memory usage 2019-10-09 10:36:03 -07:00
dsl_destroy.c module: zfs: fix unused, remove argsused 2021-12-23 09:42:47 -08:00
dsl_dir.c module: zfs: fix unused, remove argsused 2021-12-23 09:42:47 -08:00
dsl_pool.c module/*.ko: prune .data, global .rodata 2022-01-14 15:37:55 -08:00
dsl_prop.c module: zfs: fix unused, remove argsused 2021-12-23 09:42:47 -08:00
dsl_scan.c module/*.ko: prune .data, global .rodata 2022-01-14 15:37:55 -08:00
dsl_synctask.c module: zfs: fix unused, remove argsused 2021-12-23 09:42:47 -08:00
dsl_userhold.c Replace sprintf()->snprintf() and strcpy()->strlcpy() 2020-06-07 11:42:12 -07:00
edonr_zfs.c Add include files for prototypes 2020-06-18 12:21:25 -07:00
fm.c module/*.ko: prune .data, global .rodata 2022-01-14 15:37:55 -08:00
gzip.c module: zfs: fix unused, remove argsused 2021-12-23 09:42:47 -08:00
hkdf.c Encryption patch follow-up 2017-10-11 16:54:48 -04:00
lz4_zfs.c Updated the lz4 decompressor 2022-01-07 10:36:49 -08:00
lz4.c lz4: Cherrypick fix for CVE-2021-3520 2022-01-12 16:14:36 -08:00
lzjb.c module: zfs: fix unused, remove argsused 2021-12-23 09:42:47 -08:00
Makefile.in Updated the lz4 decompressor 2022-01-07 10:36:49 -08:00
metaslab.c module/*.ko: prune .data, global .rodata 2022-01-14 15:37:55 -08:00
mmp.c module/*.ko: prune .data, global .rodata 2022-01-14 15:37:55 -08:00
multilist.c module: zfs: multilist: shim out multilist_d2l() 2021-12-23 09:36:45 -08:00
objlist.c Implement Redacted Send/Receive 2019-06-19 09:48:12 -07:00
pathname.c Replace ZFS on Linux references with OpenZFS 2020-10-08 20:10:13 -07:00
range_tree.c module/*.ko: prune .data, global .rodata 2022-01-14 15:37:55 -08:00
refcount.c module/*.ko: prune .data, global .rodata 2022-01-14 15:37:55 -08:00
rrwlock.c Rename refcount.h to zfs_refcount.h 2020-07-29 16:35:33 -07:00
sa.c module/*.ko: prune .data, global .rodata 2022-01-14 15:37:55 -08:00
sha256.c module: zfs: fix unused, remove argsused 2021-12-23 09:42:47 -08:00
skein_zfs.c Add include files for prototypes 2020-06-18 12:21:25 -07:00
spa_boot.c Add include files for prototypes 2020-06-18 12:21:25 -07:00
spa_checkpoint.c module/*.ko: prune .data, global .rodata 2022-01-14 15:37:55 -08:00
spa_config.c module/*.ko: prune .data, global .rodata 2022-01-14 15:37:55 -08:00
spa_errlog.c module: zfs: fix unused, remove argsused 2021-12-23 09:42:47 -08:00
spa_history.c Annotated dprintf as printf-like 2021-06-22 21:53:45 -07:00
spa_log_spacemap.c module/*.ko: prune .data, global .rodata 2022-01-14 15:37:55 -08:00
spa_misc.c module/*.ko: prune .data, global .rodata 2022-01-14 15:37:55 -08:00
spa_stats.c module/*.ko: prune .data, global .rodata 2022-01-14 15:37:55 -08:00
spa.c module/*.ko: prune .data, global .rodata 2022-01-14 15:37:55 -08:00
space_map.c Annotated dprintf as printf-like 2021-06-22 21:53:45 -07:00
space_reftree.c Reduce loaded range tree memory usage 2019-10-09 10:36:03 -07:00
THIRDPARTYLICENSE.cityhash OpenZFS 8484 - Implement aggregate sum and use for arc counters 2018-06-06 09:35:59 -07:00
THIRDPARTYLICENSE.cityhash.descrip OpenZFS 8484 - Implement aggregate sum and use for arc counters 2018-06-06 09:35:59 -07:00
txg.c Optimize txg_kick() process (#12274) 2021-07-01 09:20:27 -06:00
uberblock.c MMP interval and fail_intervals in uberblock 2019-03-21 12:47:57 -07:00
unique.c Reduce loaded range tree memory usage 2019-10-09 10:36:03 -07:00
vdev_cache.c module/*.ko: prune .data, global .rodata 2022-01-14 15:37:55 -08:00
vdev_draid_rand.c Distributed Spare (dRAID) Feature 2020-11-13 13:51:51 -08:00
vdev_draid.c Verify dRAID empty sectors 2022-01-04 16:46:32 -08:00
vdev_indirect_births.c module: zfs: vdev: shim out vdev_indirect_births_verify() 2021-12-23 09:42:29 -08:00
vdev_indirect_mapping.c module: zfs: vdev: shim out vdev_indirect_mapping_verify() 2021-12-23 09:42:41 -08:00
vdev_indirect.c module/*.ko: prune .data, global .rodata 2022-01-14 15:37:55 -08:00
vdev_initialize.c module/*.ko: prune .data, global .rodata 2022-01-14 15:37:55 -08:00
vdev_label.c Add const to nvlist functions to properly expose their real behavior 2021-12-06 18:19:13 -07:00
vdev_mirror.c module/*.ko: prune .data, global .rodata 2022-01-14 15:37:55 -08:00
vdev_missing.c module: zfs: fix unused, remove argsused 2021-12-23 09:42:47 -08:00
vdev_queue.c module/*.ko: prune .data, global .rodata 2022-01-14 15:37:55 -08:00
vdev_raidz_math_aarch64_neon_common.h FreeBSD: fix the build with Clang 11 2020-08-17 15:40:17 -07:00
vdev_raidz_math_aarch64_neon.c Linux 5.0 compat: SIMD compatibility 2019-07-12 09:31:20 -07:00
vdev_raidz_math_aarch64_neonx2.c Linux 5.0 compat: SIMD compatibility 2019-07-12 09:31:20 -07:00
vdev_raidz_math_avx2.c FreeBSD: fix the build with Clang 11 2020-08-17 15:40:17 -07:00
vdev_raidz_math_avx512bw.c Refactor ccompile.h to not include system headers 2020-07-25 20:09:50 -07:00
vdev_raidz_math_avx512f.c FreeBSD: fix the build with Clang 11 2020-08-17 15:40:17 -07:00
vdev_raidz_math_impl.h Distributed Spare (dRAID) Feature 2020-11-13 13:51:51 -08:00
vdev_raidz_math_powerpc_altivec_common.h FreeBSD: fix the build with Clang 11 2020-08-17 15:40:17 -07:00
vdev_raidz_math_powerpc_altivec.c Prefix zfs internal endian checks with _ZFS 2020-07-28 13:02:49 -07:00
vdev_raidz_math_scalar.c Use fallthrough macro 2021-09-14 10:17:54 -06:00
vdev_raidz_math_sse2.c FreeBSD: fix the build with Clang 11 2020-08-17 15:40:17 -07:00
vdev_raidz_math_ssse3.c Refactor ccompile.h to not include system headers 2020-07-25 20:09:50 -07:00
vdev_raidz_math.c module/*.ko: prune .data, global .rodata 2022-01-14 15:37:55 -08:00
vdev_raidz.c Verify dRAID empty sectors 2022-01-04 16:46:32 -08:00
vdev_rebuild.c module/*.ko: prune .data, global .rodata 2022-01-14 15:37:55 -08:00
vdev_removal.c module/*.ko: prune .data, global .rodata 2022-01-14 15:37:55 -08:00
vdev_root.c Distributed Spare (dRAID) Feature 2020-11-13 13:51:51 -08:00
vdev_trim.c module/*.ko: prune .data, global .rodata 2022-01-14 15:37:55 -08:00
vdev.c module/*.ko: prune .data, global .rodata 2022-01-14 15:37:55 -08:00
zap_leaf.c Refactor dnode dirty context from dbuf_dirty 2020-02-26 16:09:17 -08:00
zap_micro.c Annotated dprintf as printf-like 2021-06-22 21:53:45 -07:00
zap.c module/*.ko: prune .data, global .rodata 2022-01-14 15:37:55 -08:00
zcp_get.c module/*.ko: prune .data, global .rodata 2022-01-14 15:37:55 -08:00
zcp_global.c OpenZFS 8600 - ZFS channel programs - snapshot 2018-02-08 15:29:24 -08:00
zcp_iter.c module/*.ko: prune .data, global .rodata 2022-01-14 15:37:55 -08:00
zcp_set.c Support setting user properties in a channel program 2020-02-14 13:41:42 -08:00
zcp_synctask.c module/*.ko: prune .data, global .rodata 2022-01-14 15:37:55 -08:00
zcp.c module/*.ko: prune .data, global .rodata 2022-01-14 15:37:55 -08:00
zfeature.c Throw const on some strings 2020-10-02 17:44:10 -07:00
zfs_byteswap.c Mark functions as static 2020-06-18 12:20:38 -07:00
zfs_fm.c module/*.ko: prune .data, global .rodata 2022-01-14 15:37:55 -08:00
zfs_fuid.c Add const to nvlist functions to properly expose their real behavior 2021-12-06 18:19:13 -07:00
zfs_ioctl.c module/*.ko: prune .data, global .rodata 2022-01-14 15:37:55 -08:00
zfs_log.c module/*.ko: prune .data, global .rodata 2022-01-14 15:37:55 -08:00
zfs_onexit.c file reference counts can get corrupted 2021-07-10 19:00:37 -06:00
zfs_quota.c File incorrectly zeroed when receiving incremental stream that toggles -L 2020-06-09 10:41:01 -07:00
zfs_ratelimit.c Change checksum & IO delay ratelimit values 2018-03-04 17:34:51 -08:00
zfs_replay.c module/*.ko: prune .data, global .rodata 2022-01-14 15:37:55 -08:00
zfs_rlock.c Add a "try" operation for range locks 2020-07-06 11:53:31 -07:00
zfs_sa.c module/*.ko: prune .data, global .rodata 2022-01-14 15:37:55 -08:00
zfs_vnops.c Fix lseek(SEEK_DATA/SEEK_HOLE) mmap consistency 2021-11-07 14:27:44 -07:00
zil.c module/*.ko: prune .data, global .rodata 2022-01-14 15:37:55 -08:00
zio_checksum.c module: zfs: fix unused, remove argsused 2021-12-23 09:42:47 -08:00
zio_compress.c module: zfs: fix unused, remove argsused 2021-12-23 09:42:47 -08:00
zio_inject.c Optimize small random numbers generation 2021-06-22 17:35:23 -06:00
zio.c module/*.ko: prune .data, global .rodata 2022-01-14 15:37:55 -08:00
zle.c Add include files for prototypes 2020-06-18 12:21:25 -07:00
zrlock.c Remove dead code 2020-06-18 12:21:18 -07:00
zthr.c Avoid memory allocations in the ARC eviction thread 2022-01-21 10:28:13 -08:00
zvol.c module/*.ko: prune .data, global .rodata 2022-01-14 15:37:55 -08:00