]> granicus.if.org Git - spl/commit
Ensure kmem_alloc() and vmem_alloc() never fail
authorBrian Behlendorf <behlendorf1@llnl.gov>
Mon, 26 Jul 2010 22:47:55 +0000 (15:47 -0700)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Mon, 26 Jul 2010 22:47:55 +0000 (15:47 -0700)
commit10129680f860168a61932f0011d9ab864286bfcd
tree79a278f1cd24a45b2fac7f96b6a3e3085e0255e6
parent849c50e7f2487dd3f1dce1417e51dff3a12338d6
Ensure kmem_alloc() and vmem_alloc() never fail

The Solaris semantics for kmem_alloc() and vmem_alloc() are that they
must never fail when called with KM_SLEEP.  They may only fail if
called with KM_NOSLEEP otherwise they must block until memory is
available.  This is quite different from how the Linux memory
allocators work, under Linux a memory allocation failure is always
possible and must be dealt with.

At one point in the past the kmem code did properly implement this
behavior, however as the code evolved this behavior was overlooked
in places.  This patch goes through all three implementations of
the kmem/vmem allocation functions and ensures that they will all
block in the KM_SLEEP case when memory is not available.  They
may still fail in the KM_NOSLEEP case in which case the caller
is responsible for handling the failure.

Special care is taken in vmalloc_nofail() to avoid thrashing the
system on the virtual address space spin lock.  The down side of
course is if you do see a failure here, which is unlikely for
64-bit systems, your allocation will delay for an entire second.
Still this is preferable to locking up your system and it is the
best we can do given the constraints.

Additionally, the code was cleaned up to be much more readable
and comments were added to describe the various kmem-debug-*
configure options.  The default configure options remain:
"--enable-debug-kmem --disable-debug-kmem-tracking"
include/sys/kmem.h
module/spl/spl-kmem.c