freebsd-nq/sys/cddl
Andriy Gapon 42abbab471 zfs: wait in arc_lowmem only if curproc == pageproc
... otherwise the current thread might be holding ARC locks and thus run
into a deadlock.  This happens, for example, when a thread does memory
allocation in the ARC code and runs into KVA shortage.
Also, it really makes the most sense to wait in pageproc, so that the
results of ARC reclamation are seen before the page cache is acted upon.
In other cases where vm_lowmem is invoked, e.g. on KVA space shortage,
the callers perform multiple attempts (up to 8) and wait for rather
long intervals between them (up to 4 seconds), so ARC reclaim results
should become visible even without explicit waiting on the ARC thread.

Note that this is not a critical issue for typical ZFS usages where KVA
space should already be large enough.  On amd64 systems setting KVA size
to twice the physical memory size is known to mitigate KVA fragmentation
issues in practice.

Side note: perhaps vm_lowmem 'how' parameter should be used to
differentiate between causes of the event.

Reported by:	Nikolay Denev <ndenev@gmail.com>
MFC after:	19 days
2012-10-20 10:02:18 +00:00
..
boot/zfs forgotten file from r240346 2012-09-11 08:45:49 +00:00
compat/opensolaris Add TRIM support. 2012-09-23 19:40:58 +00:00
contrib/opensolaris zfs: wait in arc_lowmem only if curproc == pageproc 2012-10-20 10:02:18 +00:00
dev Change UL to ULL since time is 32 bits. 2012-07-17 14:36:40 +00:00